在國內 docker build 的正確姿勢
由于某些原因,在國內構建第三方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... 菜單,
然后在 Advanced 一欄下應該能看到:
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 代理。
來自:https://segmentfault.com/a/1190000006146697