Docker
Шпаргалка по Docker: образы и контейнеры, команды run/ps/exec/logs/build, флаги, Dockerfile, тома, сети и docker compose с примерами.
Docker упаковывает приложение вместе со всеми зависимостями в изолированный контейнер, который одинаково запускается на ноутбуке, сервере и в CI. Эта шпаргалка собирает ключевые понятия, команды, Dockerfile и docker compose с рабочими примерами.
Образы и контейнеры
Образ (image) — это неизменяемый шаблон только для чтения: файловая система плюс метаданные о том, как запускать приложение. Образ состоит из слоёв и обычно собирается из Dockerfile.
Контейнер (container) — это запущенный экземпляр образа. Поверх слоёв образа добавляется тонкий записываемый слой. Из одного образа можно запустить сколько угодно контейнеров; удаление контейнера не трогает образ.
Аналогия: образ — это класс, а контейнер — объект этого класса. Образы хранятся в реестре (Docker Hub, GitLab Registry, приватный registry), откуда их тянут командой docker pull и куда отправляют через docker push.
# Скачать образ и запустить контейнер из него
docker pull nginx:1.27
docker run -d --name web -p 8080:80 nginx:1.27
Основные команды
Запуск и просмотр контейнеров. Команда docker run создаёт контейнер из образа, docker ps показывает запущенные контейнеры (с флагом -a — вообще все).
# Запустить контейнер (если образа нет — Docker скачает его)
docker run hello-world
# Список запущенных контейнеров
docker ps
# Список всех контейнеров, включая остановленные
docker ps -a
Остановка и удаление. Контейнер сначала останавливают, затем удаляют. Образы удаляются отдельной командой.
# Остановить контейнер (по имени или ID)
docker stop web
# Принудительно убить (SIGKILL)
docker kill web
# Удалить остановленный контейнер
docker rm web
# Остановить и удалить одной строкой
docker rm -f web
Работа с образами.
# Список локальных образов
docker images
# Удалить образ
docker rmi nginx:1.27
# Скачать и отправить образ в реестр
docker pull python:3.12-slim
docker push registry.example.com/myapp:1.0
Сборка, логи и вход внутрь. docker build собирает образ из Dockerfile, docker logs показывает вывод процесса, docker exec запускает команду внутри работающего контейнера.
# Собрать образ из текущей папки и дать ему имя
docker build -t myapp:1.0 .
# Назначить образу дополнительный тег
docker tag myapp:1.0 registry.example.com/myapp:latest
# Посмотреть логи (с -f — следить в реальном времени)
docker logs -f web
# Зайти внутрь контейнера в интерактивную оболочку
docker exec -it web bash
Флаги docker run
Поведение контейнера настраивается флагами команды docker run. Самые частые:
- -d — detached, запуск в фоне (без него терминал будет занят выводом контейнера).
- -p хост:контейнер — проброс порта с хоста в контейнер.
- -v источник:цель — монтирование тома или папки хоста.
- -e КЛЮЧ=значение — переменная окружения внутри контейнера.
- --name имя — человекочитаемое имя вместо случайного.
- --rm — удалить контейнер автоматически после остановки.
- --network имя — подключить контейнер к конкретной сети.
- -it — интерактивный режим с псевдотерминалом (для оболочек).
# Полный пример: фон, имя, порт, переменная, том, сеть, авто-удаление
docker run -d \
--name api \
--rm \
-p 8000:8000 \
-e DATABASE_URL=postgres://db/app \
-v $(pwd)/data:/app/data \
--network backend \
myapp:1.0
Dockerfile
Dockerfile — это рецепт сборки образа. Каждая инструкция создаёт новый слой. Основные инструкции:
- FROM — базовый образ, с которого начинается сборка.
- RUN — выполнить команду во время сборки (установка пакетов и т.п.).
- COPY — скопировать файлы из контекста сборки в образ.
- ADD — как COPY, но дополнительно умеет распаковывать архивы и качать по URL (по умолчанию предпочитайте COPY).
- WORKDIR — рабочая директория для последующих инструкций.
- ENV — переменная окружения в образе.
- ARG — переменная, доступная только во время сборки.
- EXPOSE — документирует порт, который слушает приложение.
- CMD — команда по умолчанию при запуске контейнера (легко переопределяется).
- ENTRYPOINT — основная исполняемая команда контейнера; аргументы из CMD передаются ей.
Разница CMD и ENTRYPOINT: ENTRYPOINT задаёт, что запускается, а CMD — аргументы по умолчанию к нему. Если задан только CMD, его можно целиком переопределить в docker run образ другая-команда.
# Базовый образ
FROM python:3.12-slim
# Переменные окружения
ENV PYTHONUNBUFFERED=1 \
APP_HOME=/app
# Аргумент сборки (можно переопределить через --build-arg)
ARG APP_VERSION=1.0
# Рабочая директория
WORKDIR $APP_HOME
# Сначала зависимости — для кеширования слоёв
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Затем код приложения
COPY . .
# Документируем порт
EXPOSE 8000
# Что и как запускать
ENTRYPOINT ["gunicorn", "app:app"]
CMD ["--bind", "0.0.0.0:8000", "--workers", "4"]
Сборка и запуск:
docker build -t myapp:1.0 --build-arg APP_VERSION=1.1 .
docker run -d -p 8000:8000 myapp:1.0
.dockerignore
Файл .dockerignore исключает лишнее из контекста сборки: ускоряет сборку и не даёт утечь секретам. Синтаксис похож на .gitignore.
.git
node_modules
__pycache__
*.pyc
.env
*.log
Dockerfile
.dockerignore
Тома и сети
Тома (volumes) сохраняют данные за пределами жизненного цикла контейнера: удалили контейнер — данные остались. Named volume управляется Docker, bind mount привязан к папке хоста.
# Именованный том
docker volume create pgdata
docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:16
# Bind mount: папка хоста внутрь контейнера
docker run -d -v $(pwd)/site:/usr/share/nginx/html nginx
# Управление томами
docker volume ls
docker volume rm pgdata
Сети (networks) позволяют контейнерам общаться по имени. В пользовательской bridge-сети контейнеры находят друг друга по имени контейнера как по hostname.
# Создать сеть и подключить два контейнера
docker network create backend
docker run -d --name db --network backend postgres:16
docker run -d --name api --network backend myapp:1.0
# Внутри api база доступна по хосту db:5432
Docker Compose
docker compose описывает несколько связанных сервисов в одном файле docker-compose.yml и поднимает их одной командой. Удобно для локальной разработки: приложение + база + кеш.
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://app:secret@db:5432/app
depends_on:
- db
volumes:
- ./app:/app
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Основные команды compose:
# Поднять все сервисы в фоне
docker compose up -d
# Пересобрать образы перед запуском
docker compose up -d --build
# Логи всех сервисов (или одного)
docker compose logs -f
docker compose logs -f web
# Выполнить команду в сервисе
docker compose exec web bash
# Остановить и удалить контейнеры, сети
docker compose down
# То же, но удалить и тома
docker compose down -v
Типичные сценарии
Быстро поднять базу для разработки:
docker run -d --name pg \
-e POSTGRES_PASSWORD=secret \
-p 5432:5432 \
-v pgdata:/var/lib/postgresql/data \
postgres:16
Одноразовый запуск утилиты без мусора (контейнер удалится сам):
docker run --rm -v $(pwd):/work -w /work node:22 npm ci
Почистить систему от неиспользуемых ресурсов:
# Удалить остановленные контейнеры, висячие образы и сети
docker system prune
# Агрессивно: ещё и неиспользуемые образы и тома
docker system prune -a --volumes
Шпаргалка частых команд
| Команда | Что делает |
|---|---|
docker run -d -p 8080:80 nginx | Запустить контейнер в фоне с пробросом порта |
docker ps -a | Список всех контейнеров |
docker stop <id> | Остановить контейнер |
docker rm -f <id> | Остановить и удалить контейнер |
docker images | Список локальных образов |
docker rmi <image> | Удалить образ |
docker pull <image> | Скачать образ из реестра |
docker push <image> | Отправить образ в реестр |
docker build -t name . | Собрать образ из Dockerfile |
docker tag a b | Назначить образу новый тег |
docker exec -it <id> bash | Войти в работающий контейнер |
docker logs -f <id> | Смотреть логи контейнера |
docker volume ls | Список томов |
docker network ls | Список сетей |
docker compose up -d | Поднять сервисы из compose в фоне |
docker compose down | Остановить и удалить сервисы compose |
docker system prune -a | Удалить неиспользуемые образы и контейнеры |