Docker-Compose(Ubuntu环境):容器无法访问宿主机网络问题
解决静态IP Ubuntu环境下Docker容器DNS解析失败问题
看起来你遇到的是静态网络配置导致Docker容器DNS解析异常的问题——毕竟DHCP环境下系统会自动获取DNS服务器,而手动配置时很容易漏掉DNS的正确设置,导致容器继承了无效的DNS配置,进而无法解析archive.ubuntu.com这类域名。
我给你整理几个排查和解决的步骤,亲测有效:
1. 先确认宿主机的DNS是否正常工作
首先登录宿主机,执行以下命令验证基础网络:
ping archive.ubuntu.com cat /etc/resolv.conf
如果宿主机也ping不通域名,那问题根源在宿主机的静态网络配置上:
- 对于Ubuntu 18.04及以上版本,编辑
/etc/netplan/*.yaml文件,添加正确的DNS服务器(比如公司内网DNS或公共的8.8.8.8):
保存后执行network: ethernets: enp0s3: addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 你的公司内网DNS] version: 2sudo netplan apply生效。 - 对于旧版Ubuntu,编辑
/etc/network/interfaces,添加dns-nameservers配置,再执行sudo systemctl restart networking重启网络服务。
宿主机DNS正常后,再测试容器的解析情况。
2. 给Docker容器手动指定DNS服务器
如果宿主机DNS没问题,但容器还是解析失败,说明Docker没有正确继承宿主机的DNS配置,可以分两种方式修复:
临时解决(单次容器生效)
用docker run启动容器时手动指定DNS服务器:
docker run --dns 8.8.8.8 --dns 114.114.114.114 -it ubuntu:xenial bash
进入容器后再执行apt-get update,应该就能正常拉取资源了。
永久解决(所有容器生效)
创建或修改Docker守护进程配置文件/etc/docker/daemon.json,添加全局DNS配置:
{ "dns": ["8.8.8.8", "你的公司内网DNS地址"] }
保存后重启Docker服务:
sudo systemctl restart docker
之后所有新启动的容器都会自动使用这个DNS配置。
3. 在docker-compose.yml里配置DNS
如果是用docker-compose管理容器,直接在compose文件里添加DNS配置即可,两种方式可选:
给单个服务配置
version: '3' services: your-service: image: ubuntu:xenial dns: - 8.8.8.8 - 你的公司内网DNS
全局配置(所有服务生效)
version: '3' services: your-service: image: ubuntu:xenial # 全局DNS配置 networks: default: dns: - 8.8.8.8 - 你的公司内网DNS
修改完compose文件后,重启容器生效:
docker-compose down && docker-compose up -d
4. 检查公司网络的防火墙/代理限制
如果以上步骤都没用,可能是公司网络禁止了容器对外的DNS请求(UDP 53端口)。可以先测试把容器网络模式改成host(仅用于排查,不推荐生产环境):
services: your-service: image: ubuntu:xenial network_mode: host
如果改成host模式后能正常解析,说明bridge模式下的网络被拦截了,需要联系运维调整网络策略。
内容的提问来源于stack exchange,提问作者Matt Ryles
相关产品推荐
相关产品推荐

