配置网络代理
如在一些特定环境下,需要在代理环境下使用 Docker 的某些功能,本文介绍一些场景下如何配置网络代理
本文使用的 docker 版本是
❯ docker --version
Docker version 26.1.3, build b72abbb
为 Docker Daemon 配置代理
systemd
配置
为了使docker pull
指令使用代理,需要在/lib/systemd/system/docker.service
中的[Service]
片段下添加HTTP_PROXY
和HTTPS_PROXY
环境变量:
[Service]
Environment="HTTP_PROXY=http://<user>:<password>@<domain>:<port>"
Environment="HTTPS_PROXY=http://<user>:<password>@<domain>:<port>"
Environmeng="NO_PROXY=<registry.domain>"
ExecStart=...
...
注意:尖括号<>
中的内容需要替换为自己的代理服务器信息
随后刷新配置:
此时可以通过以下指令检查配置是否加载成功:
systemctl show --property Environment docker
Environment=HTTP_PROXY=http://<user>:<password>@<domain>:<port> HTTPS_PROXY=http://<user>:<password>@<domain>:<port> NO_PROXY=<registry.domain>
重启 Docker 服务使配置生效
重启成功之后通过docker info
指令查看 docker 服务中的代理配置
docker info | grep Proxy
HTTP Proxy: http://<user>:<password>@<domain>:<port>
HTTPS Proxy: http://<user>:<password>@<domain>:<port>
No Proxy: <registry.domain>
此时再使用docker pull
指令拉取镜像时 Docker 服务会使用代理服务器拉取镜像。
此外,systemd
也会从/etc/systemd/system/docker.service.d
和/lib/systemd/system/docker.service.d
文件夹下读取配置,所以可以再其中一个文件夹中创建一个名为http-proxy.conf
的文件用来保存代理信息。内容如下:
[Service]
Environment="HTTP_PROXY=http://<user>:<password>@<domain>:<port>"
Environment="HTTPS_PROXY=http://<user>:<password>@<domain>:<port>"
Environmeng="NO_PROXY=<registry.domain>"
daemon.json
配置
在 Docker Engine 23.0 及更高版本中,可以在/etc/docker/daemon.json
中增加代理配置, 这些配置会覆盖默认的docker.service
systemd 文件:
{
"registry-mirrors": ["..."],
"proxies": {
"http-proxy": "http://<user>:<password>@<domain>:<port>",
"https-proxy": "http://<user>:<password>@<domain>:<port>",
"no-proxy": "<registry.domain>"
}
}
重启 Docker 服务:
检查配置是否生效:
docker info| grep Proxy
HTTP Proxy: http://<user>:<password>@<domain>:<port>
HTTPS Proxy: http://<user>:<password>@<domain>:<port>
No Proxy: <registry.domain>
注意: 通过daemon.json
方式配置的优先级会高于通过systemd
配置。
在容器中使用代理
命令行配置
docker run --env HTTP_PROXY="http://<user>:<password>@<domain>:<port>" <some-image>
验证
docker run \
--env HTTP_PROXY="http://<user>:<password>@<domain>:<port>" \
--rm alpine sh -c 'env | grep -i _PROXY'
HTTP_PROXY=http://<user>:<password>@<domain>:<port>
config.json
配置
在~/.docker/config.json
中增加以下配置:
{
"auths": {
"..."
},
"proxies": {
# 通用配置,会对当前客户端连接的所有Docker服务生效
"default": {
"httpProxy": "http://proxy.example.com:3128",
"httpsProxy": "https://proxy.example.com:3129",
"noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
},
# 如果只对某个Docker服务时配置代理,则需要通过 docker-host: proxy-settings的方式在下面配置
"tcp://docker-daemon1.example.com": {
"noProxy": "*.internal.example.net"
}
}
}
验证:
docker run --rm alpine sh -c 'env | grep -i _PROXY'
HTTPS_PROXY=https://proxy.example.com:3129
no_proxy=*.test.example.com,.example.org,127.0.0.0/8
NO_PROXY=*.test.example.com,.example.org,127.0.0.0/8
https_proxy=https://proxy.example.com:3129
http_proxy=http://proxy.example.com:3128
HTTP_PROXY=http://proxy.example.com:3128
在构建镜像的过程中使用代理
config.json
配置
通过~/.docker/config.json
的方式配置代理在构建过程中依然有效。
验证:
docker build \
--no-cache \
--progress=plain \
- <<EOF
FROM alpine
RUN env | grep -i _PROXY
EOF
命令行配置
docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128"
验证
docker build --build-arg HTTP_PROXY="http://another-proxy.example.com:3128" \
--no-cache \
--progress=plain \
- <<EOF
FROM alpine
RUN env | grep -i _PROXY
EOF
不要在
Dockerfile
中使用ENV
指令配置构建过程中使用到的代理配置
使用环境变量配置构建过程中用到的代理配置会把代理服务器打包进镜像中,如果代理服务器是私有化部署的服务器,通过此镜像创建的容器可能访问不到代理服务器,产生难以理解的错误。
同时,由于代理配置中可能包含敏感信息,把代理服务器信息嵌入到镜像中也有可能造成一些安全隐患。