Open source за минуты
Почти любой инструмент данных можно запустить в контейнере. Одна команда или один compose.yaml. Ничего не нужно ставить на ноутбук.
Почему контейнеры подходят для данных
Заголовок раздела «Почему контейнеры подходят для данных»- Изоляция. Airflow, dbt и Jupyter требуют разные версии Python и библиотек. В контейнерах они не мешают друг другу.
- Одинаковое окружение. У вас, у коллеги и в CI работает один и тот же образ. Фраза «у меня работает» не нужна.
- Одноразовость. Попробовали инструмент, удалили контейнер. Ноутбук остался чистым.
- Несколько версий рядом.
postgres:15иpostgres:17работают одновременно на разных портах. - Быстрый старт команды. Новый коллега делает
git cloneиdocker compose up. Окружение готово.
Три шаблона
Заголовок раздела «Три шаблона»| Шаблон | Когда | Как |
|---|---|---|
| Разовый инструмент | Запустить команду и забыть | docker run --rm ... |
| Сервис | База, BI, оркестратор. Работает долго | compose.yaml, docker compose up -d |
| Своя задача | Ваш пайплайн или скрипт | Dockerfile и docker build |
Что запускают в Docker
Заголовок раздела «Что запускают в Docker»| Инструмент | Образ | Для чего |
|---|---|---|
| Postgres | postgres:17 | База данных для пайплайнов и тестов |
| Adminer | adminer:5 | Лёгкий веб-клиент для баз |
| Metabase | metabase/metabase:v0.65.4 | BI: графики и дашборды |
| Superset | apache/superset:6.1.0 | BI. Нужна дополнительная настройка |
| Airflow | официальный docker-compose.yaml | Оркестрация пайплайнов |
| dbt | свой образ (ниже) | Трансформации в SQL |
| Jupyter | quay.io/jupyter/scipy-notebook:python-3.12 | Ноутбуки для анализа |
| ClickHouse | clickhouse/clickhouse-server:26.8 | Колоночная база для аналитики |
| Kafka | apache/kafka:4.4.0 | Потоки событий |
| MLflow | ghcr.io/mlflow/mlflow:v3.5.0 | Учёт ML-экспериментов |
Мы проверили, что эти теги существуют (docker manifest inspect). Версии быстро устаревают. Перед работой откройте страницу образа на Docker Hub и выберите свежий тег.
Разовый инструмент: скрипт без Dockerfile
Заголовок раздела «Разовый инструмент: скрипт без Dockerfile»Не нужно ставить Python. Подключите папку и запустите скрипт в готовом образе:
cd ~/docker-practicedocker run --rm -v "$PWD:/work" -w /work \ -e ORDERS_PATH=/work/data/orders.csv \ python:3.12-slim python app/report.pyОтвет:
Файл: /work/data/orders.csvЗаказов: 500Выручка по каналам (только completed): organic 23715.82 ads 23082.74 email 15459.67-v "$PWD:/work"подключает текущую папку в контейнер.-w /workделает/workрабочей папкой.--rmудаляет контейнер после выхода.
Так же запускают DuckDB, jq, psql и любые другие утилиты. Ставить их не нужно.
Сервис: Postgres и Adminer
Заголовок раздела «Сервис: Postgres и Adminer»Подробно compose разобран в уроке про Compose. Пример с пином версии:
services: db: image: postgres:17 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - pgdata:/var/lib/postgresql/data
adminer: image: adminer:5 ports: - "8080:8080"
volumes: pgdata:Всегда пишите версию образа. Не используйте latest: завтра он может стать другим.
Airflow
Заголовок раздела «Airflow»Airflow состоит из нескольких сервисов. Писать их вручную не нужно: у проекта есть готовый docker-compose.yaml. Мы проверили, что ссылка ниже работает. Он из официальной документации и может измениться. Открывайте страницу Airflow про Docker Compose и берите версию оттуда.
mkdir airflow && cd airflowcurl -LfO https://airflow.apache.org/docs/apache-airflow/3.4.0/docker-compose.yamlmkdir -p ./dags ./logs ./plugins ./configecho "AIRFLOW_UID=$(id -u)" > .envdocker compose up airflow-initdocker compose upairflow-initсоздаёт базу и пользователя. Это разовый шаг.- Веб-интерфейс:
http://localhost:8080. Логин и пароль по умолчанию написаны в официальной инструкции. - Свои DAG кладите в папку
dags. - Это окружение для обучения. В продакшене так не запускают: смотрите урок про продакшен.
В файле восемь сервисов. Список мы получили командой docker compose config --services:
postgres redis airflow-init airflow-apiserver airflow-dag-processor airflow-scheduler airflow-triggerer airflow-workerdbt в контейнере
Заголовок раздела «dbt в контейнере»Официальный образ ghcr.io/dbt-labs/dbt-postgres не собран для arm64. На Mac с чипом Apple (M1 и новее) он не запускается:
docker: no matching manifest for linux/arm64/v8 in the manifest list entriesРешение: свой образ из python:3.12-slim. Он работает на любой архитектуре.
FROM python:3.12-slimRUN pip install --no-cache-dir dbt-core==1.12.6 dbt-postgres==1.11.0WORKDIR /projectENTRYPOINT ["dbt"]Версию dbt-core нужно закрепить. Мы поставили только dbt-postgres==1.11.0, и pip взял dbt-core 1.13.0-b1. Это бета-версия.
Сервис в compose.yaml. Он запускается только по просьбе (profiles):
dbt: build: ./dbt profiles: ["tools"] environment: DB_PASSWORD: ${DB_PASSWORD} DBT_PROFILES_DIR: /project volumes: - ./dbt:/project depends_on: db: condition: service_healthyЗапуск:
docker compose run --rm dbt runРезультат на наших данных. Модель revenue_by_channel создала представление в схеме analytics:
1 of 1 OK created sql view model analytics.revenue_by_channel ... [CREATE VIEW in 0.04s]Done. PASS=1 WARN=0 ERROR=0 SKIP=0 NO-OP=0 REUSED=0 TOTAL=1Полный пример со всеми файлами — в уроке Compose для пайплайна.
Стартеры: оркестраторы и ELT
Заголовок раздела «Стартеры: оркестраторы и ELT»Почти у каждого open source проекта есть публичный образ и готовый пример запуска. Это быстрый способ попробовать инструмент. Мы проверили, какие архитектуры у образов (ноябрь 2026).
| Инструмент | Что это | Образ или стартер | Mac с Apple (arm64) |
|---|---|---|---|
| Airflow | Оркестратор | apache/airflow:3.4.0 и официальный docker-compose.yaml (выше) | Да |
| Prefect | Оркестратор на Python | prefecthq/prefect:3-latest | Да |
| Dagster | Оркестратор, ориентирован на данные | Официальный пример deploy_docker | Да |
| Kestra | Оркестратор, потоки в YAML | Официальный docker-compose.yml | Да |
| Mage | Пайплайны в ноутбуке | mageai/mageai, инструкция | Да |
| Meltano | ELT на Singer | meltano/meltano | Да |
| dbt | Трансформации в SQL | ghcr.io/dbt-labs/dbt-core, dbt-postgres, dbt-snowflake, dbt-bigquery | Нет, только amd64. Соберите свой образ |
| Superset | BI | apache/superset:6.1.0, репозиторий | Да |
| Lightdash | BI поверх dbt | lightdash/lightdash | Нет, только amd64 |
| Trino | Запросы к разным источникам | trinodb/trino | Да |
| Spark | Обработка больших данных | apache/spark | Да |
| Redpanda | Kafka-совместимый брокер | redpandadata/redpanda | Да |
| Grafana | Мониторинг и графики | grafana/grafana | Да |
Как читать столбец arm64: если написано «только amd64», на Mac с чипом M образ запустится только через эмуляцию (--platform linux/amd64). Это медленно. Для dbt лучше собрать свой образ.
Пример: Prefect за минуту
Заголовок раздела «Пример: Prefect за минуту»Мы запустили этот пример. Сервер Prefect с веб-интерфейсом:
docker run -d --name prefect -p 4200:4200 \ prefecthq/prefect:3-latest \ prefect server start --host 0.0.0.0Проверка:
curl -s localhost:4200/api/healthОтвет: true. Интерфейс: http://localhost:4200. Остановить и удалить: docker rm -f prefect.
--host 0.0.0.0 нужен, чтобы сервер слушал не только внутри контейнера. Без него порт -p не сработает.
Образ большой (сотни мегабайт). Тег 3-latest меняется. Для своего проекта закрепите точную версию.
Что искать в стартере
Заголовок раздела «Что искать в стартере»- Официальный пример. Ищите в документации раздел Docker, Docker Compose или Self-hosted.
- Версии образов. В примерах часто стоит
latest. Замените его на конкретную версию. - Пароли. В стартерах стоят пароли для обучения. Не берите их в продакшен.
- Данные. Проверьте, где пример хранит данные. Если тома нет, данные пропадут при удалении контейнера.
- Размер. Стартеры оркестраторов поднимают 4–8 контейнеров. Им нужно 4 ГБ памяти и больше.
Остальные инструменты
Заголовок раздела «Остальные инструменты»Для них мы только проверили образ. Запускать их целиком не будем.
- Kafka. Один брокер для опытов. Команда из официальной документации:
Окно терминала docker run -p 9092:9092 apache/kafka:4.4.0 - Jupyter. Образ большой, несколько гигабайт. Порт
8888, папку с ноутбуками подключают через-v. - ClickHouse. Образ
clickhouse/clickhouse-server:26.8. Данные храните в томе:-v ch-data:/var/lib/clickhouse. - MLflow. Образ
ghcr.io/mlflow/mlflow:v3.5.0. Сервер учёта экспериментов на порту5000. - Superset. Нужны база, секретный ключ и первый запуск с созданием пользователя. Следуйте официальной инструкции.
Docker в CI и в команде
Заголовок раздела «Docker в CI и в команде»- Тесты пайплайна. CI запускает тот же образ, что и продакшен. Тест проходит в том же окружении.
- Тесты с базой. В CI поднимают
postgres:17как сервис, грузят тестовые данные, проверяют SQL. - Новый коллега.
git clone,cp .env.example .env,docker compose up. Через пять минут всё работает.
Практика
Заголовок раздела «Практика»Задания 1 и 3 — в папке ~/docker-practice. Для задания 2 создайте отдельную папку, чтобы не перезаписать compose.yaml из прошлых уроков.
Задание 1
Заголовок раздела «Задание 1»Запустите app/report.py в одноразовом контейнере python:3.12-slim, без Dockerfile. Подключите текущую папку через -v.
Проверка: в выводе Заказов: 500 и три строки по каналам: organic 23715.82, ads 23082.74, email 15459.67.
Решение
cd ~/docker-practicedocker run --rm -v "$PWD:/work" -w /work \ -e ORDERS_PATH=/work/data/orders.csv \ python:3.12-slim python app/report.pyБез -e ORDERS_PATH скрипт ищет файл /data/orders.csv и падает с FileNotFoundError.
Задание 2
Заголовок раздела «Задание 2»Найдите образ Adminer на Docker Hub и посмотрите его теги. Закрепите версию 5 и напишите сервис для compose.yaml на порту 8080. Проверьте файл командой docker compose config -q.
Проверка: команда docker compose config -q ничего не печатает и возвращает код 0 (echo $? показывает 0).
Решение
Теги: hub.docker.com/_/adminer/tags. Создайте отдельную папку:
mkdir -p ~/adminer-try && cd ~/adminer-tryФайл compose.yaml в ней:
services: adminer: image: adminer:5 ports: - "8080:8080"docker compose config -qecho $?Если порт 8080 занят, поменяйте левую часть: "8081:8080".
Задание 3
Заголовок раздела «Задание 3»Скачайте официальный docker-compose.yaml Airflow и выведите список его сервисов. Ничего не запускайте.
Проверка: в списке 8 сервисов, среди них airflow-scheduler и airflow-apiserver.
Решение
mkdir -p ~/airflow-look && cd ~/airflow-lookcurl -LfO https://airflow.apache.org/docs/apache-airflow/3.4.0/docker-compose.yamldocker compose config --services 2>/dev/null2>/dev/null прячет предупреждения о пустых переменных (FERNET_KEY, AIRFLOW_UID). Команда только читает файл. Контейнеры не стартуют. Если файл сменился, список может отличаться.
Дальше: Контейнеры в продакшене.