在企业网络上建立映像期间网络调用失败


81

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

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

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


看看stackoverflow.com/questions/19210563/…这也可能解决您的问题
Thomasleveil 2014年

我也遇到了同样的问题。我忘了跑步apt-get update
matthiasbe

这些可能是“ Docker无法从Cisco AnyConnect提取DNS信息”的症状。forums.docker.com/t/…
Jason

Answers:


92

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

这些Google服务器无法从防火墙后面访问,这就是为什么我们无法解析任何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

二进制文件

如果您通过binaries方法安装了Docker(即无软件包),则在启动Docker守护程序时设置DNS服务器:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &

4
在Dockfiles中使用'docker build'命令该怎么办...在这种情况下看起来不起作用:docker --dns = 209.18.47.61 build。2>&1 | 发球./output.txt
Quasaur 2014年

2
是的,这应该适用于docker build。docker build在命令本身上没有--dns标志,但是如果在这样的守护进程上设置它,则它将在使用
docker

谢谢您的解决方案。在我这边,问题是,码头工人显然需要IPv4可用并启用。WTF?了解:IPv4已死。仅IPv4的软件已严重损坏。
蒂诺2014年

1
我已经完成了这一步,并再次开始获取错误。重新启动服务后,再次将其修复。
Andrew Grothe

我在docker 1.7中遇到了这个问题,尽管我尝试使用--dns选项运行它或将配置放入/etc/default/docker
Patryk

64

我建议更改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

此处提供分步说明修复Docker的网络DNS配置


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服务docker.io重新启动 

1
相当于CentOS的/etc/sysconfig/docker文件,我可以在其中添加DOCKER_OPTS="--dns 8.8.8.8"行并解决我的问题。
MarkHu

11

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

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

1
谢谢!编辑后,docker.service我不得不停止sudo service docker stopsystemctl daemon-reloadsudo service docker start
docker

1
最好不要/etc/systemd/system/docker.service.d以修改后的配置添加单位文件(systemd有助于合并/覆盖系统配置),而不要更改系统版本。后者将在升级时丢失。
拉曼

6

在Mac和Windows上的Docker(至少> = 1.13,可能更早),可以在Preferences-> Daemon-> Advanced中配置DNS:

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

Docker守护进程高级配置


5

将您的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/


这是边界链接的答案。您应该扩展答案以在此处包含尽可能多的信息,并且仅将链接用作参考。
再见StackExchange,

如果您通过按扣安装daemon.json将在/var/snap/docker/<id>/config/daemon.json
sjt003

3

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

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

FROM ubuntu:18.04

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

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

缺点:

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

1

在我的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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.