Перейти к основному содержимому

Справочник по Docker


Назначение

CLI, конфигурация и типовые сценарии Docker (DevOps, CI/CD, инфраструктура). Учебный курс: раздел.


Краткое пояснение

Docker — это платформа для создания, запуска и управления контейнеризированными приложениями. Контейнеры изолируют процессы и зависимости, обеспечивая единообразие выполнения в разных средах. Docker использует образы как шаблоны для запуска контейнеров, а также предоставляет инструменты для сетевого взаимодействия, хранения данных, сборки, развёртывания и оркестрации.

Схема клиент → демон → образы и контейнеры на хосте ↔ реестр и таблица для build / pull / run / push — в учебной главе Docker.


Быстрый старт

Первый запуск Docker Desktop, когда не закрывать терминал и как остановить контейнер — Запуск и перезапуск приложений.

ЗадачаКоманда
Образdocker build -t app:tag .
Запускdocker run --rm -p 8080:80 app:tag
Списокdocker ps -a / docker images
Composedocker compose up -d

18 команд на каждый день

Краткий набор для уверенной работы с образами, контейнерами и реестрами. Развёрнутые пояснения и сценарии — в универсальной шпаргалке.

ГруппаКоманды
Образbuild, pull, push, images, rmi, save, load
Контейнерrun, ps, stop, start, restart, kill, rm
Отладкаexec, logs, inspect, cp
Дискsystem prune
  • docker build -t myapp:latest . — собрать образ из Dockerfile; точка в конце — каталог контекста.
  • docker run -d -p 8080:80 nginx — запустить контейнер из готового образа в фоне с пробросом порта.
  • docker pull / docker push — скачать и опубликовать образ в registry.
  • docker ps — кто работает сейчас; docker ps -a — включая упавшие.
  • docker stopdocker rm — штатная остановка и удаление контейнера.
  • docker exec -it <name> sh и docker logs -f <name> — отладка без пересборки.
  • docker system prune — освободить место от остановленных контейнеров и неиспользуемых образов.

Подробные параметры каждой команды — в разделе Команды Docker CLI ниже. Чеклист Dockerfile (официальный образ, multi-stage, .dockerignore, сканирование) — 9 практик в универсальной шпаргалке. Десять готовых Dockerfile с построчным разбором — галерея Lab.


Справочные таблицы

Содержание справочника


Docker — это платформа для создания, запуска и управления контейнеризированными приложениями. Контейнеры изолируют процессы и зависимости, обеспечивая единообразие выполнения в разных средах. Docker использует образы как шаблоны для запуска контейнеров, а также предоставляет инструменты для сетевого взаимодействия, хранения данных, сборки, развёртывания и оркестрации.


Основные понятия

Архитектура Engine

ЧастьНазначение
ClientCLI (docker), скрипты CI; шлёт запросы демону
Daemon (dockerd)Сборка, pull/push, жизненный цикл контейнеров, сети, тома
Images / ContainersШаблоны на диске хоста и запущенные экземпляры
RegistryХранилище образов для обмена между хостами

docker build и docker pull наполняют Images на хосте; docker run создаёт Container из образа; docker push выгружает слои в Registry. Развёрнутая схема — Docker, раздел "Как устроен Docker".


Образ (Image)

Образ — неизменяемый шаблон файловой системы с метаданными, необходимыми для запуска контейнера. Состоит из слоёв, каждый из которых представляет собой изменения относительно предыдущего. Образы хранятся в реестрах (например, Docker Hub) или локально.


Контейнер (Container)

Контейнер — исполняемый экземпляр образа. Имеет собственное пространство имён, PID, сеть, точку монтирования и другие изолированные ресурсы ядра Linux. Контейнер может быть запущен, остановлен, перезапущен, удалён.


Реестр (Registry)

Реестр — хранилище образов. Docker Hub — публичный реестр по умолчанию. Можно использовать частные реестры (например, Harbor, AWS ECR, GitLab Container Registry).


Dockerfile

Файл с инструкциями для сборки образа. Каждая инструкция создаёт новый слой. Поддерживает кэширование слоёв для ускорения повторной сборки.


Volume

Том — механизм постоянного хранения данных вне жизненного цикла контейнера. Поддерживает именованные тома, привязку к директории хоста (bind mount), tmpfs.


Сеть (network)

Сеть — изолированное пространство для взаимодействия контейнеров. Docker поддерживает несколько драйверов сетей — bridge, host, overlay, macvlan, none.


Docker Compose

Инструмент для определения и запуска многоконтейнерных приложений с помощью файла docker-compose.yml. Упрощает управление зависимостями, сетями, томами и переменными окружения. Готовые примеры — Docker Compose — готовые стеки.


Docker Daemon

Фоновый процесс, управляющий контейнерами, образами, сетями и томами. Принимает команды через CLI или REST API.


Docker Client

Клиентская утилита (docker), отправляющая команды демону через Unix-сокет или TCP.


Команды Docker CLI

Управление образами

docker build
docker build

Разбор:

  • Базовая форма: сборка образа из Dockerfile в текущем контексте (.).
  • Без -t образ получит автоматический тег; для CI/CD задавайте имя явно.
  • Демон читает инструкции слой за слоем и кэширует неизменённые шаги.
  • Полный набор флагов (-f, --build-arg, --target) — в списке параметров выше.

Собирает образ из Dockerfile.

Параметры:

  • -t, --tag: задаёт имя и тег образа (myapp:v1)
  • -f, --file: указывает путь к Dockerfile (по умолчанию ./Dockerfile)
  • --build-arg: передаёт аргументы сборки (ARG_NAME=value)
  • --no-cache: отключает использование кэша слоёв
  • --pull: принудительно обновляет базовые образы
  • --target: указывает целевой stage в multi-stage сборке
  • --platform: задаёт целевую архитектуру (linux/amd64, linux/arm64)

