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

Картинка

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

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

Я всегда предпочитал работать только с теми сервисами и инструментами, которые чаще всего встречаются в моей практике. В связи с чем 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 - ещё идеальное радио

Для указания контейнеру хостнейма, добавим одноимённый ключ
docker run --name nginx --hostname 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

Для указании диапазона адресов (бита маски) используем ключ --subnet
docker network create --subnet 192.168.10.0/29 test1

Теперь можно указать IP-адрес контейнера ключом--ip. Для примера зупстим alpine
docker run --name frontend --hostname alpine --net test1 --ip 192.168.10.2 --rm -ti alpine:3.21.3

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

Подготовить контейнер к запуску, то есть не запуская его просто создать
docker create --name app --hostname app --net test1 --ip 192.168.10.3 alpine:3.21.3

Для добавления второго сетевого интерфейса в конейнер, командуем следующее
docker network connect --ip 192.168.10.11 test2 app

Чтоб выполнить команду внутри контейнера
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
таким образом мы провалимся в контейнер не запуская ничего

Пример запуска СУБД в контейнере с сетью хост и паролем 123 на debian
docker run --rm --net host --name mysql -d -e MYSQL_ROOT_PASSWORD=123 mysql:8.0.41-bookworm

Пример создания контейнера nginx с редактированием конфига и своей директорией под приложение (сайт).
docker create --name nginx nginx:1.27.4-alpine3.21
docker cp nginx:/etc/nginx /home/{user}/{directory_for_nginx}
Удаляем из скопированного всё, за исключением conf.d и nginx.conf
Редактируем nginx.conf. Для примера изменим параметр worker_processes с auto на 32
Удаляем ранее созданный контейнер docker rm nginx
И теперь запускаем контейнер с прокидыванием (перекрытием) подготовленных директорий
docker run --rm -d -v /home/{user}/{directory_for_nginx}/nginx.conf:/etc/nginx/nginx.conf:ro -v /home/{user}/{directory_for_nginx}/conf.d:/etc/nginx/conf.d --name nginx nginx:1.27.4-alpine3.21

При таком подходе можно редактировать конфиг веб-сервера, либо конфиг приложения не останавливая контейнер! Для того, чтоб проверить внесённые изменения, достаточно ввести docker exec nginx nginx -t и если всё в порядке, то уже тогда дёрнуть docker restart nginx

Проброс директории с БД во внутрь СУБД
docker run --rm --name mysql -d -e MYSQL_ROOT_PASSWORD=123 -v /home/user/mysql:/var/lib/mysql mysql:8.0.41-bookworm

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

Контейнеры

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

Пример создания докер файл

В подготовленной заранее папке создаём файл Dockerfile
Пихаем в него следующее содержимое:

FROM ubuntu:25.04

RUN apt update

RUN apt install -qy traceroute iproute2 iputils-ping

Сохраняем и находясь в той же папке с докер файлом командуем docker build --no-cache .

По команде docker image ls видим, что несколько секунд назад был собран контейнер, без имени и тэга. Исправим это
docker tag id-контейнера имя:версия

Можно указать имя и версию при сборке контейнера
docker build --no-cache -t 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 create --subnet сеть/маска - создаём сеть и указываем диапазон адресов (бит маски)
docker network inspect имя_сети - просмотр подноготной сети
docker run --net имя_сети - запуск контейнера в определённой сети
docker run --net имя_сети --ip адрес - запуск контейнера в определённой сети с фиксированным IP-адресом
docker network rm имя_сети - удаление сети
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 строк лога