Dns 在公司网络上构建映像期间,网络呼叫失败
我在公司网络上构建Docker映像时遇到问题。我刚刚开始使用Docker,因此我有以下Dockerfile用于hello world类型的应用程序:Dns 在公司网络上构建映像期间,网络呼叫失败,dns,docker,Dns,Docker,我在公司网络上构建Docker映像时遇到问题。我刚刚开始使用Docker,因此我有以下Dockerfile用于hello world类型的应用程序: # 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 No
# 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
--->在e0c26afe9ed5中运行
curl:(5)无法解析代理“some.proxy.address”
错误:跳过-传输失败
在我的公司网络上,我可以从笔记本电脑上很好地访问该URL。但一旦Docker试图构建容器,它就突然无法解决。对于各种外部资源(apt get等),这种行为是相同的:它们都可以在公司网络上的我的笔记本电脑上很好地解析,但Docker无法解析它们
我没有网络知识来了解这里发生了什么。有人知道为什么在构建Docker容器时会出现这种奇怪的行为吗?我能够解决这个问题。在Ubuntu上,Docker将容器的DNS服务器设置为8.8.8.x。据我所知,这是Ubuntu上的一个变通方法,因为Ubuntu将/etc/resolv.conf设置为127.0.0.1 这些谷歌服务器无法从防火墙后面访问,这就是为什么我们无法解析任何URL 修复方法是告诉Docker要使用哪些DNS服务器。此修复程序取决于您安装Docker的方式: Ubuntu包 如果已安装Ubuntu软件包,请编辑/etc/default/docker并添加以下行:
DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"
二进制文件
如果您已通过二进制文件方法(即无软件包)安装Docker,则在启动Docker守护程序时设置DNS服务器:
sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
sudo docker-d-d--dns--dns&
以下步骤对我很有效(docker build和docker run命令)。我的linux版本是Ubuntu 14.04
- 使用以下命令识别DNS。 nm-tool | grep DNS nm工具| grep DNS
- 在/etc/default/docker.io中创建条目。我当前的条目如下所示
- 重新启动docker服务
sudo service docker.io restart对于任何使用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\u 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守护程序的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
sudo service docker restart
这里提供了Mac上Docker(至少>=1.13,可能更早)的分步说明,Windows允许您在Preferences->Daemon->Advanced中配置DNS:
下面的配置设置了两个公司DNS服务器(在这里使用您自己的值),可以回退到Google公共DNS服务器
将您的DNS指定给Docker守护程序 首先,获取您的DNS地址
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
通过启动docker容器强制此新DNS来测试问题是否真的与DNS有关
$ docker run --dns 10.0.0.2 <image_name> <command_name>
重新启动docker
$ sudo service docker restart
在这里可以找到一个非常好的指南来指导所有的过程
不重新启动Docker服务的解决方案 通过在构建时覆盖
resolv.conf
,可以修改单个Docker映像的DNS设置,而不影响其他Docker构建调用(并且不重新启动Docker服务):
FROM ubuntu:18.04
RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update
将IP123.123.123.123
替换为公司网络中使用的IP(使用nmcli dev show | grep'IP4.DNS'
获取当前使用的DNS服务器)
缺点:
- 这不会影响Dockerfile中的任何其他行。因此,如果取决于DNS解析,则必须在每一行前加上前缀
在我的Ubuntu 16.04机器上,有时,谷歌的DNS无法构建Docker映像
cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }
我必须使用以下命令手动查找我的服务提供商DNS
nmcli device show <interfacename> | grep IP4.DNS
125.22.47.102
(Ubuntu 15.04不推荐使用PS nm工具)看看它,它也可能解决您的问题我遇到的一些问题。我忘了运行apt get update
。这些可能是“Docker无法从Cisco AnyConnect获取DNS信息”的症状。对DockFile使用“Docker build”命令怎么样?在这些情况下,它看起来不起作用:Docker--DNS=209.18.47.61 build。2> &1 | tee./output.txtyeah这应该适用于docker build。docker build在命令本身上没有--dns标志,但是如果您在守护进程上像这样设置它,那么它将在使用docker build时应用谢谢您的解决方案。在我这边,问题是,docker显然需要IPv4可用并启用。世界跆拳道联盟?了解:IPv4已经死了。仅使用IPv4的软件已严重损坏。我已经完成了此步骤,并再次开始出现错误。重新启动服务再次修复了它。docker 1.7存在此问题,尽管我尝试使用--dns
选项运行它,或者将配置放入/etc/default/docker
中。CentOS等效文件是/etc/sysconfig/docker
文件,我可以将docker\u OPTS=“--dns 8.8.8”添加到该文件中
行并解决我的问题。OpenSuSE也有/etc/sysconfig/docker
文件。谢谢
FROM ubuntu:18.04
RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update
cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }
nmcli device show <interfacename> | grep IP4.DNS
125.22.47.102
cat /etc/docker/daemon.json
{"dns": ["125.22.47.102","8.8.8.8"] }
restart docker
sudo service docker restart