Пример:

docker build -t myapp:latest --build-arg ENV=prod .

Разбор:

  • -t myapp:latest — имя репозитория и тег результирующего образа.
  • --build-arg ENV=prod передаёт значение ARG/ENV на этапе сборки (не попадает в runtime без ENV).
  • . — каталог контекста: в него должны входить все файлы для COPY/ADD.
  • При изменении Dockerfile пересобираются только затронутые слои (кэш BuildKit/legacy builder).

docker images
docker images

Разбор:

  • Выводит локальные образы — репозиторий, тег, ID, размер, дата создания.
  • Без флагов скрыты промежуточные (dangling) слои — для них нужен -a.
  • -q удобен в скриптах: только digest/ID образа.
  • --filter отбирает по меткам, имени, "висячим" образам (dangling=true).

Список локальных образов.

Параметры:

  • -a, --all: показывает промежуточные образы
  • -q, --quiet: выводит только ID
  • --filter: фильтрация по критериям (dangling=true, label=env=prod)
  • --format: формат вывода (Go-шаблон)

docker rmi

Удаляет образ.

Параметры:

  • -f, --force: принудительное удаление
  • --no-prune: не удалять родительские образы

docker tag

Присваивает дополнительный тег образу.

Пример:

docker tag myapp:latest registry.example.com/myapp:stable

Разбор:

  • Создаёт дополнительную ссылку (тег) на тот же image ID, не копируя слои.
  • registry.example.com/myapp:stable — полное имя для push в частный реестр.
  • Исходный тег myapp:latest остаётся; можно иметь несколько тегов на один образ.
  • Перед docker push образ должен быть помечен именем целевого registry.

docker push / docker pull

Загрузка и выгрузка образов в/из реестра.

Параметры:

  • --platform: указывает архитектуру при pull (если манифест поддерживает multi-arch)

Управление контейнерами

docker run

Запускает новый контейнер из образа.

Ключевые параметры:

Идентификация и имя

  • --name: задаёт имя контейнера
  • -d, --detach: запуск в фоне
  • --rm: автоматическое удаление после завершения

Сеть

  • --network — указывает сеть (bridge, host, имя пользовательской сети)
  • -p, --publish: проброс портов (host_port:container_port, например 8080:80)
  • -P, --publish-all: публикует все EXPOSE-порты на случайные порты хоста
  • --dns: задаёт DNS-серверы
  • --hostname: задаёт hostname внутри контейнера

Хранилище

  • -v, --volume: монтирует том или директорию (/host/path:/container/path, volume_name:/container/path)
  • --mount: альтернатива -v с более явным синтаксисом (type=bind,source=...,target=...)
  • --tmpfs: монтирует временную файловую систему в RAM

Окружение и переменные

  • -e, --env: задаёт переменную окружения (KEY=value)
  • --env-file: загружает переменные из файла
  • -u, --user: задаёт пользователя внутри контейнера (uid:gid)

Ресурсы

  • --cpus: ограничивает количество CPU (например, 1.5)
  • --memory, -m: ограничивает объём RAM (512m, 2g)
  • --memory-swap: общий лимит RAM + swap
  • --cpu-shares: вес CPU при распределении ресурсов
  • --cpuset-cpus — привязка к конкретным CPU-ядрам (0-3, 1,2)

Безопасность

docker run и хост

-v /:/host, --privileged, монтирование docker.sock на ноутбуке — как root на машине.

Разбор — Опасные скрипты.

  • --privileged: даёт контейнеру расширенные привилегии (доступ ко всем устройствам)
  • --cap-add, --cap-drop: добавляет или удаляет Linux capabilities (NET_ADMIN, SYS_TIME)
  • --security-opt: настройки безопасности (seccomp=profile.json, apparmor=unconfined)
  • --read-only: делает корневую ФС контейнера только для чтения
  • --userns: включает user namespace remapping

Вход и интерактивность

  • -i, --interactive: сохраняет STDIN открытым
  • -t, --tty: выделяет псевдо-TTY
  • --entrypoint: переопределяет точку входа из образа

Жизненный цикл

  • --restart — политика перезапуска (no, on-failure[:max-retries], always, unless-stopped)
  • --stop-timeout: время ожидания graceful shutdown перед SIGKILL (в секундах)
  • --health-cmd: команда для проверки здоровья
  • --health-interval, --health-timeout, --health-retries: параметры healthcheck

Пример:

docker run -d \
--name webapp \
--restart unless-stopped \
-p 80:80 \
-v app_data:/var/www/html \
-e NODE_ENV=production \
--memory=512m \
nginx:alpine

Разбор:

  • -d — контейнер в фоне; --name webapp — фиксированное имя для логов и сети.
  • --restart unless-stopped — автоперезапуск после сбоя или ребута демона (кроме ручного stop).
  • -p 80:80 — проброс порта хоста 80 на порт 80 внутри контейнера.
  • -v app_data:/var/www/html — именованный том для данных вне слоёв образа.
  • -e NODE_ENV=production — переменная окружения процесса в контейнере.
  • --memory=512m — лимит RAM; при превышении возможен OOM kill.
  • nginx:alpine — минимальный образ веб-сервера на Alpine Linux.

docker ps

Список запущенных контейнеров.

Параметры:

  • -a, --all: показывает все (включая остановленные)
  • -q, --quiet: только ID
  • --filter — фильтрация (status=exited, ancestor=nginx, name=web)
  • --format: Go-шаблон вывода

docker stop / docker start / docker restart
docker start

