如何阻止Docker将域名解析为本地地址?
解决方案
以下几种方法可以避免硬编码IP,解决你的容器域名解析问题:
1. 使用Docker自定义网络实现容器间直接通信
这是最推荐的方案,容器间无需依赖外部网络,直接通过自定义网络完成解析通信:
- 先创建一个自定义Docker网络:
docker network create acme-internal - 启动Registry容器时,加入这个网络并设置域名别名:
docker run -d \ --name registry \ --network acme-internal \ --network-alias registry.acme.com \ registry:2 - 启动Jenkins容器时,同样加入这个自定义网络:
docker run -d \ --name jenkins \ --network acme-internal \ # 其他Jenkins启动参数(如端口映射、挂载目录等) jenkins/jenkins:lts
此时Jenkins容器内访问registry.acme.com会直接解析到Registry容器的内部IP,既解决了解析问题,又提升了镜像推送的传输效率。
2. 为Jenkins容器指定外部DNS服务器
如果必须通过公网IP访问Registry,可以让Jenkins容器使用外部DNS服务器解析域名,绕过宿主机的本地解析:
- 启动Jenkins时添加DNS参数,比如使用谷歌公共DNS:
docker run -d \ --name jenkins \ --dns 8.8.8.8 \ --dns 8.8.4.4 \ # 其他Jenkins启动参数 jenkins/jenkins:lts
这样容器会通过指定的外部DNS解析registry.acme.com,得到正确的公网IP,而非本地的127.0.1.1。
3. 调整宿主机DNS配置(可选)
如果宿主机本身的DNS解析把域名指向了127.0.1.1,可以修改宿主机的/etc/resolv.conf或系统DNS配置,优先使用外部DNS服务器。不过这种方法会影响宿主机上的所有解析,灵活性不如前两种方案。
内容的提问来源于stack exchange,提问作者Arnaud Denoyelle
相关产品推荐
相关产品推荐

