当前位置: 首页 > article >正文

使用Docker快速搭建Airflow+MySQL详细教程

为了使用 Docker 安装 Apache Airflow 2.9.3 并配置 MySQL 数据库并确保数据持久化,我们可以使用 Docker Compose。以下是详细步骤:

步骤 1:创建项目目录

在你的工作目录中创建一个新目录来存放所有相关的配置文件和脚本。

mkdir airflow-mysql
cd airflow-mysql

步骤 2:创建 docker-compose.yml 文件

在项目目录中创建一个名为 docker-compose.yml 的文件,内容如下:

version: '3.7'

services:
  mysql:
    image: mysql:8.0.27
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: airflow
      MYSQL_USER: airflow
      MYSQL_PASSWORD: airflowpassword
      MYSQL_CHARSET: utf8mb4
      MYSQL_COLLATION: utf8mb4_general_ci
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  airflow-webserver:
    image: apache/airflow:2.9.3
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: mysql+mysqldb://airflow:airflowpassword@mysql:3306/airflow
      AIRFLOW__CORE__FERNET_KEY: 'YOUR_FERNET_KEY'
      AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
      AIRFLOW__WEBSERVER__RBAC: 'true'
    depends_on:
      - mysql
    ports:
      - "8080:8080"
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
    command: ["bash", "-c", "airflow db init && airflow users create -r Admin -u admin -p admin -e admin@example.com -f Admin -l User && airflow webserver"]

  airflow-scheduler:
    image: apache/airflow:2.9.3
    environment:
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: mysql+mysqldb://airflow:airflowpassword@mysql:3306/airflow
      AIRFLOW__CORE__FERNET_KEY: 'YOUR_FERNET_KEY'
      AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
      AIRFLOW__WEBSERVER__RBAC: 'true'
    depends_on:
      - mysql
    volumes:
      - ./dags:/opt/airflow/dags
      - ./logs:/opt/airflow/logs
      - ./plugins:/opt/airflow/plugins
    command: ["bash", "-c", "airflow scheduler"]

volumes:
  mysql_data:

请注意,YOUR_FERNET_KEY 需要替换为一个实际的 Fernet 密钥,可以通过以下命令生成:

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

步骤 3:创建目录结构

为 Airflow 的 DAGs、日志和插件创建目录:

mkdir -p dags logs plugins
chmod -R 777 dags logs plugins

步骤 4:启动 Docker Compose

在项目目录中运行以下命令来启动所有服务:

docker-compose up -d

步骤 5:检查服务状态

你可以使用以下命令查看正在运行的容器:

docker-compose ps

步骤 6:访问 Airflow Web UI

打开浏览器并访问 http://localhost:8080,你应该能够看到 Airflow 的登录页面。使用以下默认凭据登录:

  • 用户名:admin
  • 密码:admin

解释

服务定义
  • mysql: 使用 MySQL 8.0.27 镜像,设置数据库名称、用户和密码,并将数据持久化到 mysql_data 卷中。
  • airflow-webserver: 使用 Airflow 2.9.3 镜像,配置连接 MySQL 的连接字符串,初始化数据库并创建管理员用户,然后启动 Airflow Webserver。
  • airflow-scheduler: 使用 Airflow 2.9.3 镜像,配置连接 MySQL 的连接字符串,并启动 Airflow Scheduler。
数据持久化
  • MySQL 数据通过 Docker 卷 mysql_data 持久化。
  • Airflow 的 DAGs、日志和插件通过绑定挂载到主机的目录 ./dags./logs./plugins

其他配置

环境变量说明
  • AIRFLOW__CORE__EXECUTOR: LocalExecutor 表示使用本地执行器。
  • AIRFLOW__CORE__SQL_ALCHEMY_CONN: 设置 Airflow 连接 MySQL 的连接字符串。格式为 mysql+mysqldb://<username>:<password>@<host>:<port>/<database>
  • AIRFLOW__CORE__FERNET_KEY: 用于加密连接密码的密钥。可以通过 python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" 生成这个密钥。
  • AIRFLOW__CORE__LOAD_EXAMPLES: 设置为 false 表示不加载示例 DAGs,以保持环境干净。
  • AIRFLOW__WEBSERVER__RBAC: 启用基于角色的访问控制。

