在国内 docker build 的正确姿势
MarTcy
8年前
<p>由于某些原因,在国内构建第三方docker镜像是一件考验耐心的事情。在神奇的国度生活,自然也要用神奇的生活方式。跟解决其他同类问题一样,解决这个问题常用两种方法,一曰换源,二曰代理。</p> <h2>换源</h2> <p>我们使用 docker 的时候,其实是启动一个 docker client 来跟后台运行的 docker daemon 通讯。 docker daemon --help 显示,可以通过 --registry-mirror= 指定 docker 的镜像源。国内有不少 docker 的镜像源,比如中科大LUG、阿里云、DaoCloud。以中科大的镜像源为例,可以这样指定镜像源:</p> <pre> --registry-mirror=https://docker.mirrors.ustc.edu.cn</pre> <p>docker daemon 通常作为一个服务由系统在开机时启动,所以我们需要把上面的指令加到服务的配置中。</p> <p>如果你的Linux发行版(较旧)使用 SysVinit 来启动,你需要打开 /etc/default/docker 这个文件,修改下面内容:</p> <pre> # Use DOCKER_OPTS to modify the daemon startup options. DOCKER_OPTS="" # 把镜像的选项加在这里</pre> <p>如果你的Linux发行版较新,应该是使用 Systemd 来启动,需要使用 sudo systemctl edit docker.service 打开配置文件。如果你的 Systemd 版本不够高,不支持 edit 命令,就需要手动打开 /lib/systemd/system/docker.service 或其他 docker.service 所在的位置。然后在 ExecStart=/usr/bin/docker daemon -H fd:// 这一行后面加上镜像的选项。</p> <p>如果你使用的是 OS X,docker Beta 提供了图形化界面来修改镜像源:</p> <p>先选择 preferences... 菜单,</p> <p><img src="https://simg.open-open.com/show/1c358d2ffcd0ac6c75be76a1012283a8.png"></p> <p>然后在 Advanced 一栏下应该能看到:</p> <p><img src="https://simg.open-open.com/show/3f43fd73da42e3576d48dffc1ed0e244.png"></p> <p>Windows 上的 docker Beta 估计也提供了相似的图形化修改界面。</p> <p>值得注意的是,由于 docker daemon 默认用 HTTPS 通讯,如果你选用的源不支持 HTTPS,需要同时在 --insecure-registry= 选项中指定镜像源的域名,以作豁免。</p> <p>现在 docker pull 的时候,就会去拉国内的镜像,速度改善了不少呢。</p> <h2>代理</h2> <p>尽管现在 docker pull 的速度上去了, docker build 的速度依然挺慢的。毕竟比起花在第一个 FROM 指令的时间,后面一层层构建才是耗时的大头。由于第三方 Dockerfile 通常不会设定成用国内的源,更新软件包的速度一直是龟速,而且还经常出错。看来光换源还是不够的,还要挂个代理。</p> <p>幸运的是,docker 提供了对 HTTP 代理的支持。你所需的,不过是在启动 docker daemon 的时候设置下 HTTP_PROXY 环境变量,比如 HTTP_PROXY=xxx.com:xxxx docker daemon 。修改的方式请参考上面的“换源”一节。(注:设置 http_proxy 也是可以的, docker 会先查找 HTTP_PROXY 环境变量,如果找不到再继续查找全小写的版本)</p> <p>一般大一点的公司会提供可以跟国际互联网互联的 HTTP 代理。如果贵司不提供,抑或你是在家里使用 docker,可以用 cow 做转发,用 ss 作为二级代理来实现 HTTP 代理。</p> <p> </p> <p>来自:https://segmentfault.com/a/1190000006146697</p> <p> </p>