为 docker pull 配置代理
Haiya Lv3

概述

在系统配置了代理的情况下,docker pull 依然无法下载镜像,提示 Error response from daemon: Get https://registry-1.docker.io

产生这个问题的原因是因为 Docker 在拉取镜像时,并不使用系统配置的代理,而是使用 Docker daemon 的配置。

解决方案

方法一:修改 daemon.json registry-mirrors 配置

该方法需要使用能正常访问的镜像代理。

1
2
3
4
5
6
7
8
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://YOUR-DOCKER-PROXY.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

方法二:配置 Docker proxies

某些情况下,镜像代理也无法被访问,这时就需要使用 HTTPS 代理来拉取镜像。该方法需要使用能正常访问 Docker 镜像源的 HTTPS 代理。[1]

以下两种方式任选其一:

daemon.json

1
2
3
4
5
6
7
8
9
10
11
12
sudo tee /etc/docker/daemon.json  <<EOF
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

systemd unit file

1
2
3
4
5
6
7
8
9
10
11
sudo mkdir -p /etc/systemd/system/docker.service.d

sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://YOUR-HTTP-PROXY.com:PORT/"
Environment="HTTPS_PROXY=http://YOUR-HTTPS-PROXY.com:PORT/"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

代理值中的特殊字符(例如 #?!()[]{})必须使用 %% 进行双重转义。例如:

1
2
[Service]
Environment="HTTP_PROXY=http://domain%%5Cuser:complex%%23pass@proxy.example.com:3128/"

验证:

1
sudo systemctl show --property=Environment docker

输出:

1
Environment=HTTP_PROXY=http://代理地址 HTTPS_PROXY=http://代理地址

Tips

注意,以上配置代理的方式并不影响容器内部网络,要为容器配置代理,请参考Use a proxy server with the Docker CLI [2]

References

由 Hexo 驱动 & 主题 Keep