面對docker pull下載速度過慢,甚至根本無法正常下載的問題,下面介紹三種方法解決Docker聯網的問題。
內容轉載自:https://note.qidong.name/2020/05/docker-proxy/ 有所修改
通常的在終端中設定http_proxy的環境變數不能代理docker pull的流量,原因在於docker的流量是systemd管理的,與終端的環境變數無關。
dockerd代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/proxy.conf
在這個proxy.conf檔案(可以是任意*.conf的形式)中,新增以下內容:
[Service]
Environment="HTTP_PROXY=http://192.168.0.10:7890/"
Environment="HTTPS_PROXY=http://192.168.0.10:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
要把上文的代理伺服器地址換成你自己的,書寫方式與http_proxy環境變數一致 (http://username:password@ip_address:port/)
Container代理
在容器執行階段,如果需要代理上網,則需要配置~/.docker/config.json
。以下配置,只在Docker 17.07及以上版本生效。
{
"proxies":
{
"default":
{
"httpProxy": "http://192.168.0.10:7890",
"httpsProxy": "http://192.168.0.10:7890",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
這一段本質上是在容器執行後,新增環境變數到容器的環境下,即根據配置自動設定http_proxy https_proxy HTTP_PROXY HTTPS_PROXY等環境變數。因此,對於不使用上述環境變數進行網路連線的linux程式來說,流量可能不會經過代理伺服器。
docker build代理
雖然docker build的本質,也是啟動一個容器,但是環境會略有不同,使用者級配置無效。在構建時,需要注入http_proxy等引數。
docker build . \
--build-arg "HTTP_PROXY=http://192.168.0.10:7890/" \
--build-arg "HTTPS_PROXY=http://192.168.0.10:7890/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag
注意:無論是docker run還是docker build,預設是網路隔絕的。如果代理使用的是localhost:3128這類,則會無效。這類僅限本地的代理,必須加上--network host才能正常使用。而一般則需要配置代理的外部IP,而且代理本身要開啟gateway模式。
重啟生效
代理配置完成後,reboot重啟當然可以生效,但不重啟也行。
docker build代理是在執行前設定的,所以修改後,下次執行立即生效。Container代理的修改也是立即生效的,但是隻針對以後啟動的Container,對已經啟動的Container無效。
dockerd代理的修改比較特殊,它實際上是改systemd的配置,因此需要過載systemd並重啟dockerd才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker