ШПАРГАЛКА

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Удалить неиспользуемые образы и контейнеры
Поддержать проект