Разбор:

  • Запускает ранее остановленный контейнер с тем же ID и настройками.
  • Не создаёт новый экземпляр — в отличие от docker run.
  • Сохраняются тома, сеть и переменные, заданные при первом run.
  • Для пересоздания с новым образом используйте docker run или Compose.

Управление состоянием контейнера.

  • docker stop отправляет SIGTERM, затем SIGKILL через таймаут
  • docker kill отправляет SIGKILL немедленно (или другой сигнал через -s):
docker kill webapp
docker kill -s SIGTERM webapp

Разбор:

  • docker kill webapp — немедленный SIGKILL (по умолчанию) работающему контейнеру.
  • -s SIGTERM — отправка выбранного сигнала (graceful shutdown, если приложение его обрабатывает).
  • Имя webapp должно совпадать с --name при docker run.
  • Для штатной остановки предпочтительнее docker stop (SIGTERM, затем SIGKILL по таймауту).

docker exec

Выполняет команду внутри работающего контейнера.

Параметры:

  • -i, -t: интерактивный режим
  • -u: пользователь
  • -w: рабочая директория

Пример:

docker exec -it webapp sh

Разбор:

  • -it — интерактивная оболочка с TTY внутри уже запущенного контейнера.
  • webapp — имя или ID контейнера.
  • sh — команда оболочки (в minimal-образах часто нет bash).
  • Не меняет образ и не пересоздаёт контейнер — только выполняет процесс.

docker logs

Просмотр логов контейнера.

Параметры:

  • -f, --follow: потоковый вывод
  • --tail: количество последних строк
  • -t, --timestamps: добавляет временные метки

docker inspect

Подробная информация о контейнере, образе, сети, томе в формате JSON.

Параметры:

  • -f, --format: извлечение конкретного поля (Go-шаблон)

Пример:

docker inspect -f '{{.NetworkSettings.IPAddress}}' webapp

Разбор:

  • -f — Go-шаблон для извлечения поля из JSON docker inspect.
  • &#123;&#123;.NetworkSettings.IPAddress&#125;&#125; — IP в bridge-сети (в user-defined сетях смотрите Networks).
  • Удобно в скриптах без парсинга полного JSON.
  • Контейнер webapp должен существовать и быть в нужной сети.

docker cp

Копирование файлов между хостом и контейнером.

Пример:

docker cp ./config.txt webapp:/app/
docker cp webapp:/app/logs ./logs/

Разбор:

  • Первая строка: копирование с хоста в контейнер (./config.txt/app/).
  • Вторая строка: копирование из контейнера на хост (logs из /app/logs).
  • Пути внутри контейнера указываются после имени: webapp:/path.
  • Работает на запущенном и остановленном контейнере; права — от пользователя демона.

docker update

Динамическое изменение ресурсов работающего контейнера (CPU, memory, restart policy).

Пример:

docker update --memory=1g webapp

Разбор:

  • Изменяет лимиты работающего контейнера без пересоздания.
  • --memory=1g — новый лимит RAM (1 гибибайт).
  • Поддерживаются также --cpus, --cpu-shares, политика --restart.
  • Не все параметры run можно менять динамически (сеть, тома — нет).

Управление томами

docker volume create

Создаёт именованный том.

Параметры:

  • --driver — драйвер тома (local, nfs, aws-ebs)
  • -o, --opt: опции драйвера (type=nfs, device=...)

Пример:

docker volume create db_data

Разбор:

  • Создаёт именованный том db_data с драйвером local по умолчанию.
  • Том переживает удаление контейнера, пока не вызван docker volume rm.
  • Имя используется в -v db_data:/path при docker run.
  • Опции драйвера задаются -o (NFS, cloud plugins и т.д.).

docker volume ls
docker volume ls

Разбор:

  • Список локальных томов — имя, драйвер, точка монтирования на хосте.
  • Показывает тома, не привязанные к контейнеру, как "unused".
  • -q — только имена для скриптов очистки.
  • См. пояснение в тексте раздела выше или ниже.

Список томов.


docker volume inspect
docker volume inspect

Разбор:

  • Выводит JSON с деталями тома — Mountpoint, метки, опции драйвера.
  • Без имени тома команда ожидает аргумент — в справочнике указана базовая форма.
  • Путь Mountpoint на хосте нужен при ручном бэкапе данных.
  • См. пояснение в тексте раздела выше или ниже.

Детали тома (путь на хосте, драйвер, метки).


docker volume rm
docker volume rm

Разбор:

  • Удаляет один или несколько именованных томов.
  • Ошибка, если том подключён к работающему контейнеру (без -f).
  • -f принудительно отключает и удаляет (осторожно с данными).
  • См. пояснение в тексте раздела выше или ниже.

Удаление тома.

Параметры:

  • -f, --force: принудительное удаление

docker volume prune
docker volume prune

Разбор:

  • Удаляет все тома, не используемые ни одним контейнером.
  • Запрашивает подтверждение, если не передан -f.
  • Перед prune убедитесь, что нет нужных "осиротевших" данных.
  • См. пояснение в тексте раздела выше или ниже.

Удаляет все неиспользуемые тома.


Управление сетями

docker network create
docker network create

Разбор:

  • Создаёт пользовательскую сеть (по умолчанию драйвер bridge).
  • Контейнеры в одной сети резолвят друг друга по имени (--name).
  • Без параметров — подсеть и gateway назначает Docker автоматически.
  • См. пояснение в тексте раздела выше или ниже.

Создаёт пользовательскую сеть.

Параметры:

  • --driver — тип сети (bridge, overlay, macvlan)
  • --subnet, --ip-range, --gateway: настройки IP
  • --attachable: разрешает подключение standalone-контейнеров (для overlay)
  • --internal: запрещает исходящий трафик в интернет
  • --opt: опции драйвера

