VM中Docker容器内Quarkus服务端口转发后无法访问排查
故障原因分析
Ubuntu 22.04默认启用IPv6,Docker在该环境下会自动将端口映射同时绑定IPv4(0.0.0.0)和IPv6(::)地址。但虚拟机的网络环境通常未配置完整的IPv6支持,或者防火墙/网络策略未放行IPv6流量,导致Docker的端口转发逻辑出现异常——当你访问localhost:8080时,系统可能优先尝试IPv6连接,而虚拟机无法处理该请求,最终触发连接重置错误。改用network_mode: host时,容器直接使用宿主机网络栈,绕过了Docker的端口转发逻辑,因此能正常访问。
解决方法
方法1:临时禁用Docker IPv6支持(快速解决)
- 编辑Docker配置文件:
sudo nano /etc/docker/daemon.json - 添加或修改以下内容:
{ "ipv6": false, "fixed-cidr-v6": "" } - 重启Docker服务:
sudo systemctl restart docker - 重新启动所有相关容器,此时端口映射仅绑定IPv4地址,执行
curl localhost:8080测试连通性。
方法2:正确配置Docker IPv6(保留IPv6需求时)
- 先确保虚拟机的网络接口已启用IPv6并分配了有效地址,可通过
ip -6 addr查看。 - 编辑
/etc/docker/daemon.json配置IPv6:{ "ipv6": true, "fixed-cidr-v6": "fd00:dead:beef::/48", "ip6tables": true } - 重启Docker服务:
sudo systemctl restart docker - 放行IPv6的8080端口流量:
sudo ip6tables -A INPUT -p tcp --dport 8080 -j ACCEPT - 重新启动容器,测试
curl localhost:8080或curl [::1]:8080是否正常。
方法3:排查防火墙与端口转发规则
- 检查Ubuntu的ufw防火墙,确保放行IPv4的8080端口:
sudo ufw allow 8080/tcp - 查看Docker的iptables规则,确认存在正确的端口转发:
sudo iptables -t nat -L -n | grep 8080,应能看到类似DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.x.x.x:8080的规则。
方法4:确认Quarkus绑定配置
- 检查Quarkus的
application.properties,确保明确绑定IPv4地址:quarkus.http.host=0.0.0.0 quarkus.http.port=8080 - 重新构建镜像并启动容器,避免服务仅监听IPv6地址的情况。
内容的提问来源于stack exchange,提问作者tim-danger
相关产品推荐
相关产品推荐

