Docker – 在企业networking上构build映像时networking调用失败

我在公司networking上构buildDocker镜像时遇到问题。 我刚开始使用Docker,所以我有一个hello-worldtypes的应用程序的下面的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"] 

当我在家里的笔记本电脑上,在我自己的无线networking上build立它的时候,这个工作正常。 它拉下必要的依赖关系,并正确地构build图像。

但是,当我在公司networking上工作时,在尝试从download.fedoraproject.org下载RPM时,此相同的Docker生成失败,并显示以下错误消息:

第2步:运行rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm —>在e0c26afe9ed5中运行curl:(5)Couldn'解决代理“proxy.fsglobal.net”错误:跳过http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm – 传输失败

在我的公司networking上,我可以通过笔记本电脑访问该URL。 但一旦Docker试图build立这个容器,突然之间根本就无法解决。 这种行为对于各种外部资源(apt-get等)来说是一样的:它们都可以在公司networking上的笔记本电脑上正确parsing,但是Docker无法解决这些问题。

我没有networking知识来弄清楚这里发生了什么。 有没有人知道为什么这个奇怪的行为将在build设Docker容器时发生?

我能弄清楚这个问题。 在Ubuntu上,Docker将容器的DNS服务器设置为8.8.8.x的Google服务器。 据我所知,这是Ubuntu的解决方法,因为Ubuntu将/etc/resolv.conf设置为127.0.0.1。

这些Google服务器无法从我们的防火墙后面访问,这就是为什么我们无法parsing任何URL。

解决的办法是告诉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> & 

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

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

那么你只需要重新启动泊坞服务:

 sudo service docker restart 

一步一步的解释可以在这里修复Docker的networkingDNSconfiguration

以下步骤适用于我(用于docker build和docker run命令)。 我的Linux版本是Ubuntu 14.04。

  • 使用以下命令识别DNS。
      nm-tool |  grep DNS 

这个结果DNS:192.168.1.1在我的情况下

  • 在/etc/default/docker.io中创build条目。 我目前的条目是这样的
  DOCKER_OPTS =“ -  dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1” 
  • 重新启动docker服务
  sudo服务docker.io重启 

对于使用SystemD(Ubuntu 16,RHEL 7 …)的任何Linux发行版,path将使用以下命令显示:

 $ 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 

path将是/lib/systemd/system/docker.service 。 在启动守护程序的行中添加可以具有任何DOCKER_OPTS值。

 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:// 

在Mac和Windows上,Docker(至less> = 1.13,可能更早)允许你在首选项 – >守护进程 – >高级configurationDNS:

以下configuration设置两个公司的DNS服务器(在这里使用你自己的价值)与谷歌公共DNS服务器回退。

Docker守护进程高级配置