解決使用 Proxy 導致 Docker 無法拉取 Image 的問題

某天在公司內部申請一個 VM (Virtual machine) 來做 PoC (Proof of concept)。一開始拿到 VM 發現無法上網,原來我們公司對內部網路的控管較為嚴謹,內部的 VM 會要求使用 proxy 來對外連線。
使用 proxy 還有一個好處是可以減少公共 IP 的使用,因為有時候無法給所有 VM 一個可以連上網的 IP,因此統一透過 proxy 對外連線是一種很常見的操作。
我們可以在 .bashrc
或是 /etc/environment
中設定環境變數來修改 proxy,例如:
修改
.bashrc
只會在單一用戶底下生效,/etc/environment
為全域生效。
export HTTP_PROXY=http://proxy.example.com:8888
export HTTPS_PROXY=https://proxy.example.com:8889
Proxy 設定生效後,發現雖然可以正常上網,但 Docker 的拉取 image 操作還是會失敗,詢問一下前輩公司內部是否有阻擋 Docker?(我個人感覺也不太可能) 前輩說到可能是 proxy 的問題,因為 Docker 的 daemon 並不會去讀取系統的環境變數。
前輩點了一下後,我大概知道問題出在哪邊,Docker 官方文件中有兩種修改 daemon 內 proxy 的方式。
設定 Daemon 啟動後的環境變數
我們需要在 /etc/systemd/system/docker.service.d/
中建立一個 http-proxy.conf
檔案,內容如下:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8888"
Environment="HTTPS_PROXY=https://proxy.example.com:8889"
接著重新啟動 Docker daemon:
sudo systemctl daemon-reload
sudo systemctl restart docker
Daemon 重新啟動後,就能執行指令 docker pull
拉取 image 了。
使用 daemon.json
設定 Proxy
在 Docker 23.0 之後的版本,都可以透過修改 daemon.json
來修改 proxy 的設定。
首先建立一個 daemon.json
檔案:
sudo touch /etc/docker/daemon.json
並在 daemon.json
檔案中寫入以下的內容:
{
"proxies": {
"http-proxy": "http://proxy.example.com:8888",
"https-proxy": "https://proxy.example.com:8889",
"no-proxy": ""
}
}
上述兩種做法都可以修改 docker daemon 的 proxy。
另外別忘記啟動的 container 也要使用 --env
參數來設定環境變數,否則 container 內也無法對外連線:
docker run \
--env HTTP_PROXY=http://proxy.example.com:8888 \
--env HTTPS_PROXY=http://proxy.example.com:8888 \
-it ubuntu:20.04 bash