Docker Compose 配置说明

  • depends_on: 确保 MySQL 服务在 Airflow 服务之前启动。
  • volumes: 用于持久化数据和共享文件。MySQL 数据存储在 mysql_data 卷中;Airflow 的 DAGs、日志和插件分别绑定挂载到主机的 ./dags./logs./plugins 目录。
  • command: 定义容器启动时要运行的命令。对于 airflow-webserver 服务,首先初始化数据库并创建管理员用户,然后启动 Airflow Webserver。对于 airflow-scheduler 服务,启动 Airflow Scheduler。

确保持久化

持久化数据是确保服务重启后数据不会丢失的关键。我们使用 Docker 卷来持久化 MySQL 数据,并使用绑定挂载来持久化 Airflow 的 DAGs、日志和插件。

启动和管理容器

  1. 启动容器

    docker-compose up -d
    
  2. 查看容器状态

    docker-compose ps
    
  3. 查看日志

    docker-compose logs -f
    
  4. 停止和删除容器

    docker-compose down
    

进一步配置和优化

安全性
  1. 更改默认密码
    默认的管理员密码为 admin,建议在第一次登录后立即更改密码。

  2. 使用环境变量保护敏感信息
    避免将敏感信息直接写入 docker-compose.yml 文件,可以使用 Docker Secrets 或环境变量来保护敏感信息。

资源限制

根据你的硬件资源,可以在 docker-compose.yml 中为容器设置资源限制:

airflow-webserver:
  ...
  deploy:
    resources:
      limits:
        cpus: '0.50'
        memory: '512M'
  ...
日志管理

确保日志文件不会无限制地增长,可以在 docker-compose.yml 中配置日志选项:

airflow-webserver:
  ...
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"
  ...
备份和恢复

定期备份 MySQL 数据库和 Airflow 配置,以防止数据丢失。你可以使用 cron jobs 或其他备份工具来实现这一点。

扩展性

如果需要扩展到多个节点,可以考虑使用 CeleryExecutor 或 KubernetesExecutor。CeleryExecutor 需要额外的配置和 Redis/RabbitMQ 作为消息队列。

示例 DAG 创建

dags 目录中创建一个简单的示例 DAG 文件,例如 example_dag.py

from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

with DAG(
    'example_dag',
    default_args=default_args,
    description='A simple example DAG',
    schedule_interval=timedelta(days=1),
    start_date=datetime(2023, 1, 1),
    catchup=False,
) as dag:

    t1 = BashOperator(
        task_id='print_date',
        bash_command='date',
    )

    t2 = BashOperator(
        task_id='sleep',
        bash_command='sleep 5',
    )

    t1 >> t2

这将创建一个简单的 DAG,包含两个任务:打印当前日期和等待 5 秒。

监控和日志

Airflow 提供了丰富的监控和日志功能,可以帮助你跟踪任务的执行状态和性能。

  1. Airflow Web UI
    通过 Web UI 查看 DAG 和任务的状态、日志和图形化表示。

  2. 日志文件
    查看容器内的日志文件,了解更多详细信息。

docker-compose logs airflow-webserver
docker-compose logs airflow-scheduler

更新和升级

定期更新 Airflow 和相关依赖项,以确保获得最新的功能和安全补丁。

  1. 更新 Docker 镜像

    docker pull apache/airflow:2.9.3
    docker-compose up -d
    
  2. 更新 MySQL 镜像

    docker pull mysql:8.0.27
    docker-compose up -d
    

结论

通过这些步骤,你可以成功地使用 Docker 和 MySQL 部署和配置 Apache Airflow 2.9.3


验证 Docker 容器是否成功启动,可以使用一系列命令来检查容器的状态和日志。以下是一些常用的命令和步骤:

1. 检查容器状态

使用 docker ps 命令查看正在运行的容器:

docker ps

这个命令会列出所有正在运行的容器,包括它们的容器 ID、名称、状态等。

如果要查看所有容器(包括停止的),可以使用 -a 选项:

docker ps -a

2. 查看容器日志

