Logo Craft Homelab Docs Контакты Telegram
Docker продвинутый — multi-stage, volumes, networks
Sun Nov 30 2025

Docker: продвинутые техники

Поговорим о продвинутых техниках работы с Docker, которые помогут создавать эффективные и безопасные контейнеры для продакшена.

После освоения базовых команд Docker возникает вопрос: как оптимизировать образы, организовать хранение данных и настроить сеть? В этой статье рассмотрим multi-stage сборку, volumes, networks и best practices для production.

Multi-stage Build

Многоэтапная сборка позволяет использовать несколько промежуточных образов, чтобы итоговый образ содержал только необходимые файлы.

Пример для Python-приложения

# Этап 1: сборка
FROM python:3.11-slim as builder

WORKDIR /app

# Установка зависимостей в отдельном слое
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# Этап 2: production образ
FROM python:3.11-slim

WORKDIR /app

# Копируем только зависимости из builder
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH

# Копируем исходный код
COPY . .

# Запуск от непривилегированного пользователя
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser

CMD ["python", "main.py"]

Пример для Node.js

# Сборка
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
USER node
CMD ["node", "dist/main.js"]

Оптимизация размера образов

Используй минимальные базовые образы

# Плохо
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3

# Хорошо
FROM python:3.11-slim  # ~150MB вместо ~800MB

Слои и кеширование

# Плохо: каждый RUN создаёт новый слой
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y git
RUN apt-get clean

# Хорошо: объединяем в один слой
RUN apt-get update && \
    apt-get install -y python3 git && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

.dockerignore

# Игнорируем всё лишнее
node_modules
.git
__pycache__
*.pyc
.env
.env.local
tests/
docs/
*.md
Dockerfile
.dockerignore

Работа с томами (Volumes)

Именованные тома для данных

# Создание именованного тома
docker volume create postgres_data

# Использование в compose
volumes:
  postgres_data:
    external: true  # или создаст автоматически

bind mount для разработки

# docker-compose.yml
services:
  app:
    build: .
    volumes:
      - ./src:/app/src  # синхронизация кода
      - /app/node_modules  # анонимный том

tmpfs для чувствительных данных

services:
  app:
    image: myapp
    tmpfs:
      - /run/secrets:size=10M,mode=700

Networking

Кастомные сети

# docker-compose.yml
services:
  app:
    networks:
      - frontend
      - backend
  
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # изолированная сеть

Alias и DNS

services:
  app:
    networks:
      backend:
        aliases:
          - myapp.local

Docker Compose: продвинутые возможности

Profiles

services:
  app:
    image: myapp
  
  # Запускается только с: docker compose --profile debug up
  debug:
    image: myapp-debug
    profiles:
      - debug
    command: sleep infinity
  
  # Запускается только с: docker compose --profile prod up  
  monitoring:
    image: myapp-monitor
    profiles:
      - prod

Overrides

# docker-compose.yml (базовый)
services:
  app:
    build: .
    ports:
      - "8000:8000"

# docker-compose.override.yml (локальная разработка)
services:
  app:
    volumes:
      - .:/app
    environment:
      - DEBUG=1

Запуск нескольких файлов

docker compose -f docker-compose.yml -f docker-compose.prod.yml up

Секреты (Secrets)

services:
  db:
    image: postgres:15
    secrets:
      - db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

Healthchecks

services:
  app:
    image: myapp
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Лучшие практики для продакшена

  1. Не запускай от root — используй USER
  2. Минимальные образы — python:alpine, node:alpine
  3. Один процесс — один контейнер = один процесс
  4. Логирование — пиши в stdout/stderr
  5. Сигналы — корректная обработка SIGTERM
  6. Healthchecks — проверяй готовность сервиса

Заключение

Продвинутые техники Docker помогают создавать компактные, безопасные и эффективные контейнеры. Multi-stage build, правильное кеширование и работа с сетями — ключ к профессиональной работе с Docker.