Dns 在公司网络上构建映像期间,网络呼叫失败

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映像时遇到问题。我刚刚开始使用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 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
这个结果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对于任何使用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
将IP
123.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