查看特定容器的日志可以帮助你了解容器是否正常启动,并排除潜在的错误。使用 docker logs 命令:

docker logs <container_id_or_name>

你还可以使用 -f 选项来实时跟踪日志输出:

docker logs -f <container_id_or_name>

3. 使用 Docker Compose 验证

如果你使用的是 Docker Compose,可以使用以下命令查看所有服务的状态:

docker-compose ps

查看所有服务的日志:

docker-compose logs

实时查看日志:

docker-compose logs -f

4. 具体示例

假设你有一个名为 airflow-webserver 的容器,以下是如何验证它是否成功启动的步骤:

  1. 检查容器状态

    docker ps
    

    你应该看到类似以下的输出:

    CONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                    NAMES
    abc123def456   apache/airflow:2.9.3    "/entrypoint.sh airf…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp   airflow-webserver
    

    如果容器状态是 Up,表明容器正在运行。

  2. 查看容器日志

    docker logs airflow-webserver
    

    你应该看到 Airflow Webserver 的启动日志,确认没有错误信息。

  3. 实时跟踪日志

    docker logs -f airflow-webserver
    

    实时查看容器的输出,确保没有任何问题。

  4. 使用 Docker Compose 验证

    docker-compose ps
    

    你应该看到类似以下的输出:

       Name                     Command               State                                  Ports
    -----------------------------------------------------------------------------------------------------------
    airflow-mysql_mysql_1      docker-entrypoint.sh mysqld      Up             3306/tcp
    airflow-mysql_webserver_1  /entrypoint.sh airflow w ...     Up (healthy)   0.0.0.0:8080->8080/tcp
    airflow-mysql_scheduler_1  /entrypoint.sh airflow s ...     Up
    
  5. 查看所有服务的日志

    docker-compose logs
    
  6. 实时查看所有服务的日志

    docker-compose logs -f
    

5. 健康检查

一些 Docker 镜像提供了健康检查功能,可以通过 docker ps 命令中的 STATUS 列查看健康状态。如果镜像支持健康检查,你会看到类似 Up (healthy) 的状态。

6. 访问 Web UI

最终,你可以通过浏览器访问相应的服务 URL 以验证服务是否正常运行。例如,对于 Airflow Webserver,你可以访问 http://localhost:8080,如果能够看到 Airflow 的登录页面,说明 Webserver 已经成功启动。

总结

通过这些命令和步骤,可以有效地验证 Docker 容器是否成功启动,并通过查看日志和状态排除潜在的错误。


http://www.kler.cn/news/316032.html

相关文章:

  • 【Linux篇】常用命令及操作技巧(基础篇)
  • IM项目-----消息转发子服务
  • 开源模型应用落地-qwen模型小试-调用Qwen2-VL-7B-Instruct-更清晰地看世界-集成vLLM(二)
  • 运行在docker环境下的图片压缩小工具
  • Qt集成Direct2D绘制,实现离屏渲染
  • OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【SHELL】
  • ARM中的寄存器
  • Zabbix 6.4添加中文语言
  • IT 人转架构设计必备:项目学习资料+视频分享,涵盖运维管理全内容
  • C++ 构造函数最佳实践
  • Jmeter压力测试-ServerAgent-2.2.3闪退问题解决
  • 【编程基础知识】MySQL中什么叫做聚簇索引、非聚簇索引、回表、覆盖索引
  • Spring Boot文件上传
  • Spring Boot 入门面试五道题
  • 【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数
  • 从局部到全局:深入理解Java Web的作用域机制
  • 【SpinalHDL】Scala/SpinalHDL联合编程之实例化
  • Spring Boot管理用户数据
  • 九、按照官网的操作:安装artifactory+mariadb--失败了
  • AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图
  • MySQL|MySQL 中 `DATE_FORMAT()` 函数的使用
  • 如何进行Ubuntu磁盘空间深度清理?
  • MySQL数据库迁移与备份实录
  • 【RabbitMQ】应用问题
  • 【c++】介绍
  • 数据结构与算法——Java实现 11.习题——有序链表去重
  • 深度优先搜索算法及其matlab程序详解
  • [大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?
  • ubuntu+MobaXterm+ssh+运行Qt(成功版)
  • Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料