使用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、日志和插件。
启动和管理容器
-
启动容器:
docker-compose up -d
-
查看容器状态:
docker-compose ps
-
查看日志:
docker-compose logs -f
-
停止和删除容器:
docker-compose down
进一步配置和优化
安全性
-
更改默认密码:
默认的管理员密码为admin
,建议在第一次登录后立即更改密码。 -
使用环境变量保护敏感信息:
避免将敏感信息直接写入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 提供了丰富的监控和日志功能,可以帮助你跟踪任务的执行状态和性能。
-
Airflow Web UI:
通过 Web UI 查看 DAG 和任务的状态、日志和图形化表示。 -
日志文件:
查看容器内的日志文件,了解更多详细信息。
docker-compose logs airflow-webserver
docker-compose logs airflow-scheduler
更新和升级
定期更新 Airflow 和相关依赖项,以确保获得最新的功能和安全补丁。
-
更新 Docker 镜像:
docker pull apache/airflow:2.9.3 docker-compose up -d
-
更新 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
的容器,以下是如何验证它是否成功启动的步骤:
-
检查容器状态:
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
,表明容器正在运行。 -
查看容器日志:
docker logs airflow-webserver
你应该看到 Airflow Webserver 的启动日志,确认没有错误信息。
-
实时跟踪日志:
docker logs -f airflow-webserver
实时查看容器的输出,确保没有任何问题。
-
使用 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
-
查看所有服务的日志:
docker-compose logs
-
实时查看所有服务的日志:
docker-compose logs -f
5. 健康检查
一些 Docker 镜像提供了健康检查功能,可以通过 docker ps
命令中的 STATUS
列查看健康状态。如果镜像支持健康检查,你会看到类似 Up (healthy)
的状态。
6. 访问 Web UI
最终,你可以通过浏览器访问相应的服务 URL 以验证服务是否正常运行。例如,对于 Airflow Webserver,你可以访问 http://localhost:8080
,如果能够看到 Airflow 的登录页面,说明 Webserver 已经成功启动。
总结
通过这些命令和步骤,可以有效地验证 Docker 容器是否成功启动,并通过查看日志和状态排除潜在的错误。