在 Docker 使用 Proxy 設定方法

前陣子因為工作上遇到線路品質問題,需要透過 Proxy 來 pull 各 Docker image。網路上提供了幾種方法,記錄一下:

Docker 17.06 之前

使用環境變數來設定 Proxy server 資訊:

Variable Dockerfile example docker run Example
HTTP_PROXY ENV HTTP_PROXY “http://127.0.0.1:3001" –env HTTP_PROXY=”http://127.0.0.1:3001"
HTTPS_PROXY ENV HTTPS_PROXY “https://127.0.0.1:3001" –env HTTPS_PROXY=”https://127.0.0.1:3001"
FTP_PROXY ENV FTP_PROXY “ftp://127.0.0.1:3001" –env FTP_PROXY=”ftp://127.0.0.1:3001"
NO_PROXY ENV NO_PROXY “*.test.example.com,.example2.com” –env NO_PROXY=”*.test.example.com,.example2.com”

Docker 17.07 以後

於全域的 /etc/docker/config.json 或家目錄的 ~/.docker/config.json 中加入:

1
2
3
4
5
6
7
8
9
10
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "https://127.0.0.1:3001",
"ftpProxy": "ftp://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}

然後重啟 Docker 服務:

1
sudo service docker restart

Docker 是透過 SysVinit 管理的

若 docker daemon 是透過 SysVinit 來管理的話 (Ubuntu 14),可以使用下列方式修改。

編輯 /etc/default/docker,加入:

1
2
3
export http_proxy="http://127.0.0.1:3001"
export https_proxy="https://127.0.0.1:3001"
export ftp_proxy="ftp://127.0.0.1:3001"

然後重啟 Docker 服務:

1
sudo service docker restart

Docker 是透過 Systemd 管理的

若 docker daemon 是透過 Systemd 來管理的話 (Ubuntu 16/18),也可以使用下列方式修改。

新增或編輯 /etc/systemd/system/docker.service.d/http-proxy.conf,加入:

1
2
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:3001/"

新增或編輯 /etc/systemd/system/docker.service.d/https-proxy.conf,加入:

1
2
[Service]
Environment="HTTPS_PROXY=https://127.0.0.1:3001/"

新增或編輯 /etc/systemd/system/docker.service.d/ftp-proxy.conf,加入:

1
2
[Service]
Environment="FTP_PROXY=ftp://127.0.0.1:3001/"

然後重啟 Docker 服務:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

References