Linux Docker使用代理

Rogunt發表於2024-08-06

面對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

相關文章