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 代理。


spacewander
5.6k 声望1.5k 粉丝

make building blocks that people can understand and use easily, and people will work together to solve the very largest problems.