Docker构建的时候执行网络请求很慢


Docker构建的时候run命令执行网络请求奇慢,执行apt-get update都要好几分钟,可是宿主机却很快,请教是什么原因,如何解决?(Ubuntu 14+Docker 1.5)
已邀请:

shlallen - DaoCloud软件工程师,合伙人

赞同来自: wisen zyx_today Keshawn


1.首先需要说明的是:您宿主机的ubuntu发行版,和容器中base_image的发行版是很有可能存在区别的。您本地的ubuntu发行版的软件源一般会是国内地址(比如说163源,中科大源等),而官方镜像中的源一般都是archive.ubuntu.com国外的源。两者存在区别。

2.由于国内网络的原因,连接archive.ubuntu.com很有可能非常慢。因此容器内的baseimage中使用国外源的话,在容器在国内运行,apt-get update会非常慢。

3.还有一点需要注意的是:您容器的DNS问题。一旦您运行docker daemon或者docker run时没有指定dns的,并且您宿主机的默认dns为127.0.0.1,那么docker daemon会自动给容器配置dns为8.8.4.4和8.8.8.8,而这两个DNS地址在国内使用时不是很稳定,因此也存在您域名解析缓慢甚至被阻的情况。

4.关于源的问题,我个人比较倾向于对base image知道的更多一些,随后在写Dockerfile的时候,第一步就替换为国内的软件源。

5.如果是dns的问题,那就配置--dns参数,再重新启动docker daemon

关于william老师所说的那种情况,大家和我也可以详细深入下,毕竟那是启动容器时的ulimit资源限制,也非常重要。

william - cSphere CEO

赞同来自: jamlee


如果是ubuntu系统,修改/etc/init/docker.conf,将里面的ulimit对nfile的设置降低到5000,然后重启service docker restart

这应该是apt的问题,在file no数量过大的情况下会变慢。在主机没有问题,因为主机默认的nfile是65000,而docker daemon的启动设定的过高50万。

陈飞

赞同来自: jamlee


估计主要是由于墙的原因,你可以试试网易的镜像源这样:
RUN sed -i 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//http:\/\/mirrors\.163\.com\/ubuntu\//g' /etc/apt/sources.list

田浩浩 - wizmacau developer

赞同来自:


最好用update后的镜像做为你的基础镜像

jamlee - keep me alone

赞同来自:


我的建议是将基础镜像修改一下,换个中科大的源,然后提交。在dockerfile的from这改成你新改的镜像。

HeartArea

赞同来自:


我在这儿记一下我遇到的坑,给后来的同学参考。
因为我是在openstack虚拟化之后的vm做的docker,那构建的容器也遇到同样的问题,把上面各位的办法都试了,还是不好使。最后在我司大神niuxiaonan的帮助下,调整了docker daemon的mtu参数,立马好使了。
步骤如下:
一,查看vm的eth0网卡的mtu

netstat -i

Kernel Interface tabl
Iface MTU Met RX-
docker0 1500 0

eth0 1400 0

lo 65536 0

veth549debc 1500 0

veth77818df 1500 0

看到值为1400,那因为docker默认的是1500,所以调整一下
二,

在docker的启动参数里增加 --mtu 1400 然后重启就好了。

-

要回复问题请先登录注册