Пример:

docker network create --driver bridge --subnet=172.20.0.0/16 mynet

Разбор:

  • --driver bridge — изолированная L2-сеть на хосте с NAT наружу.
  • --subnet=172.20.0.0/16 — фиксированный диапазон IP для контейнеров.
  • mynet — имя сети для --network mynet в docker run.
  • Не пересекайте subnet с Docker default bridge (172.17.0.0/16) без необходимости.

docker network connect / disconnect
docker network connect

Разбор:

  • Подключает существующий контейнер к дополнительной сети.
  • Синтаксис: docker network connect <сеть> <контейнер>.
  • Контейнер может быть в нескольких сетях одновременно.
  • disconnect — обратная операция без остановки контейнера.

Подключение/отключение контейнера к/от сети.


docker network inspect
docker network inspect

Разбор:

  • JSON — список контейнеров в сети, подсети, gateway, опции драйвера.
  • Показывает IP каждого подключённого контейнера.
  • Нужен для отладки DNS и межконтейнерной связности.
  • См. пояснение в тексте раздела выше или ниже.

Детали сети — подключённые контейнеры, IP-адреса, настройки.


docker network prune
docker network prune

Разбор:

  • Удаляет сети, к которым не подключён ни один контейнер.
  • Системные сети (bridge, host, none) не удаляются.
  • Подтверждение интерактивно, если не указан -f.
  • См. пояснение в тексте раздела выше или ниже.

Удаляет неиспользуемые сети.


Dockerfile

Синтаксис и структура

Dockerfile — текстовый файл с набором инструкций для сборки образа. Каждая инструкция создаёт новый слой в образе. Инструкции выполняются последовательно сверху вниз.

Формат:

ИНСТРУКЦИЯ аргументы

Разбор:

  • Общий шаблон строки Dockerfile: имя инструкции и аргументы через пробел.
  • Каждая инструкция (кроме ARG до первого FROM) создаёт новый слой образа.
  • Регистр инструкций не важен, принято писать заглавными.
  • См. пояснение в тексте раздела выше или ниже.

Основные инструкции

FROM

Задаёт базовый образ. Обязательная первая инструкция (кроме комментариев и ARG до FROM).

Синтаксис:

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

Разбор:

  • FROM — обязательная база образа; первая содержательная инструкция.
  • --platform — целевая OS/архитектура при multi-arch сборке.
  • AS <name> — имя стадии для multi-stage и COPY --from=.
  • <image>[:<tag>] — репозиторий и версия базового слоя.

Примеры:

FROM alpine:3.18
FROM node:20-alpine AS builder
FROM --platform=linux/arm64 ubuntu:22.04

Разбор:

  • alpine:3.18 — минимальный дистрибутив для production-образов.
  • AS builder — именованная стадия для переноса артефактов в финальный образ.
  • --platform=linux/arm64 — сборка под ARM без эмуляции на amd64-хосте (с buildx).
  • Каждый FROM начинает новую стадию с чистой корневой ФС.

ARG

Определяет переменную, доступную только во время сборки. Может иметь значение по умолчанию.

Синтаксис:

ARG <name>[=<default value>]

Разбор:

  • ARG — переменная только на этапе сборки, не в runtime контейнера.
  • <name>[=<default>] — имя и необязательное значение по умолчанию.
  • Переопределяется docker build --build-arg.
  • Объявляйте ARG до FROM, если нужно влиять на выбор базового образа.

Пример:

ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine

Разбор:

  • ARG NODE_VERSION=20 — подставляется в следующую строку FROM node:….
  • Подстановка $&#123;NODE_VERSION&#125; происходит при разборе Dockerfile.
  • Значение не сохраняется в финальном образе без пары ENV.
  • См. пояснение в тексте раздела выше или ниже.

Передача из CLI:

docker build --build-arg NODE_VERSION=18 .

Разбор:

  • --build-arg NODE_VERSION=18 переопределяет default из ARG в Dockerfile.
  • Полезно для матрицы версий в CI без правки файла.
  • . — контекст сборки.
  • См. пояснение в тексте раздела выше или ниже.

⚠️ ARG не сохраняется в образе после сборки. Для переменных среды выполнения используйте ENV.


ENV

Задаёт переменную окружения, доступную во время сборки и выполнения.

Синтаксис:

ENV <key>=<value>
ENV <key> <value>

Разбор:

  • Форма ENV key=value — рекомендуемая для пар ключ-значение.
  • Форма ENV key value — legacy-синтаксис с пробелом.
  • Переменные доступны в последующих RUN и при запуске контейнера.
  • См. пояснение в тексте раздела выше или ниже.

Пример:

ENV NODE_ENV=production
ENV PATH="/app/bin:${PATH}"

Разбор:

  • NODE_ENV=production — типичная метка среды для Node.js-приложений.
  • PATH=…$&#123;PATH&#125; — дополняет PATH бинарниками из /app/bin.
  • Значения ENV видны через docker inspect и docker exec env.
  • См. пояснение в тексте раздела выше или ниже.

LABEL

Добавляет метаданные в формате ключ-значение. Используется для описания автора, версии, лицензии и т.д.

Пример:

LABEL maintainer="dev@example.com"
LABEL version="1.0" description="My Web App"

Разбор:

  • LABEL — метаданные образа (не переменные окружения).
  • Пары ключ=значение или несколько пар в одной инструкции.
  • Используются оркестраторами, политиками и docker inspect.
  • См. пояснение в тексте раздела выше или ниже.

Метки можно просматривать через docker inspect:

