Блог-шпаргалка

Картинка

Docker. Большая шпаргалка. (Пополняемая)

Категория -> linux
Обновлено: 2025-04-02

Я всегда предпочитал работать только с теми сервисами и инструментами, которые чаще всего встречаются в моей практике. В связи с чем docker очень долгое время оставался неизученным. Лишь поверхностные знания рисовали какую-то картину для чего он нужен.

Настал тот день, когда docker понадобился хотя бы для того, чтоб развернуть офисные инструменты для клауда.

Работая в крупной компании, при которой целая академия и умнючий сука и компетентный препод с редким именем Лев, я осилил его курс от 2024 года и для себя набросал шпаргалку, которую оформляю ниже и сразу же подчеркну, что в этом посте будут только команды. Никакого compose тут нет.

Погнали…

Как всегда начинаем с установки используя пакетный менеджер. У меня это emerge

sudo emerge -av app-containers/docker app-containers/docker-cli

По требованиям информационной безопасности, добавим своего пользователя в группу docker

sudo usermod -aG docker username

Ну и стартанём сервис + добавим его в автозапуск

sudo rc-service docker start
sudo rc-update add docker default

Много чего интересного можно увидеть по следующей команде, да и вообще перед стартом работы

docker info

А теперь перейдём непосредственно к командам

Одно из главных правил запуска контейнеров - опции (ключи) необходимо указывать ДО ИМЕНИ ОБРАЗА

docker run имя - запуск контейнера

По правилам хорошего тона, при запуске контейнера, всегда, после двоеточия надо указывать версию имени и через дефис ОСь контейнера, но не в коем случае блять не использовать latest. Для примера возьмём с докерхаба nginx версии 1.27.4, собранный на alpine 3.21
docker run nginx:1.27.4-alpine3.21-slim - это правильное радио

Запустив таким образом контейнер, он займёт терминал и мы нечего не сможем сделать. Для запуска контейнера в фоне, добавим ему ключ -d
docker run -d nginx:1.27.4-alpine3.21-slim

При запуске контейнера, докер присваивает ему имя от балды. Поэтому имя лучше всего присваивать самому.
docker run --name nginx -d nginx:1.27.4-alpine3.21-slim - ещё идеальное радио

Для разового запуска контейнера, чтоб после установки он удалился, добавим ключ --rm
docker run --rm --name nginx -d nginx:1.27.4-alpine3.21-slim

Для доступа к приложению в контейнере на определённом порту, необходимо добавить опцию -p с портом, на который стучимся и через двоеточие - порт приложения. Таким образом порт (пример) 8081, на всех интерфейсах хоста, будет перенаправлять трафик в контейнер на порт (пример) 80
docker run --rm -p 8081:80 --name nginx nginx:1.27.4-alpine3.21-slim

От запущенной команды выше, информационная безопасность может Вас попросту отпиздить. Поэтому, в целях безопасности, необходимо ограничивать IP адресом приложение
docker run --rm -p 127.0.0.1:8081:80 --name nginx nginx:1.27.4-alpine3.21-slim

Чтоб выполнить команду внутри контейнера
docker exec nginx ps

Для того, чтобы поковыряться внутри контейнера
docker exec -ti nginx /bin/sh

Полезно будет дебажить приложение, добавив параметр --entrypoint
docker run --rm -p 127.0.0.1:8081:80 --name nginx -ti --entrypoint /bin/sh nginx:1.27.4-alpine3.21-slim
таким образом мы провалимся в контейнер не запуская ничего

Для того, чтоб после запуска сразу провалиться в контейнер
docker run --rm -ti ubuntu:24.04

Контейнеры

docker ps - список запущенных контейнеров
docker ps -a - список всех контейнеров, включая остановленные
docker run - запуск контейнера
docker run -d - запуск контейнера в фоне
docker run --name имя - присвоить имя контейнеру
docker run --rm - удалить контейнер после его остановки
docker restart id или имя - перезапустить контейнер
docker stop id - остановка контейнера
docker stop $(docker ps -q) - остановка всех запущенных контейнеров
docker inspect id - вся подноготная контейнера в json формате
docker exec имя контейнера команда - выполнить команду внутри контейнера
docker exec -ti имя контейнера /bin/sh - запустить терминал внутри контейнера
docker exec -ti имя контейнера --entrypoint /bin/sh - запустить контейнера без запуска служб
docker rm id - удалить контейнер

Образы

docker image list - список образов
docker image prune -a - удаляет образы, с которыми не связан ни один контейнер

Сеть

Существуют несколько способов организации сети в docker

bridge
Способ по умолчанию
Создается пара veth-адаптеров, один в контейнер, другой в bridge на хосте

none
Никакой сети для контейнера не будет
Рекомендуется просто для вычислительной задачи (транскод видео, обработка картинок) с пробросом в него директории с хоста

host
Контейнер будет использовать сеть хостовой машины не создавая сетевой namespace. При таком варианте производительность будет максимальная

overlay
Сеть (VxLAN) между хостами. Применяется для Swarm

macvlan
Реальный сетевой адаптер между контейнерами

ipvlan
Практически нигде не используется

docker network ls - просмотр существующих сетей
docker network create имя_сети - создаём сеть с именем test1 (по умолчанию bridge)
docker network inspect имя_сети - просмотр подноготной сети
docker run --net имя_сети - запуск контейнера в определённой сети
docker run -p 8081:80 имя образа - доступ к приложению на порту 8081
docker run -p 127.0.0.1:8081:80 имя образа - доступ к приложению на локальном IP и порту 8081

Для примера запустим ubuntu в созданной сети с именем test1 сети
docker run --rm -ti --net test1 ubuntu:24.04

Логи
Располагаются по пути /var/lib/docker/containers/id-контейнера

Во избежание разрастания лога, настроим ротацию, добавим в файл /etc/docker/daemon.json следующий параметры:

"log-opts":{
	"max-size": "50m",
	"max-file": "3"
}

docker logs id - просмотр логов контейнера. Без донастройки логирования выше, лог может со временем стать внушительного размера
docker logs -n50 id-контейнера - последние 50 строк лога