Справочник по 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 |
| Compose | docker 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 stop→docker rm— штатная остановка и удаление контейнера.docker exec -it <name> shиdocker logs -f <name>— отладка без пересборки.docker system prune— освободить место от остановленных контейнеров и неиспользуемых образов.
Подробные параметры каждой команды — в разделе Команды Docker CLI ниже. Чеклист Dockerfile (официальный образ, multi-stage, .dockerignore, сканирование) — 9 практик в универсальной шпаргалке. Десять готовых Dockerfile с построчным разбором — галерея Lab.
Справочные таблицы
Содержание справочника
- Основные понятия (в т.ч. архитектура Engine)
- Команды Docker CLI
- Dockerfile
- Работа с реестрами (Registry)
- Безопасность
- Docker Compose — Справочник
- Конфигурация Docker Daemon
- Rootless Mode
- Docker Contexts
- Плагины
Docker — это платформа для создания, запуска и управления контейнеризированными приложениями. Контейнеры изолируют процессы и зависимости, обеспечивая единообразие выполнения в разных средах. Docker использует образы как шаблоны для запуска контейнеров, а также предоставляет инструменты для сетевого взаимодействия, хранения данных, сборки, развёртывания и оркестрации.
Основные понятия
Архитектура Engine
| Часть | Назначение |
|---|---|
| Client | CLI (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)
Безопасность
-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-шаблон для извлечения поля из JSONdocker inspect.{{.NetworkSettings.IPAddress}}— 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 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:….- Подстановка
${NODE_VERSION}происходит при разборе 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=…${PATH}— дополняет 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 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/ Composeports. - Протокол по умолчанию — 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 \
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 /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 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: образ или путь к Dockerfileports: проброс портов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/GIDicc: межконтейнерная связь (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 - Решение: освободить порт или изменить
-pmapping
Доступ к сети заблокирован
- Проверить —
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.