Перейти к содержанию

Dockerfile, volumes, сети

Docker для дата-инженера

После установки Docker и знакомства с Portainer пора разобраться в том, как устроены образы, тома и сети. Это фундамент, на котором строятся все DE-пайплайны в контейнерах.

Dockerfile

Dockerfile — текстовый файл с инструкциями для сборки образа.

Docker
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

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

Основные инструкции

Инструкция Что делает
FROM Базовый образ (всегда первая строка)
WORKDIR Рабочая директория внутри контейнера
COPY Копирует файлы с хоста в образ
RUN Выполняет команду при сборке (устанавливает пакеты)
CMD Команда по умолчанию при запуске контейнера
ENTRYPOINT Фиксированная точка входа (CMD дополняет аргументами)
ENV Переменная окружения
EXPOSE Документирует порт (не открывает реально)
ARG Аргумент сборки (доступен только при docker build)

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

Каждая инструкция создаёт слой (layer). Docker кеширует слои — если файл не менялся, слой берётся из кеша.

Оптимизация: сначала зависимости, потом код

Копируй requirements.txt отдельно от остального кода. Так при изменении кода Docker не будет заново устанавливать пакеты.

Multi-stage builds

Позволяют уменьшить размер финального образа:

Docker
# Этап сборки
FROM python:3.11 AS builder
WORKDIR /build
COPY requirements.txt .
RUN pip install --prefix=/install -r requirements.txt

# Финальный образ
FROM python:3.11-slim
COPY --from=builder /install /usr/local
COPY . /app
WORKDIR /app
CMD ["python", "etl_pipeline.py"]

.dockerignore

Файл .dockerignore исключает файлы из контекста сборки:

Text Only
.git
.venv
__pycache__
*.pyc
.env
data/raw/*

Volumes (тома)

Volumes — механизм хранения данных, который переживает удаление контейнера.

Типы монтирования

Тип Синтаксис Когда использовать
Named volume -v pg_data:/var/lib/postgresql/data Продакшн: БД, состояние
Bind mount -v ./data:/app/data Разработка: локальные файлы в контейнере
tmpfs --tmpfs /tmp Временные данные только в памяти

Управление volumes

Bash
# создать
docker volume create pg_data

# список
docker volume ls

# информация
docker volume inspect pg_data

# удалить неиспользуемые
docker volume prune

Данные в контейнере без volume теряются

Всё, что записано внутри контейнера (а не в volume), пропадает при docker rm. Для БД, логов и результатов ETL всегда используй volumes.

Сети (Networks)

Docker-сети позволяют контейнерам общаться друг с другом по имени.

Типы сетей

Тип Описание
bridge По умолчанию. Изолированная сеть на одном хосте
host Контейнер использует сеть хоста напрямую
none Без сети
overlay Для Docker Swarm — связь между хостами

Работа с сетями

Bash
# создать сеть
docker network create etl_net

# запустить контейнер в сети
docker run -d --name postgres --network etl_net postgres:16

# подключить существующий контейнер
docker network connect etl_net airflow-webserver

# контейнеры в одной сети видят друг друга по имени
# из airflow можно подключиться к postgres:5432

Имя контейнера = hostname

В пользовательской сети Docker встроенный DNS разрешает имена контейнеров. Поэтому в connection string пишешь postgres:5432, а не IP-адрес.

Docker Compose

Docker Compose — инструмент для запуска нескольких контейнеров из одного файла docker-compose.yml.

Базовый пример для DE

YAML
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: etl_user
      POSTGRES_PASSWORD: etl_pass
      POSTGRES_DB: warehouse
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U etl_user"]
      interval: 10s
      timeout: 5s
      retries: 5

  jupyter:
    image: jupyter/scipy-notebook:latest
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
    depends_on:
      postgres:
        condition: service_healthy

volumes:
  pg_data:

Ключевые команды

Команда Описание
docker compose up -d Запустить все сервисы в фоне
docker compose down Остановить и удалить контейнеры
docker compose down -v То же + удалить volumes
docker compose logs -f postgres Следить за логами сервиса
docker compose ps Статус сервисов
docker compose exec postgres psql -U etl_user Выполнить команду в контейнере
docker compose build Пересобрать образы
docker compose pull Обновить образы из реестра

depends_on и healthcheck

depends_on управляет порядком запуска. С condition: service_healthy контейнер ждёт, пока зависимость пройдёт healthcheck:

YAML
depends_on:
  postgres:
    condition: service_healthy

Переменные окружения

Compose автоматически подхватывает файл .env рядом с docker-compose.yml:

Text Only
# .env
PG_VERSION=16-alpine
PG_PASSWORD=secret123
YAML
# docker-compose.yml
services:
  postgres:
    image: postgres:${PG_VERSION}
    environment:
      POSTGRES_PASSWORD: ${PG_PASSWORD}

Полезные команды Docker

Bash
# список запущенных контейнеров
docker ps

# все контейнеры (включая остановленные)
docker ps -a

# логи контейнера
docker logs -f --tail 100 postgres

# зайти внутрь контейнера
docker exec -it postgres bash

# удалить остановленные контейнеры, неиспользуемые образы и сети
docker system prune

# размер Docker на диске
docker system df

Проверь себя

Источники