在国内 docker build 的正确姿势

3

由于某些原因,在国内构建第三方docker镜像是一件考验耐心的事情。在神奇的国度生活,自然也要用神奇的生活方式。跟解决其他同类问题一样,解决这个问题常用两种方法,一曰换源,二曰代理。

换源

我们使用 docker 的时候,其实是启动一个 docker client 来跟后台运行的 docker daemon 通讯。docker daemon --help 显示,可以通过 --registry-mirror= 指定 docker 的镜像源。国内有不少 docker 的镜像源,比如中科大LUG、阿里云、DaoCloud。以中科大的镜像源为例,可以这样指定镜像源:

--registry-mirror=https://docker.mirrors.ustc.edu.cn

docker daemon 通常作为一个服务由系统在开机时启动,所以我们需要把上面的指令加到服务的配置中。

如果你的Linux发行版(较旧)使用 SysVinit 来启动,你需要打开 /etc/default/docker 这个文件,修改下面内容:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="" # 把镜像的选项加在这里

如果你的Linux发行版较新,应该是使用 Systemd 来启动,需要使用 sudo systemctl edit docker.service 打开配置文件。如果你的 Systemd 版本不够高,不支持edit命令,就需要手动打开 /lib/systemd/system/docker.service 或其他 docker.service 所在的位置。然后在 ExecStart=/usr/bin/docker daemon -H fd:// 这一行后面加上镜像的选项。

如果你使用的是 OS X,docker Beta 提供了图形化界面来修改镜像源:
先选择 preferences... 菜单,

preferences

然后在 Advanced 一栏下应该能看到:

registry-mirror

Windows 上的 docker Beta 估计也提供了相似的图形化修改界面。

值得注意的是,由于 docker daemon 默认用 HTTPS 通讯,如果你选用的源不支持 HTTPS,需要同时在 --insecure-registry= 选项中指定镜像源的域名,以作豁免。

现在 docker pull 的时候,就会去拉国内的镜像,速度改善了不少呢。

代理

尽管现在 docker pull 的速度上去了,docker build 的速度依然挺慢的。毕竟比起花在第一个 FROM 指令的时间,后面一层层构建才是耗时的大头。由于第三方 Dockerfile 通常不会设定成用国内的源,更新软件包的速度一直是龟速,而且还经常出错。看来光换源还是不够的,还要挂个代理。

幸运的是,docker 提供了对 HTTP 代理的支持。你所需的,不过是在启动 docker daemon 的时候设置下 HTTP_PROXY 环境变量,比如 HTTP_PROXY=xxx.com:xxxx docker daemon。修改的方式请参考上面的“换源”一节。(注:设置 http_proxy 也是可以的, docker 会先查找 HTTP_PROXY 环境变量,如果找不到再继续查找全小写的版本)

一般大一点的公司会提供可以跟国际互联网互联的 HTTP 代理。如果贵司不提供,抑或你是在家里使用 docker,可以用 cow 做转发,用 ss 作为二级代理来实现 HTTP 代理。

你可能感兴趣的

载入中...