Как создать и запустить docker-контейнер Apache AirFlow на Windows

Apache AirFlow WSL, docker-контейнер AirFlow, обучение AirFlow, курсы AirFlow, курсы дата-инженеров, обучение инженеров данных devOps docker, Школа Больших Данных Учебный Центр Коммерсант

Что такое WSL, Docker и как запустить веб-сервер Apache AirFlow в контейнере на локальной машине в Ubuntu поверх Windows вместо любимого Google Colab. Пошаговое руководство для начинающих дата-инженеров.

Краткий ликбез по WSL и Docker для любителей Windows

Обычно я всегда запускала веб-сервер Apache AirFlow в интерактивной среде Google Colab, которая по своей сути представляет собой виртуальную машину с Unix-подобной ОС. А, чтобы получить доступ к localhost, использовала утилиту тунелирования ngrok. С одной стороны, это было удобно, поскольку каждая Colab-среда работает изолировано: можно было не связываться с виртуальными Python-средами, чтобы избежать «ада зависимостей», когда одна библиотека конфликтует с другой, достаточно просто закрыть ненужную Colab-среду. Однако, запускать приложения AirFlow в режиме standalone удобнее всего на собственной локальной машине, чтобы избежать задержек и других недостатков Colab, о которых я писала здесь. Поэтому решила запускать веб-серверы в своей собственной среде, независимо от внешних сервисов.

Избежать конфликта зависимостей, свойственных AirFlow, при запуске его на локальной машине с операционной системой Windows, можно 2-мя способами:

  • использовать виртуальные среды Python;
  • сделать контейнер, упаковав в него приложение со всеми зависимостями.

Далее рассмотрим именно 2-ой способ. Чтобы запустить контейнер на операционной системе Windows, надо установить WSL — подсистему Windows для Linux, которая позволяет запускать среду Linux на Windows без отдельной виртуальной машины. С WSL можно запускать Linux в оболочке Bash с выбранным дистрибутивом, чтобы работать с CLI-интерфейсом и приложениями Linux. В отличие от полноценной виртуальной машины, WSL требует меньше ресурсов (ЦП, памяти и хранилища), а также может обращаться к файлам Windows в Linux. Обеспечить изоляцию приложений, чтобы избежать конфликтов с зависимостями, свойственных Python-разработке, можно с помощью контейнеризации, что также хорошо поддерживается в WSL.

Сегодня наиболее популярным инструментом контейнеризации является Docker – он позволяет упаковать приложение со всем его окружением и зависимостями в контейнер, который можно запустить на любой Linux-подобной системе. Эта платформа дает возможность отделить приложения от инфраструктуры, перезапуская их по мере необходимости. Изоляцию обеспечивает запуск каждого контейнера в отдельном процессе. Docker-образ можно развернуть несколько раз, получив независимые контейнеры с работающими приложениями. Docker-контейнер — это запущенный и изолированный образ с возможностью временного сохранения данных, которые записываются в его верхний слой и при удалении контейнера удаляются.

WSL: Linux на Windows
WSL: Linux на Windows

Создание и запуск docker-контейнера Apache AirFlow

После установки WSL и Docker на свой ноутбук с ОС Windows я загрузила готовый базовый docker-образ загрузить Apache Airflow версии 2.8.1 для python3.11:

docker pull apache/airflow:slim-2.8.1-python3.11

Чтобы запускать работающий контейнер с AirFlow одной строкой, т.е. уже с инициализированной базой данных метаданных и пользователем веб-интерфейса, пришлось немного модифицировать этот образ, внеся следующие изменения в Dockerfile — текстовый файл с последовательно расположенными инструкциями для создания образа. Каждому образу присваивается свой Dockerfile, куда надо записать команды для установки пакетов. Поскольку я работаю с Телеграм и PostgreSQL, а также Elasticsearch, в dockerfile включила инструкции установки этих библиотек, а также добавила команды инициализации базы данных метаданных и создания локального пользователя:

FROM apache/airflow:slim-2.8.1-python3.11
RUN airflow db init
RUN airflow users create --username anna --password admin --firstname Anna --lastname Vi --role Admin --email admin@example.com

RUN pip install elasticsearch7==7.10.1
RUN pip install apache-airflow-providers-telegram
RUN pip install psycopg2-binary
RUN pip install apache-airflow-providers-postgres
ENTRYPOINT ["airflow", "standalone"]

Для запуска AirFlow в режиме standalone, т.е. на локальной машине, это надо указать в параметрах входной точки ENTRYPOINT в файле Dockerfile. Затем для создания своего образа надо выполнить команду build в той папке, где находится этот Dockerfile:

docker build -t my-airflow-image .

Для работы с контейнерами Docker предоставляет всего несколько команд: docker run, stop и restart. Однако, они имеют множество полезных опций. Например, команда run позволяет запускать контейнер в фоновом режиме, монтировать директории и пр. Чтобы запустить docker-контейнер на основе созданного образа с названием my-airflow-image, надо выполнить команду docker run. Поскольку порт 8080, используемый по умолчанию для запуска веб-приложений, у меня занят другим приложением, я решила развернуть AirFlow на другом порту, 8081. Также при запуске контейнера AirFlow надо указать директорию для хранения Python-файлов с задачами и DAG. Для этого создала папку workspace/airflow/my_dags на диске С и примонтировала ее внутрь контейнера в директорию /opt/airflow/dags/, чтобы управлять DAG-файлами AirFlow извне контейнера. Для запуска docker-контейнера my-airflow на основе образа my-airflow-image с приложениями AirFlow в фоновом режиме надо добавить флаг –d к команде run:

docker run -d -p 8081:8080 -v /mnt/c/workspace/airflow/my_dags/:/opt/airflow/dags/ --name my-airflow my-airflow-image

Эта команда запускает контейнер в фоновом режиме с Apache AirFlow и пробрасывает порты, чтобы иметь доступ к веб-интерфейсу ETL-планировщика через порт 8081 локальной машины, а также читать и выполнять DAG-файлы, расположенные в директории workspace/airflow/my_dags на диске С.

Разница между docker-образом и docker-контейнером
Разница между docker-образом и docker-контейнером

Все последующие запуски docker-контейнера my-airflow выполняются в несколько шагов:

  • Открыть командную строку;
  • Запустить WSL;
  • Стартовать работу контейнера с помощью команды
docker start my-airflow
  • Запустить командную оболочку bash в уже запущенном контейнере в интерактивном режиме:
docker exec -it my-airflow bash
  • Наконец, запустить Apache AirFlow в режиме standalone:
airflow standalone
Apache AirFlow WSL, docker-контейнер AirFlow
Запуск docker-контейнера с Apache AirFlow в WSL

Для разработки DAG-файлов и файлов задач можно использовать редактор VSCode, который, хоть и не является полноценной IDE, намного удобнее обычного блокнота.

Python-файлы в VS Code
Python-файлы в VS Code

Впрочем, быстро поправить py-файл можно и просто открыв его в Notepad++. Завтра я продолжу работу с этим контейнером Apache AirFlow и расскажу, как проверить доступность сайта с помощью веб-хуков.

Узнайте больше про Apache AirFlow и его использование в задачах реальной дата-инженерии на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://www.freecodecamp.org/news/install-apache-airflow-on-windows-without-docker/
  2. https://cloud.yandex.ru/ru/blog/posts/2022/03/docker-containers
  3. https://1cloud.ru/blog/docker_start
Поиск по сайту