在使用 Docker 的时候因为各种各样的原因经常会用到代理,但是有没有小伙伴在网上搜索发现代理设置了 Docker 不认呢,就让小编来带你看看怎么会事吧。

其实 Docker 的代理设置分为三种场景——CLI 下的、容器中的和构建时的。对应的具体使用场景分别是 docker pull、容器运行过程中以及 docker build 过程中。

Docker pull

Docker CLI 的操作由 dockerd 执行,因此需要设置 systemd 的代理。

在文件 /etc/systemd/system/docker.service.d/proxy.conf 中写入:

1
2
3
4
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"

然后重启

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

容器中

容器运行过程中的代理在 Docker 自身的配置文件中设定:

1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}

设置代理之前启动的容器不生效,需要重启容器。

Build

Build 过程也是在一个容器中,要让 build 过程走代理需要单独配置构建参数:

1
2
3
4
5
docker build . \
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag

无需重启。

参考

本文为如何优雅的给 Docker 配置网络代理存档)的笔记。