You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一服务器Docker部署的Gitlab无法连接同主机Docker SMTP服务

问题根因

你遇到的是Docker默认桥接网络的回环访问限制问题:

  • 你的域名my-domain.io解析到宿主机的公网IP,宿主机上运行的Docker容器发起对该公网IP的请求时,Docker默认的iptables转发规则仅默认放行80、443、22等常规端口,25、465、587等邮件端口未被匹配,流量被直接丢弃,所以会出现超时、端口被过滤的情况,请求根本没到达Postfix容器,因此Postfix没有日志。
  • 外部网络、宿主机本身的请求不受该规则限制,所以可以正常访问邮件端口。

可用解决方案

按优先级从高到低排列:

方案1:使用Docker内部网络通信(最推荐)

两个服务部署在同一宿主机,无需走公网转发,性能和安全性都更好:

  1. 创建自定义Docker网桥:docker network create common-net
  2. 将Postfix容器和Gitlab容器都加入该网络,Postfix启动命令添加--network common-net --name postfix(容器名可自行修改)
  3. 修改Gitlab的Omnibus配置,将gitlab_rails['smtp_address']改为Postfix的容器名(比如上面的postfix),端口保持465即可
  4. 重启Gitlab容器生效

方案2:使用宿主机网桥IP访问

无需调整容器网络,改配置即可:

  1. 在宿主机执行ip addr show docker0,查看Docker默认网桥的IP,通常为172.17.0.1
  2. 两种修改可选:
    • 直接修改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其他配置
  3. 重启Gitlab后验证连通性

方案3:修改Docker配置放行回环流量

如果必须通过公网域名访问:

  1. 编辑Docker配置文件/etc/docker/daemon.json,添加配置:
{
  "userland-proxy": true
}
  1. 重启Docker服务生效:systemctl restart docker
  2. 若仍有问题,手动添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:06:02