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

程式技術
sharkHead
解決使用 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

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言