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

dsw*_*w88 71 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"]
Run Code Online (Sandbox Code Playgroud)

当我在家里的笔记本电脑上,在我自己的无线网络上构建它时,这很好用.它可以下拉必需的依赖项并正确构建映像.

但是,当我在公司网络上工作时,尝试从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容器时会发生这种奇怪的行为?

dsw*_*w88 85

我弄清楚了这个问题.在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>"
Run Code Online (Sandbox Code Playgroud)

您可以根据需要为此配置添加任意数量的DNS服务器.编辑完此文件后,您将需要重新启动Docker服务:

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

二进制

如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
Run Code Online (Sandbox Code Playgroud)

  • 如何在Dockfiles中使用'docker build'命令...在这些情况下看起来不像它:docker --dns = 209.18.47.61 build.2>&1 | tee ./output.txt (4认同)
  • 是的,这应该与docker build一起使用.docker build在命令本身上没有--dns标志,但如果你在守护进程上设置它,那么它将在使用docker build时应用 (2认同)

l.a*_*iak 58

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

{"dns": ["10.0.0.2", "8.8.8.8"] }
Run Code Online (Sandbox Code Playgroud)

然后你需要重新启动docker服务:

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

此处提供了分步说明Fix Docker的网络DNS配置


Bal*_*hna 19

以下步骤适用于我(对于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 

  • CentOS 等价物是 `/etc/sysconfig/docker` 文件,我可以在其中添加 `DOCKER_OPTS="--dns 8.8.8.8"` 行并解决我的问题。 (2认同)

Mar*_*les 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
Run Code Online (Sandbox Code Playgroud)

路径是/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://
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 6

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

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

Docker守护进程高级配置


als*_*ora 6

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

首先获取你的DNS地址

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2
Run Code Online (Sandbox Code Playgroud)

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

$ docker run --dns 10.0.0.2 <image_name> <command_name>
Run Code Online (Sandbox Code Playgroud)

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

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

将以下行添加到此文件

{
"dns": ["10.0.0.2", "8.8.8.8"]
}
Run Code Online (Sandbox Code Playgroud)

重启泊坞窗

$ sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

可以在此处找到完成所有此过程的非常好的指南。

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