企业网络上的映像构建期间网络调用失败

时间:2014-06-10 21:26:30

标签: dns docker

我在公司网络上构建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步:RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm    --->在e0c26afe9ed5中运行   curl:(5)无法解析代理'some.proxy.address'   错误:跳过http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - 传输失败

在我的公司网络上,我可以通过笔记本电脑轻松访问该网址。但是一旦Docker尝试构建容器,突然间它根本无法解决。对于各种外部资源(apt-get等),这种行为是相同的:它们都可以在公司网络上的笔记本电脑上解决得很好,但Docker无法解决它们。

我没有网络专业知识来弄清楚这里发生了什么。有谁知道为什么在构建Docker容器时会发生这种奇怪的行为?

8 个答案:

答案 0 :(得分:84)

我能够找出问题所在。在Ubuntu上,Docker将容器的DNS服务器设置为8.8.8.x的Google服务器。据我了解,这是Ubuntu的一种解决方法,因为Ubuntu将/etc/resolv.conf设置为127.0.0.1。

我们的防火墙后面无法访问这些Google服务器,这就是我们无法解析任何网址的原因。

解决方法是告诉Docker使用哪些DNS服务器。此修复程序取决于您安装Docker的方式:

Ubuntu软件包

如果您安装了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> &

答案 1 :(得分:52)

我建议更改Docker守护程序的DNS设置。您可以通过在 /etc/docker/daemon.json 中创建守护程序配置文件来设置docker守护程序的默认选项。根据您的主机设置DNS服务器,例如我的DNS服务器是10.0.0.2:

{"dns": ["10.0.0.2", "8.8.8.8"] }

然后你需要重新启动docker service:

sudo service docker restart

此处提供了分步说明Fix Docker's networking DNS config

答案 2 :(得分:18)

以下步骤适用于我(对于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 service
 sudo service docker.io restart 

答案 3 :(得分:10)

对于使用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://

答案 4 :(得分:5)

Mac和Windows上的Docker(至少> = 1.13,可能更早)允许您在首选项中配置DNS - &gt;守护进程 - &gt;高级:

以下配置将两个公司DNS服务器(在此处使用您自己的值)设置为回退到Google公共DNS服务器。

Docker Daemon Adv Config

答案 5 :(得分:4)

将您的DNS指定到Docker守护程序。

首先获取您的DNS地址

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

通过启动一个强制该新DNS的docker容器,测试问题是否真的出在DNS上

$ docker run --dns 10.0.0.2 <image_name> <command_name>

如果这解决了问题,则可以通过以下方式将此修复程序应用于所有docker守护程序

编辑或创建文件 /etc/docker/daemon.json

将以下行添加到此文件

{
"dns": ["10.0.0.2", "8.8.8.8"]
}

重启docker

$ sudo service docker restart

可以在这里找到执行所有此过程的非常好的指南。

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

答案 6 :(得分:2)

无需重启Docker服务的解决方案

通过在构建时覆盖docker build,可以修改单个Docker映像的DNS设置而不会影响其他resolv.conf调用(并且无需重新启动Docker服务):

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

用公司网络中使用的IP替换IP 123.123.123.123(使用nmcli dev show | grep 'IP4.DNS'获取当前使用的DNS服务器)。

缺点:

  • 这不会影响Dockerfile中的任何其他行。因此,如果依赖于DNS解析,则必须在每行前添加修复程序

答案 7 :(得分:0)

在我的Ubuntu 16.04计算机上,有时Google的DNS无法用于构建Docker映像。

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

我必须使用以下命令手动找出我的服务提供商DNS

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

并如下所示将其添加到我的daemon.json

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(Ubuntu 15.04不推荐使用PS nm-tool)