Docker - 在企业网络中构建映像时,网络呼叫失败 [英] Docker - Network calls fail during image build on corporate network

查看:139
本文介绍了Docker - 在企业网络中构建映像时,网络呼叫失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在公司网络上构建Docker图像时遇到了问题。我刚刚开始使用Docker,所以我有一个hello-world类型的应用程序的Dockerfile:

 #DOCKER- VERSION 0.3.4 
FROM centos:6.4
#启用Node.js的EPEL
运行rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel -release-6-8.noarch.rpm
#安装Node.js和npm
运行yum install -y npm
#捆绑应用程序源
添加。 / src
#安装应用程序依赖项
RUN cd / src; npm安装
EXPOSE 8080
CMD [node,/src/index.js]

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



然而,当我在工作中的公司网络上时,同样的Docker构建在尝试下拉时失败来自download.fedoraproject.org的RPM,出现以下错误信息:


步骤2:运行rpm -Uvh http://download.fedoraproject.org/pub/epel/6/ i386 / epel-release-6-8.noarch.rpm
--->在e0c26afe9ed5中运行
curl:(5)无法解析代理proxy.fsglobal.net
错误:跳过 http:/ /download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - 转移失败


在我的公司网络上,我可以从我的笔记本电脑访问该网址。但是,一旦Docker正在尝试构建容器,突然间就无法解决。对于各种外部资源(apt-get等),这种行为是一样的:他们都可以在公司网络上的笔记本电脑上解决问题,但Docker无法解决问题。



我没有网络技术知道这里发生了什么。有人知道为什么在构建Docker容器时会发生这种奇怪的行为?

解决方案

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



这些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 



二进制文件



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

  sudo docker -d -D  - -dns< your_dns_server_1> --dns< your_dns_server_2> &安培; 


I'm having a problem building Docker images on my corporate network. I'm just getting started with Docker, so I have the following Dockerfile for a hello-world type app:

# 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"]

This works fine when I build it on my laptop at home, on my own wireless network. It pulls down the requisite dependencies and builds the image correctly.

However, when I'm on my corporate network at work, this same docker build fails when trying to pull down the RPM from download.fedoraproject.org, with this error message:

Step 2 : RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Running in e0c26afe9ed5 curl: (5) Couldn't resolve proxy 'proxy.fsglobal.net' error: skipping http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - transfer failed

On my corporate network, I can access that URL just fine from my laptop. But once Docker is trying to build the container, all of a sudden it can't resolve at all. This behavior is the same for a variety of external resources (apt-get, etc.): They all can resolve just fine on my laptop on the corporate network, but Docker can't resolve them.

I don't have the network know-how to figure out what's going on here. Does anyone know why this strange behaviour would be occurring when building Docker containers?

解决方案

I was able to figure out the issue. On Ubuntu, Docker sets the DNS servers for container to Google's servers at 8.8.8.x. As I understand it, this is a workaround on Ubuntu due to the fact that Ubuntu sets /etc/resolv.conf to be 127.0.0.1.

Those Google servers weren't accessible from behind our firewall, which is why we couldn't resolve any URLs.

The fix is to tell Docker which DNS servers to use. This fix depends on how you installed Docker:

Ubuntu Package

If you have the Ubuntu package installed, edit /etc/default/docker and add the following line:

DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"

You can add as many DNS servers as you want to this config. Once you've edited this file you'll want to restart your Docker service:

sudo service docker restart

Binaries

If you've installed Docker via the binaries method (i.e. no package), then you set the DNS servers when you start the Docker daemon:

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

这篇关于Docker - 在企业网络中构建映像时,网络呼叫失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