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
相关产品推荐
相关产品推荐

