同一服务器Docker部署的Gitlab无法连接同主机Docker SMTP服务
问题根因
你遇到的是Docker默认桥接网络的回环访问限制问题:
- 你的域名
my-domain.io解析到宿主机的公网IP,宿主机上运行的Docker容器发起对该公网IP的请求时,Docker默认的iptables转发规则仅默认放行80、443、22等常规端口,25、465、587等邮件端口未被匹配,流量被直接丢弃,所以会出现超时、端口被过滤的情况,请求根本没到达Postfix容器,因此Postfix没有日志。 - 外部网络、宿主机本身的请求不受该规则限制,所以可以正常访问邮件端口。
可用解决方案
按优先级从高到低排列:
方案1:使用Docker内部网络通信(最推荐)
两个服务部署在同一宿主机,无需走公网转发,性能和安全性都更好:
- 创建自定义Docker网桥:
docker network create common-net - 将Postfix容器和Gitlab容器都加入该网络,Postfix启动命令添加
--network common-net --name postfix(容器名可自行修改) - 修改Gitlab的Omnibus配置,将
gitlab_rails['smtp_address']改为Postfix的容器名(比如上面的postfix),端口保持465即可 - 重启Gitlab容器生效
方案2:使用宿主机网桥IP访问
无需调整容器网络,改配置即可:
- 在宿主机执行
ip addr show docker0,查看Docker默认网桥的IP,通常为172.17.0.1 - 两种修改可选:
- 直接修改Gitlab配置的
gitlab_rails['smtp_address']为上述IP,同时将gitlab_rails['smtp_openssl_verify_mode']改为'none'跳过证书校验(因为证书域名和IP不匹配) - 启动Gitlab容器时添加参数
--add-host=my-domain.io:172.17.0.1,将域名绑定到宿主机网桥IP,证书可正常校验,无需修改SMTP其他配置
- 直接修改Gitlab配置的
- 重启Gitlab后验证连通性
方案3:修改Docker配置放行回环流量
如果必须通过公网域名访问:
- 编辑Docker配置文件
/etc/docker/daemon.json,添加配置:
{ "userland-proxy": true }
- 重启Docker服务生效:
systemctl restart docker - 若仍有问题,手动添加iptables规则放行桥接网络的邮件端口流量:
iptables -A INPUT -i docker0 -p tcp -m multiport --dports 25,143,465,587,993 -j ACCEPT iptables -A FORWARD -i docker0 -p tcp -m multiport --dports 25,143,465,587,993 -j ACCEPT
验证方法
修改配置后先进入Gitlab容器执行telnet <替换为你的SMTP地址> 465,确认连通后再执行邮件发送测试即可。
内容的提问来源于stack exchange,提问作者Doubidou
相关产品推荐
相关产品推荐

