我在公司网络上构建Docker映像时遇到问题.我刚刚开始使用Docker,所以我有一个hello-world类型应用程序的以下Dockerfile:
# DOCKER-VERSION 0.3.4 FROM centos:6.4 # Enable EPEL for Node.js RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm # Install Node.js and npm RUN yum install -y npm # Bundle app source ADD . /src # Install app dependencies RUN cd /src; npm install EXPOSE 8080 CMD ["node", "/src/index.js"]
当我在家里的笔记本电脑上,在我自己的无线网络上构建它时,这很好用.它可以下拉必需的依赖项并正确构建映像.
但是,当我在公司网络上工作时,尝试从download.fedoraproject.org下载RPM时,同样的docker构建失败,并显示以下错误消息:
第2步:运行rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm --->在e0c26afe9ed5卷曲中运行:(5)无法'解析代理'some.proxy.address'错误:跳过http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - 转移失败
在我的公司网络上,我可以通过笔记本电脑轻松访问该URL.但是一旦Docker尝试构建容器,突然间它根本无法解决.对于各种外部资源(apt-get等),这种行为是相同的:它们都可以在公司网络上的笔记本电脑上解决得很好,但Docker无法解决它们.
我没有网络专业知识来弄清楚这里发生了什么.有谁知道为什么在构建Docker容器时会发生这种奇怪的行为?
我弄清楚了这个问题.在Ubuntu上,Docker将容器的DNS服务器设置为8.8.8.x的Google服务器.据我了解,这是Ubuntu的一种解决方法,因为Ubuntu将/etc/resolv.conf设置为127.0.0.1.
我们的防火墙后面无法访问这些Google服务器,这就是我们无法解析任何网址的原因.
解决方法是告诉Docker使用哪些DNS服务器.此修复程序取决于您安装Docker的方式:
如果安装了Ubuntu软件包,请编辑/ etc/default/docker并添加以下行:
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
您可以根据需要为此配置添加任意数量的DNS服务器.编辑完此文件后,您将需要重新启动Docker服务:
sudo service docker restart
如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:
sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
我建议更改Docker守护程序的DNS设置.您可以通过在/etc/docker/daemon.json中创建守护程序配置文件来设置docker守护程序的默认选项.根据您的主机设置DNS服务器,例如我的DNS服务器是10.0.0.2:
{"dns": ["10.0.0.2", "8.8.8.8"] }
然后你需要重新启动docker服务:
sudo service docker restart
此处提供了分步说明Fix Docker的网络DNS配置
对于使用SystemD(Ubuntu 16,RHEL 7 ...)的任何Linux发行版,将使用以下命令显示该路径:
$ systemctl status docker ? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago Docs: https://docs.docker.com Main PID: 1169 (dockerd) Tasks: 19 Memory: 85.0M CPU: 1.779s CGroup: /system.slice/docker.service ??1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd:// ??1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met
路径是/lib/systemd/system/docker.service
.在启动守护程序的行中添加DOCKER_OPTS
可以包含任何值的值--dns
.
cat /lib/systemd/system/docker.service | grep dns ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
以下步骤适用于我(对于docker build和docker run命令).我的linux版本是Ubuntu 14.04.
使用以下命令识别DNS.
nm-tool | grep DNS
这个结果在我的情况下DNS:192.168.1.1
在/etc/default/docker.io中创建条目.我目前的条目是这样的
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
重启docker服务
sudo service docker.io restart
在Mac和Windows上的Docker(至少> = 1.13,可能更早),您可以在首选项->守护程序->高级中配置DNS:
以下配置设置了两个公司DNS服务器(在此使用您自己的值),并回退到Google公共DNS服务器。