如何在Docker Compose部署的Airflow中使用主机网络?
Airflow Docker Compose 主机网络配置解决邮件发送问题
问题根源
给服务添加network_mode: "host"后无限输出".",是因为宿主机端口被旧版Airflow或其他进程占用,Airflow启动脚本检测到端口冲突后循环重试导致。
分步配置方案
1. 清理端口冲突
先停掉本地旧版Airflow服务,释放默认端口:
systemctl stop airflow-webserver airflow-scheduler airflow-worker
检查端口占用,确保8080、5555、8793等Airflow默认端口未被占用:
netstat -tulpn | grep -E "(8080|5555|8793)"
如果有其他进程占用,优先停止对应进程(为了无缝迁移,不推荐修改Airflow端口配置)。
2. 修改docker-compose.yml配置
方式一:全局使用主机网络
在yml文件最顶层添加全局网络配置,替代默认的bridge网络:
networks: default: external: true name: host
同时删除所有服务下的ports映射(主机网络下端口映射无效,保留会报错)。
方式二:仅给需要发邮件的服务配置主机网络
如果不需要所有服务都用host网络,仅给执行任务发邮件的核心服务(worker和scheduler)单独配置:
services: airflow-worker: network_mode: host # 删除该服务下的ports配置 # 其他原有配置保持不变 airflow-scheduler: network_mode: host # 删除该服务下的ports配置 # 其他原有配置保持不变 # webserver等其他服务可保留默认bridge网络,不影响邮件发送
3. 验证配置
重启服务:
docker compose down docker compose up -d
进入worker容器测试SMTP连接:
docker exec -it $(docker ps -q -f name=airflow-worker) python3 -c " import smtplib try: smtp = smtplib.SMTP('localhost', 25) smtp.noop() print('SMTP连接成功') smtp.quit() except Exception as e: print(f'连接失败: {str(e)}') "
关键注意事项
- CentOS 7下使用主机网络无需额外修改iptables规则,只要宿主机的SMTP服务(如postfix)监听
127.0.0.1或允许本地连接即可。 - 主机网络模式下,容器内的
localhost直接指向宿主机回环地址,完全兼容原有代码中的邮件配置,无需修改任何.py文件。
内容的提问来源于stack exchange,提问作者asparagus
相关产品推荐
相关产品推荐

