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

解決使用 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

參考資料

Allen
written by
Allen

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

則留言
顯示更多留言
新增留言
訪客 2026 年 10 月 17 日