🔖 Справочник: Multistage Dockerfile и Docker Compose
⚡ Самое важное — быстрая шпаргалка
# терминал — Multistage: сборка конкретной стадии
docker build -t myapp:final .
docker build --target builder -t myapp:debug . # только до стадии builder
# терминал — Docker Compose v2
docker compose up -d # запустить фоном
docker compose up --build # пересобрать образы и запустить
docker compose down # остановить и удалить контейнеры/сети
docker compose down -v # + удалить тома
docker compose ps # список сервисов
docker compose logs -f web # логи сервиса web в реальном времени
docker compose exec web bash # открыть shell в контейнере web
Синтаксис Multistage Dockerfile
Именование стадий
# Dockerfile
FROM node:20-alpine AS deps # стадия установки зависимостей
FROM node:20-alpine AS builder # стадия сборки
FROM node:20-alpine AS runner # финальный образ
Копирование из предыдущей стадии
# Dockerfile
# Копировать из именованной стадии
COPY --from=builder /app/dist ./dist
# Копировать из стадии по номеру (0, 1, 2…)
COPY --from=0 /app/bin ./bin
# Копировать из ВНЕШНЕГО образа (не из стадии!)
COPY --from=nginx:latest /etc/nginx/nginx.conf /etc/nginx/nginx.conf
Сборка только до определённой стадии
# терминал
# Собрать только стадию "builder" (удобно для отладки)
docker build --target builder -t myapp:debug .
Полный шаблон двухстадийного Dockerfile
# Dockerfile
# ---- Стадия 1: сборка ----
FROM python:3.12-slim AS builder
WORKDIR /build
RUN apt-get update && apt-get install -y --no-install-recommends build-essential
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
COPY src/ ./src/
# ---- Стадия 2: финальный образ ----
FROM python:3.12-slim
WORKDIR /app
# Копируем только то, что нужно для запуска
COPY --from=builder /root/.local /root/.local
COPY --from=builder /build/src/ ./src/
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["python", "src/main.py"]
Команды Docker Compose v2
Docker Compose v2 вызывается как docker compose (без дефиса). Плагин встроен в Docker Engine и Docker Desktop.
Жизненный цикл приложения
Команда
Действие
docker compose up
Создать и запустить все сервисы (на переднем плане)
docker compose up -d
Запустить в фоновом режиме (detached)
docker compose up --build
Пересобрать образы перед запуском
docker compose down
Остановить и удалить контейнеры, сети
docker compose down -v
+ удалить именованные тома
docker compose build
Только собрать образы (не запускать)
docker compose start
Запустить остановленные контейнеры (не создавать новые)
docker compose stop
Остановить контейнеры, не удаляя
docker compose restart
Перезапустить все (или указанные) сервисы
Мониторинг и отладка
Команда
Действие
docker compose ps
Список всех сервисов и их состояние
docker compose logs
Логи всех сервисов
docker compose logs -f web
Следить за логами сервиса web в реальном времени
docker compose exec web bash
Открыть shell в запущенном контейнере web
docker compose top
Процессы в запущенных контейнерах
Ключи docker-compose.yml
Уровень сервиса
# docker-compose.yml
services:
service-name:
image: nginx:latest # готовый образ
build: ./dir # или собрать из Dockerfile в ./dir
build: # расширенная форма build
context: ./dir
dockerfile: Dockerfile.prod
args:
NODE_ENV: production
ports:
- "8080:80" # хост:контейнер
- "127.0.0.1:3000:3000" # привязать только к localhost
volumes:
- ./data:/app/data # bind mount
- db_data:/var/lib/mysql # именованный том
environment:
- DB_HOST=db # список форма
environment:
DB_HOST: db # словарная форма
env_file:
- .env # загрузить переменные из файла
depends_on:
- db # простая зависимость (только порядок запуска)
depends_on:
db:
condition: service_healthy # ждать healthcheck
restart: always # no | always | on-failure | unless-stopped
command: python app.py # переопределить CMD образа
networks:
- mynet
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
Уровень файла (тома и сети)
# docker-compose.yml
volumes:
db_data: # именованный том (управляет Docker)
uploads:
driver: local # явно указать драйвер
networks:
mynet: # пользовательская bridge-сеть
mynet:
driver: bridge # явно
host_net:
driver: host