Ubuntu 22.04下Docker容器无法访问外网问题求助
问题排查与解决方案
核心定位
从现象判断,宿主机网络功能正常(--network host参数下可正常连通),但Docker默认bridge网络环境下容器无法完成域名解析,问题集中在Docker的DNS配置、bridge网络路由规则或系统网络服务冲突上。
排查步骤与解决方案
强制指定Docker DNS服务器
- 先查看当前Docker daemon的DNS配置:
docker info | grep -i dns - 如果输出的DNS地址不是公共可用的DNS服务器(如8.8.8.8、1.1.1.1),手动配置:
- 编辑或创建
/etc/docker/daemon.json文件:{ "dns": ["8.8.8.8", "1.1.1.1"] } - 重启Docker服务使配置生效:
systemctl restart docker - 用busybox验证:
docker run --rm -it busybox ping -c 3 acme-v02.api.letsencrypt.org
- 编辑或创建
- 先查看当前Docker daemon的DNS配置:
解决systemd-resolved与Docker的DNS冲突
- Ubuntu 22.04默认使用
systemd-resolved,/etc/resolv.conf默认软链到本地解析器/run/systemd/resolve/stub-resolv.conf(DNS地址为127.0.0.53),容器无法访问该本地地址:- 切换宿主机的resolv.conf到真实DNS配置文件:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf - 重启Docker服务后再次测试容器网络。
- 切换宿主机的resolv.conf到真实DNS配置文件:
- Ubuntu 22.04默认使用
检查UFW防火墙规则干扰
- Ubuntu 22.04的UFW防火墙可能拦截Docker bridge网络的出站流量:
- 临时关闭UFW测试:
sudo ufw disable - 如果问题解决,重新开启UFW并添加Docker网络允许规则:
sudo ufw enable sudo ufw allow in on docker0 sudo ufw allow out on docker0
- 临时关闭UFW测试:
- Ubuntu 22.04的UFW防火墙可能拦截Docker bridge网络的出站流量:
确认IP转发规则生效
- 再次验证IP转发配置:
- 查看临时生效状态:
sysctl net.ipv4.ip_forward - 确保返回值为
net.ipv4.ip_forward = 1,若未生效,加载永久配置:sudo sysctl -p /etc/sysctl.conf
- 查看临时生效状态:
- 再次验证IP转发配置:
为docker-compose服务单独指定DNS
- 若全局配置无效,可在
docker-compose.yaml中为目标服务单独配置DNS:version: '3.8' services: acme-cert-service: # 原有配置... dns: - 8.8.8.8 - 1.1.1.1 - 重新运行服务测试:
docker-compose up -d
- 若全局配置无效,可在
验证流程
每次调整配置后,先用busybox的ping命令确认容器能解析并连通目标域名,再运行Let's Encrypt证书生成脚本,检查curl错误7是否消除。
内容的提问来源于stack exchange,提问作者Nils Baumgartner
相关产品推荐
相关产品推荐

