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

Ubuntu 20.04下Docker Compose容器内服务无法从宿主机访问的问题求助

解决Docker Compose静态IP容器宿主机无法访问的问题

嘿,我碰到过一模一样的问题——你这No route to host错误十有八九是Ubuntu的UFW防火墙和Docker自定义网络的iptables规则打架了。下面给你几个靠谱的解决思路,按顺序试就行:

1. 先搞定UFW的默认转发规则

Ubuntu 20.04自带的UFW默认会禁用转发,这会直接堵死Docker自定义子网的访问路径:

  • 编辑UFW配置文件:sudo nano /etc/default/ufw
  • 找到DEFAULT_FORWARD_POLICY,把值从DROP改成ACCEPT
  • 保存后重启UFW生效:sudo ufw reload

2. 给Docker自定义子网加UFW放行规则

如果上面改了还不行,手动加一条允许宿主机和你自定义的172.20.0.0/16子网通信的规则:

sudo ufw allow in on docker0 from 172.20.0.0/16
sudo ufw allow out on docker0 to 172.20.0.0/16

要是只想针对单个容器IP,也可以这么写:

sudo ufw allow in from 172.20.0.5 to any port 9000

3. 重建Docker的iptables规则

有时候UFW会冲掉Docker自动生成的iptables链,重启Docker服务就能让它重新生成规则:

sudo systemctl restart docker

之后可以用iptables -L -n检查一下,应该能看到针对172.20.0.0/16的ACCEPT规则。

更省心的替代方案:放弃静态IP,用本地端口映射

其实你根本没必要纠结静态IP——你已经配了9000:9000的端口映射,只要把它改成只绑定本地回环,就只有宿主机能访问,完全不会暴露到公网:
修改docker-compose.yml的ports部分:

ports:
  - 127.0.0.1:9000:9000

之后直接在宿主机用curl http://127.0.0.1:9000就能访问,简单又安全,后续挂反向代理也完全兼容。

为啥host模式能行?

因为host模式下容器直接用宿主机的网络栈,绕开了Docker的网桥转发,自然不会被UFW的转发规则限制,但缺点是端口直接占用宿主机资源,隔离性差,不如上面的方案稳妥。

最后提个小测试:如果改完规则还是不行,可以临时关掉UFW(sudo ufw disable)试试,如果关掉后能访问,那百分百是UFW的规则问题,再仔细调整就行。

内容的提问来源于stack exchange,提问作者cogm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:08:13