Dockerfile, volumes, сети
Docker для дата-инженера¶
После установки Docker и знакомства с Portainer пора разобраться в том, как устроены образы, тома и сети. Это фундамент, на котором строятся все DE-пайплайны в контейнерах.
Dockerfile¶
Dockerfile — текстовый файл с инструкциями для сборки образа.
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¶
Позволяют уменьшить размер финального образа:
# Этап сборки
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 исключает файлы из контекста сборки:
Volumes (тома)¶
Volumes — механизм хранения данных, который переживает удаление контейнера.
Типы монтирования¶
| Тип | Синтаксис | Когда использовать |
|---|---|---|
| Named volume | -v pg_data:/var/lib/postgresql/data |
Продакшн: БД, состояние |
| Bind mount | -v ./data:/app/data |
Разработка: локальные файлы в контейнере |
| tmpfs | --tmpfs /tmp |
Временные данные только в памяти |
Управление volumes¶
# создать
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 — связь между хостами |
Работа с сетями¶
# создать сеть
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¶
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:
Переменные окружения¶
Compose автоматически подхватывает файл .env рядом с docker-compose.yml:
# docker-compose.yml
services:
postgres:
image: postgres:${PG_VERSION}
environment:
POSTGRES_PASSWORD: ${PG_PASSWORD}
Полезные команды Docker¶
# список запущенных контейнеров
docker ps
# все контейнеры (включая остановленные)
docker ps -a
# логи контейнера
docker logs -f --tail 100 postgres
# зайти внутрь контейнера
docker exec -it postgres bash
# удалить остановленные контейнеры, неиспользуемые образы и сети
docker system prune
# размер Docker на диске
docker system df
Проверь себя¶
Источники¶
- Dockerfile reference — официальная документация
- Docker Compose reference — спецификация Compose
- Manage data in Docker — volumes и bind mounts