基于Ubuntu的Airflow和Docker组合的任务资源隔离技术

Airflow具有强大的调度能力,结合Docker 容器化和资源隔离能力,将显著提高自动化任务调度的稳定性。本文将详细介绍Airflow结合Docker的任务资源隔离技术,包括环境准备、集成步骤、配置详解、实战应用。

注意:确保安装了Python 3.7+版本以上

1. 安装Airflow

1.1. 安装并配置 PostgreSQL

安装PostgreSQL

sudo apt update && sudo apt install -y postgresql postgresql-contrib

启动并设置开机自启

sudo systemctl start postgresql
sudo systemctl enable postgresql

创建 Airflow 专用数据库和用户
切换到postgres系统用户

sudo -u postgres psql

在这里插入图片描述
在PostgreSQL命令行中执行以下指令(替换your_username/your_password为自定义值)

CREATE USER airflow WITH PASSWORD 'Pwd1234567890!';
CREATE DATABASE airflow_db OWNER airflow;
GRANT ALL PRIVILEGES ON DATABASE airflow_db TO airflow;

退出PostgreSQL命令行

\q

安装 PostgreSQL Python 驱动

pip3 install psycopg2-binary

1.2. 安装Airflow

使用约束文件确保版本一致性:

AIRFLOW_VERSION=2.6.3
PYTHON_VERSION=$(python3 --version | cut -d " " -f 2 | cut -d "." -f 1-2)
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
pip3 install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"

配置 Airflow 和 Docker 的参数至关重要。以下是配置文件的模板。
运行命令

vim ~/airflow/airflow.cfg

修改或者新增如下信息

[core]
executor = LocalExecutor
sql_alchemy_conn = postgresql+psycopg2://airflow:Pwd1234567890!@localhost/airflow_db

[docker]
base_url = unix://var/run/docker.sock

初始化数据库

airflow db init

在这里插入图片描述
创建管理员用户

airflow users create --username admin --password Pwd1234567890! --firstname Admin --lastname User --role Admin --email admin@example.com

在这里插入图片描述
根据airflow.cfg中的配置创建dags目录

mkdir ~/airflow/dags

在这里插入图片描述
启动服务

airflow webserver --port 8080 -D
airflow scheduler -D

访问 http://localhost:8080,使用用户名admin和密码admin登录。
问题排查
airflow scheduler不加D就能看到出错信息,scheduler不运行,界面上将看不到DAG列表

1.3. 安装Docker Provider

Airflow 2.x 版本将 Docker 相关的功能拆分为独立的providers插件,默认安装 Airflow 时不会自动包含这个插件
运行命令

pip3 install apache-airflow-providers-docker==3.6.0

验证安装是否成功
执行以下命令

python3 -c "from airflow.providers.docker.operators.docker import DockerOperator; print('安装成功')"

2. 安装Docker

按照这个步骤安装Docker
https://editor.csdn.net/md/?articleId=157475845

3. Airflow调度Docker

3.1. 通过Docker Compose启动容器

创建DAG文件
在开始之前,您需要在“~/airflow/dags”目录下创建一个python文件。这个文件将命名为“demo.py”。确保目录结构正确,因为Airflow依赖于这个结构来识别和执行DAG。
通过 Airflow,可以使用 DockerOperator 来执行 Docker 任务。以下是 Python 和 Bash 的示例代码
新建demo.py文件

from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import datetime
from docker.types import Mount

default_args = {
    'owner': 'airflow',
    'start_date': datetime(2026, 1, 28),
}

dag = DAG(
    'demo',
    default_args=default_args,
    schedule_interval='0 8 * * *',  # 每天早上8点执行 (Cron表达式)
    catchup=False  # 避免对过去未执行的日期进行补跑
)

mount = Mount(
    source='/root/airflow/dags/my_script.py',  # 本地脚本文件的绝对路径
    target='/my_script.py',  # 挂载到容器内的路径(可自定义,建议根目录或/app)
    type='bind'  # 绑定挂载,将本地文件映射到容器
)

docker_task = DockerOperator(
    task_id='my_docker_task',
    image='python:3.8-slim',
    api_version='auto',
    auto_remove=True,
    command='python my_script.py',
    docker_url='unix://var/run/docker.sock',
    network_mode='bridge',
    dag=dag,
     # 新增:添加挂载配置
    mounts=[mount],
    # 可选:确保Airflow用户有访问Docker的权限
    privileged=True,
)

在/root/airflow/dags/下新建一个my_script.py的文件

import time
# 定义金字塔的层数
height = 5

print("一个简单的金字塔图案:")
# 外层循环控制金字塔的层数(高度)
for i in range(height):
    # 1. 打印空格:每行星号前的空格数 = 总层数 - 当前层数 (i从0开始)
    for j in range(height - i - 1):
        print(" ", end="")
    # 2. 打印星号:每行星号的数量 = 2 * 当前层数 + 1
    for k in range(2 * i + 1):
        print("*", end="")
    # 3. 换行,开始打印下一行
    print()
time.sleep(120)
# 金字塔底部装饰
print(" " * (height - 1) + "|")

点击trigger进行触发
在这里插入图片描述
在这里插入图片描述
运行中查看Docker镜像启动情况
在这里插入图片描述
运行完毕后自动释放
在这里插入图片描述

3.2. 限制容器的CPU\内存\磁盘

https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/decorators/docker.html
在这里插入图片描述
重新更新脚本
demo.py文件

from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import datetime
from docker.types import Mount

default_args = {
    'owner': 'airflow',
    'start_date': datetime(2026, 1, 28),
}

dag = DAG(
    'demo',
    default_args=default_args,
    schedule_interval='0 8 * * *',  # 每天早上8点执行 (Cron表达式)
    catchup=False  # 避免对过去未执行的日期进行补跑
)

mount = Mount(
    source='/root/airflow/dags/my_script.py',  # 本地脚本文件的绝对路径
    target='/my_script.py',  # 挂载到容器内的路径(可自定义,建议根目录或/app)
    type='bind'  # 绑定挂载,将本地文件映射到容器
)

docker_task = DockerOperator(
    task_id='my_docker_task',
    image='python:3.8-slim',
    api_version='auto',
    auto_remove=True,
    command='python my_script.py',
    docker_url='unix://var/run/docker.sock',
    network_mode='bridge',
    dag=dag,
     # 新增:添加挂载配置
    mounts=[mount],
    # 可选:确保Airflow用户有访问Docker的权限
    privileged=True,
    cpus=1,
    mem_limit='2g',
)

my_script.py的文件,功能是网路请求

from urllib.request import urlopen
import json

print("---------------------------------------------------")
print("=================网络请求 baidu.com=================")
# 发送一个简单的 GET 请求
response = urlopen('https://baidu.com')

# 读取响应内容(返回的是字节数据,需要解码)
html = response.read().decode('utf-8')
print(f"状态码: {response.status}")
print(f"响应体:\n{html}...") # 打印网站内容

4. 参考资料

【1】https://airflow.apache.org/
【2】https://blog.51cto.com/u_16213363/13593321
【3】https://baijiahao.baidu.com/s?id=1840468013104743575
【4】https://blog.csdn.net/hakukun/article/details/147353968
【5】https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/decorators/docker.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呵呵你真行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值