docker inspect --format='{{json .Config.Labels}}' myapp

Разбор:

  • --format с шаблоном выводит только .Config.Labels в JSON.
  • Удобно для аудита версии и владельца образа в скриптах.
  • myapp — имя образа или ID.
  • См. пояснение в тексте раздела выше или ниже.

WORKDIR

Задаёт рабочую директорию для всех последующих инструкций (RUN, CMD, COPY, ADD, ENTRYPOINT).

Пример:

WORKDIR /app

Разбор:

  • WORKDIR задаёт текущую директорию для RUN, CMD, COPY, ENTRYPOINT.
  • Относительные пути в инструкциях считаются от WORKDIR.
  • Несуществующий путь создаётся автоматически.
  • См. пояснение в тексте раздела выше или ниже.

Если директория не существует — создаётся автоматически.


COPY

Копирует файлы или директории из контекста сборки в образ.

Синтаксис:

COPY [--chown=<user>:<group>] <src>... <dest>

Разбор:

  • COPY переносит файлы из контекста сборки в образ.
  • --chown=user:group — владелец файлов внутри образа (часто non-root).
  • <src>... <dest> — несколько источников возможны только если dest заканчивается /.
  • См. пояснение в тексте раздела выше или ниже.

Примеры:

COPY package.json ./
COPY src/ /app/src/
COPY --chown=node:node app.js /app/

Разбор:

  • COPY package.json ./ — слой зависимостей отдельно от кода (кэш npm).
  • COPY src/ /app/src/ — рекурсивно каталог в абсолютный путь образа.
  • --chown=node:node — файлы принадлежат пользователю node в образе.
  • См. пояснение в тексте раздела выше или ниже.

Источник должен находиться внутри контекста сборки (обычно текущей директории).


ADD

Аналог COPY, но с дополнительными возможностями:

  • распаковка локальных tar-архивов
  • загрузка файлов по URL

Рекомендация: использовать COPY, если не нужны эти функции. ADD усложняет понимание и отладку.


RUN

Выполняет команду в новом слое на этапе сборки.

Форматы:

  • Shell-формат: RUN apt-get update && apt-get install -y curl
  • Exec-форматRUN ["executable", "param1", "param2"]

Рекомендации:

  • объединять связанные команды в одну строку через && для уменьшения числа слоёв
  • очищать кэш пакетного менеджера в той же строке

Пример:

RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
ca-certificates && \
rm -rf /var/lib/apt/lists/*

Разбор:

  • Одна RUN — один слой; цепочка && уменьшает число слоёв.
  • --no-install-recommends — только обязательные пакеты apt.
  • Удаление /var/lib/apt/lists/* в той же строке уменьшает размер слоя.
  • curl и ca-certificates — типичные зависимости для healthcheck и HTTPS.

EXPOSE

Объявляет порт, который контейнер будет слушать во время выполнения. Не публикует порт на хосте — это лишь документация.

Пример:

EXPOSE 8080

Разбор:

  • EXPOSE 8080 — документирует порт, который слушает приложение.
  • Не открывает порт на хосте; публикация только через -p / Compose ports.
  • Протокол по умолчанию — TCP.
  • См. пояснение в тексте раздела выше или ниже.

Публикация происходит через -p при docker run.


VOLUME

Создаёт точку монтирования для тома. Данные в этой директории не сохраняются в образе.

Пример:

VOLUME /data

Разбор:

  • VOLUME /data — точка для данных вне слоёв образа.
  • При docker run без -v создаётся анонимный том.
  • Данные в volume не попадают в docker commit.
  • См. пояснение в тексте раздела выше или ниже.

USER

Задаёт пользователя для выполнения последующих инструкций и запуска контейнера.

Пример:

RUN adduser --disabled-password --gecos '' appuser
USER appuser

Разбор:

  • adduser создаёт системного пользователя без пароля.
  • USER appuser — последующие инструкции и runtime от non-root.
  • Снижает риск при компрометации контейнера.
  • См. пояснение в тексте раздела выше или ниже.

Рекомендуется не запускать приложения от root.


CMD

Задаёт команду по умолчанию для запуска контейнера. Может быть переопределена при docker run.

Форматы:

  • Shell: CMD npm start
  • Exec (предпочтительно): CMD ["npm", "start"]

Только одна CMD в Dockerfile — последняя имеет эффект.


ENTRYPOINT

Задаёт основную исполняемую команду, которую нельзя переопределить (но можно дополнить через CMD).

Пример:

ENTRYPOINT ["./myapp"]
CMD ["--help"]

Разбор:

  • ENTRYPOINT — фиксированная исполняемая команда контейнера.
  • CMD — аргументы по умолчанию к entrypoint (переопределяются в docker run).
  • Exec-форма [] не вызывает shell — предпочтительна для PID 1.
  • См. пояснение в тексте раздела выше или ниже.

При запуске:

docker run myapp # → ./myapp --help
docker run myapp --version # → ./myapp --version

Разбор:

  • Без аргументов run подставляет CMD из образа: ./myapp --help.
  • Аргументы CLI заменяют CMD, не ENTRYPOINT: ./myapp --version.
  • Полная переопись entrypoint — флаг --entrypoint у docker run.
  • См. пояснение в тексте раздела выше или ниже.

HEALTHCHECK

Определяет команду для проверки работоспособности контейнера.

Синтаксис:

HEALTHCHECK [OPTIONS] CMD command

Разбор:

  • Шаблон синтаксиса HEALTHCHECK с опциями и командой проверки.
  • Статус контейнера — starting, healthy, unhealthy.
  • Оркестраторы могут использовать health для readiness (в Swarm/K8s — свои probes).
  • См. пояснение в тексте раздела выше или ниже.

Опции:

  • --interval=DURATION (по умолчанию 30s)
  • --timeout=DURATION (по умолчанию 30s)
  • --start-period=DURATION (для медленного старта, по умолчанию 0s)
  • --retries=N (по умолчанию 3)

Пример:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1

Разбор:

  • --interval=30s — период между проверками.
  • --timeout=5s — максимальное время выполнения команды проверки.
  • --retries=3 — число неудач подряд до статуса unhealthy.
  • curl -f падает при HTTP ≥400; || exit 1 — ненулевой код для Docker.
  • Синтаксис curl для health-check — утилита curl, curl / fetch — примеры.

STOPSIGNAL

Задаёт сигнал, отправляемый при остановке контейнера (по умолчанию SIGTERM).

Пример:

STOPSIGNAL SIGQUIT

Разбор:

  • STOPSIGNAL SIGQUIT — сигнал при docker stop вместо SIGTERM.
  • Полезно для приложений (nginx, JVM), ожидающих graceful shutdown по SIGQUIT.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

SHELL

Изменяет shell по умолчанию для shell-формата команд.

Пример:

SHELL ["/bin/bash", "-c"]

Разбор:

  • Меняет shell для shell-формы RUN (/bin/sh -c по умолчанию).
  • Exec-форма RUN ["cmd"] не использует SHELL.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Multi-stage сборки

Позволяют использовать несколько FROM в одном Dockerfile. Предыдущие стадии могут использоваться как источники для копирования файлов.

Преимущества:

  • уменьшение размера финального образа
  • разделение этапов сборки и выполнения

Пример (Node.js + production-only):

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]

Разбор:

  • Стадия builder: установка зависимостей (npm ci).
  • Финальная стадия FROM node:20-alpine без dev-инструментов сборки.
  • COPY --from=builder переносит только node_modules, не исходники сборки.
  • USER node — процесс Node не от root.
  • CMD ["node", "server.js"] — exec-форма без оболочки.

BuildKit

Современный движок сборки, включённый по умолчанию в Docker Desktop и новых версиях Docker Engine.

Возможности:

  • параллельная сборка
  • кэширование с учётом зависимостей
  • секреты без записи в образ (--mount=type=secret)
  • экспорт артефактов без создания образа

Включение (если не активирован):

DOCKER_BUILDKIT=1 docker build .

Разбор:

  • DOCKER_BUILDKIT=1 включает BuildKit для этой сборки.
  • Параллельные стадии, улучшенный кэш, mount-секреты.
  • В новых Docker Engine часто включён по умолчанию.
  • См. пояснение в тексте раздела выше или ниже.

Использование секретов:

RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

Разбор:

  • RUN --mount=type=secret монтирует секрет только на время выполнения RUN.
  • Файл в /run/secrets/<id> не попадает в слой образа после сборки.
  • Требует docker build --secret id=…,src=….
  • См. пояснение в тексте раздела выше или ниже.

Запуск:

docker build --secret id=mysecret,src=./secret.txt .

Разбор:

  • --secret id=mysecret,src=./secret.txt передаёт файл в mount BuildKit.
  • id должен совпадать с id= в Dockerfile --mount=type=secret.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Работа с реестрами (Registry)

Авторизация

docker login
docker login registry.example.com

Разбор:

  • docker login — аутентификация в Docker Hub (по умолчанию).
  • Второй вариант — URL частного registry; учётные данные в ~/.docker/config.json.
  • Токены и пароли не должны попадать в образ или git.
  • См. пояснение в тексте раздела выше или ниже.

Учётные данные хранятся в ~/.docker/config.json.


Тегирование и публикация

docker tag myapp:latest registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0

Разбор:

  • Первый tag готовит имя registry/репозиторий:тег для удалённого реестра.
  • docker push загружает слои образа в registry (требует предварительного login).
  • Один image ID может иметь несколько тегов.
  • См. пояснение в тексте раздела выше или ниже.

Pull-политики

  • always: всегда скачивать
  • missing: только если отсутствует локально
  • never: использовать только локальный

По умолчанию — missing.


Multi-arch образы (манифесты)

Создание образа для нескольких архитектур:

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

Разбор:

  • buildx create --use — builder с поддержкой multi-platform.
  • --platform linux/amd64,linux/arm64 — один манифест для двух архитектур.
  • --push публикует в registry без загрузки единственной платформы локально.
  • См. пояснение в тексте раздела выше или ниже.

Требует buildx (входит в Docker Desktop).


Безопасность

Лучшие практики

Сводная таблица с примерами строк Dockerfile — 9 практик.

  • Использовать минимальные базовые образы (alpine, distroless)
  • Не запускать от root
  • Удалять ненужные инструменты (curl, wget, git) из финального образа
  • Сканировать образы на уязвимости (docker scan, Trivy, Clair)
  • Использовать .dockerignore для исключения чувствительных файлов
  • Хранить секреты вне образа — через BuildKit --secret, docker secrets в Swarm или внешние vaults:
docker build --secret id=db_password,src=./secrets/db_pass.txt .
docker secret create db_password ./secrets/db_pass.txt

Разбор:

  • BuildKit --secret — секрет только на время RUN, не в слое образа.
  • docker secret create — API Swarm; секреты монтируются в сервисы Swarm.
  • В Kubernetes аналог — объекты Secret, не docker secret.
  • См. пояснение в тексте раздела выше или ниже.

.dockerignore

Аналог .gitignore. Исключает файлы из контекста сборки.

Пример:

.git
node_modules
.env
*.log
Dockerfile*
README.md

Разбор:

  • Исключения из контекста сборки (не из образа после COPY).
  • .git, node_modules — ускоряют docker build и не утекают в слои.
  • .env — защита секретов от отправки демону.
  • Паттерны как в .gitignore; путь относительно корня контекста.

Docker Compose — Справочник

Файл docker-compose.yml определяет сервисы, сети, тома. Готовые примеры (app + db, WordPress, Prometheus) с построчным разбором — Docker Compose — готовые стеки. После стека мониторинга — PromQL — галерея.


Базовая структура

Код ITЗагрузка примера кода…

Разбор:

  • version: '3.8' — схема файла Compose (в Compose V2 поле опционально).
  • services.web — сервис nginx с пробросом 80:80 и bind-mount ./html.
  • depends_on — порядок создания контейнеров, не готовности БД.
  • db — Postgres с паролем через environment и томом db_data.
  • Секция volumes: объявляет именованный том на уровне проекта.

Ключевые поля сервиса

  • image / build: образ или путь к Dockerfile
  • ports: проброс портов
  • volumes: монтирование томов
  • environment: переменные окружения
  • env_file: загрузка из файла
  • depends_on: порядок запуска (не гарантирует готовность!)
  • restart: политика перезапуска
  • healthcheck: проверка здоровья
  • networks: подключение к сетям
  • deploy: параметры для Swarm (ресурсы, реплики)

Команды

  • docker compose up: запуск
docker compose up

Разбор:

  • Создаёт и запускает сервисы из docker-compose.yml в текущей директории.

  • Без -d логи всех сервисов в foreground (Ctrl+C останавливает).

  • Пересоздаёт контейнеры при изменении конфигурации (зависит от флагов).

  • См. пояснение в тексте раздела выше или ниже.

  • docker compose down: остановка и удаление

docker compose down

Разбор:

  • Останавливает и удаляет контейнеры проекта Compose.

  • Сети проекта удаляются; тома по умолчанию сохраняются.

  • -v дополнительно удаляет именованные тома (осторожно с данными БД).

  • См. пояснение в тексте раздела выше или ниже.

  • docker compose build: пересборка

docker compose build

Разбор:

  • Пересобирает образы сервисов с директивой build: в compose-файле.

  • --no-cache — полная пересборка без кэша слоёв.

  • См. пояснение в тексте раздела выше или ниже.

  • См. пояснение в тексте раздела выше или ниже.

  • docker compose logs -f: просмотр логов

docker compose logs -f

Разбор:

  • -f — потоковый вывод логов всех сервисов (как docker logs -f).
  • Без имени сервиса — агрегированный поток с префиксами.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Конфигурация Docker Daemon

Docker Daemon (dockerd) управляется через файл конфигурации daemon.json, обычно расположенный в /etc/docker/daemon.json (Linux) или настраивается через Docker Desktop (macOS/Windows).


Структура daemon.json

Пример полного файла:

Код ITЗагрузка примера кода…

Разбор:

  • debug / log-level — детализация логов демона dockerd.
  • hosts — сокет и/или TCP API (открытый TCP без TLS — риск безопасности).
  • insecure-registries — HTTP-реестры (только в доверенной сети).
  • registry-mirrors — прокси-кэш при pull с Docker Hub.
  • data-root — каталог образов, контейнеров, томов.
  • exec-opts — например native.cgroupdriver=systemd для совместимости с kubelet.
  • userns-remap — изоляция UID/GID контейнеров от root хоста.
  • live-restore — контейнеры работают при перезапуске демона.

Ключевые параметры

Общие
  • debug: включает отладочный режим
  • log-level — уровень логирования (debug, info, warn, error, fatal)
  • experimental: включает экспериментальные функции

Сетевые настройки
  • hosts: список адресов для прослушивания (Unix-сокет, TCP)
  • insecure-registries: реестры без HTTPS (только для внутренних сетей!)
  • registry-mirrors: зеркала Docker Hub для ускорения загрузки

Хранилище
  • data-root — директория для хранения образов, контейнеров, томов (по умолчанию /var/lib/docker)
  • storage-driver — драйвер хранилища (overlay2, btrfs, zfs, aufs)

Рекомендуется overlay2 на современных ядрах Linux.


Безопасность
  • userns-remap: включает user namespace remapping для изоляции UID/GID
  • icc: межконтейнерная связь (false запрещает все соединения без явной сети)
  • iptables: управление правилами iptables (false отключает автоматическое управление)

Производительность
  • max-concurrent-downloads: максимум одновременных загрузок слоёв (по умолчанию 3)
  • max-concurrent-uploads: максимум одновременных выгрузок (по умолчанию 5)
  • default-shm-size: размер /dev/shm по умолчанию (64m)

Жизненный цикл
  • live-restore: позволяет контейнерам продолжать работу при перезапуске демона
  • shutdown-timeout: время ожидания graceful shutdown перед завершением демона

После изменения daemon.json требуется перезапуск:

sudo systemctl reload docker
sudo systemctl restart docker

Разбор:

  • reload — перечитать конфигурацию без полной остановки (не все опции).
  • restart — полный перезапуск dockerd; краткий downtime контейнеров без live-restore.
  • Требуются права root/systemd на Linux.
  • См. пояснение в тексте раздела выше или ниже.

Rootless Mode

Rootless mode позволяет запускать Docker Daemon без прав root, повышая безопасность.


Преимущества

  • Изоляция от системных привилегий
  • Защита от escape-атак
  • Возможность запуска обычным пользователем

Ограничения

  • Недоступны порты < 1024 без authbind
  • Ограниченная поддержка некоторых драйверов (например, --privileged)
  • Требуется поддержка user namespaces в ядре

Установка

curl -fsSL https://get.docker.com/rootless | sh

Разбор:

  • Официальный скрипт установки Docker Engine в rootless-режиме.
  • Демон и сокет в $HOME, без прав root на хосте.
  • Проверьте поддержку user namespaces в ядре.
  • См. пояснение в тексте раздела выше или ниже.

Переменные окружения:

export PATH=/home/user/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

Разбор:

  • PATH — бинарники rootless Docker (docker, dockerd-rootless).
  • DOCKER_HOST — Unix-сокет пользовательского демона (/run/user/<uid>/docker.sock).
  • Добавьте в ~/.bashrc для постоянной сессии.
  • См. пояснение в тексте раздела выше или ниже.

Конфигурация хранится в ~/.config/docker/.


Docker Contexts

Контекст — это набор настроек для взаимодействия с разными Docker-хостами (локальный, удалённый, Swarm, Kubernetes).


Команды

  • docker context ls: список контекстов
docker context ls

Разбор:

  • Список контекстов — имя, описание, endpoint (локальный/удалённый).

  • * — активный контекст для всех команд CLI.

  • См. пояснение в тексте раздела выше или ниже.

  • См. пояснение в тексте раздела выше или ниже.

  • docker context use <name>: переключение

docker context use <name>

Разбор:

  • Переключает CLI на другой endpoint (удалённый хост, другой socket).

  • <name> — имя из docker context ls.

  • Последующие docker ps, build идут в выбранный демон.

  • См. пояснение в тексте раздела выше или ниже.

  • docker context create: создание нового контекста

Пример создания удалённого контекста:

docker context create remote \
--docker host=tcp://192.168.1.100:2375

Разбор:

  • context create remote — новый именованный контекст.
  • --docker host=tcp://…:2375 — TCP API удалённого демона (нужен TLS в проде).
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

После переключения:

docker context use remote
docker ps # покажет контейнеры на удалённом хосте

Разбор:

  • context use remote — все команды CLI к удалённому хосту.
  • docker ps показывает контейнеры удалённого демона, не локального.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Контексты особенно полезны при работе с несколькими средами — dev, staging, prod.


Плагины

Docker поддерживает расширение функциональности через плагины.


Типы плагинов

  • Network plugins — Calico, Weave, Flannel
  • Volume plugins — Portworx, NetApp, AWS EFS driver
  • Authorization plugins: контроль доступа к API
  • Logging plugins: отправка логов в ELK, Splunk

Управление

  • docker plugin install: установка
  • docker plugin enable / disable: активация/деактивация
docker plugin enable

Разбор:

  • Активирует установленный плагин (volume driver, network и т.д.).

  • Без enable плагин нельзя использовать в docker volume create --driver.

  • См. пояснение в тексте раздела выше или ниже.

  • См. пояснение в тексте раздела выше или ниже.

  • docker plugin rm: удаление

docker plugin rm

Разбор:

  • Удаляет плагин с диска; контейнеры, использующие driver, должны быть остановлены.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Пример:

docker plugin install store/vieux/sshfs
docker volume create --driver vieux/sshfs -o sshcmd=user@host:/path vol

Разбор:

  • plugin install — загрузка volume-плагина sshfs из Docker Hub.
  • --driver vieux/sshfs — том на удалённой ФС по SSH.
  • -o sshcmd=user@host:/path — учётные данные и удалённый путь.
  • См. пояснение в тексте раздела выше или ниже.

Ошибки

Диагностика и устранение неполадок

Частые проблемы и решения

Контейнер сразу завершается

  • Причина: основной процесс завершился
  • Решение — проверить CMD/ENTRYPOINT, использовать docker logs, запустить в интерактивном режиме

Не хватает места на диске

  • Команда: docker system df
docker system df

Разбор:

  • Сводка занятого места — образы, контейнеры, тома, build cache.

  • Первый шаг перед prune при "no space left on device".

  • См. пояснение в тексте раздела выше или ниже.

  • См. пояснение в тексте раздела выше или ниже.

  • Очистка: docker system prune -a --volumes

docker system prune -a --volumes

Разбор:

  • -a — все неиспользуемые образы, не только dangling.
  • --volumes — удаляет неиспользуемые тома.
  • Необратимо для неиспользуемых ресурсов; проверьте docker system df.
  • См. пояснение в тексте раздела выше или ниже.

Порт уже занят

  • Ошибка: port is already allocated
  • Решение: освободить порт или изменить -p mapping

Доступ к сети заблокирован

  • Проверить — iptables, ufw, SELinux/AppArmor
  • Временное решение: --security-opt label=disable

Медленная сборка

  • Причины — отсутствие кэша, большой контекст, медленный интернет
  • Решение: оптимизировать .dockerignore, использовать BuildKit, multi-stage

Полезные команды диагностики

docker info # общая информация о системе
docker stats # использование ресурсов в реальном времени
docker top <container> # процессы внутри контейнера
docker events # поток событий (создание, остановка и т.д.)
journalctl -u docker # логи демона (systemd)

Разбор:

  • docker info — версия, storage driver, cgroup, registry, предупреждения.
  • docker stats — CPU/RAM/сеть по контейнерам в реальном времени.
  • docker top — процессы хоста, соответствующие PID namespace контейнера.
  • docker events — поток событий API (create, die, pull).
  • journalctl -u docker — логи unit systemd для dockerd.

Совместимость

ОбластьПримечание
Версииактуальные LTS/стабильные релизы Docker
Платформыофициальная матрица поддержки вендора
СтандартыRFC, ISO, спецификация API — см. таблицы выше

Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

СправочникиСправочник по Apache Kafka, Справочник по Kubernetes, Справочник по RabbitMQ, Справочник по Roblox, Справочник по GraphQL, Справочник по Unity.