Docker配置网络代理
大部分时候,我们在使用docker时可能由于网络原因(比如公司NAT、镜像拉取)需要通过配置代理来解决问题。Docker的代理稍微复杂一点,要分三个场景,基本原理都是通过系统代理(http_proxy环境变量)来实现。
对于拉取镜像困难的小伙伴来说配置代理是个不错的选择,特别是在目前国内各大docker镜像加速暂停服务的时期。
一、Dockerd代理
在执行docker pull命令时,是由守护进程dockerd来执行的。因此,代理需要配置在dockerd环境中。而这个环境是有systemd管控,所以实际上是systemd的配置。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/proxy.conf
在proxy.conf文件中配置一下内容:
[service]
Environment="HTTP_PROXY=http://proxyip:proxy_port"
Environment="HTTPS_PROXY=http://proxy_ip:proxy_port"
Environment="NO_PROXY=localhost,127.0.0.1,.xxxx.com"
其中proxy_ip:proxy_port换成自己的代理服务器地址(免密)。
检查代理设置
如果你的计算机连接到互联网时需要通过代理服务器,那么你需要确保Docker也配置了相应的代理设置。你可以使用以下命令来检查Docker的代理设置:
systemctl show --property=Environment docker
该命令将显示Docker服务的环境变量设置。你需要查找其中的HTTP_PROXY和HTTPS_PROXY设置,并确保它们正确配置为你的代理服务器地址和端口。如果没有设置代理,或者设置错误,你可以使用以下命令来修改它们:
sudo systemctl edit docker
这将打开一个文本编辑器,在其中你可以添加或修改Environment行以设置正确的代理地址和端口。修改后保存文件并退出编辑器,然后重启Docker服务以使更改生效。
二、Container代理
在容器运行阶段,如果容器的服务需要使用代理访问网络,则需要配置~/.docker/config.json。以下配置,只在Docker 17.07及以上版本生效。
{
"proxies":{
"default":{
"httpProxy":"http://proxy:port",
"httpsProxy":"http://proxy:port",
"noProxy":"localhost,127.0.0.1,example.com"
}
}
}
这个是用户级的配置,除了proxies,docker login等相关信息也会在其中。还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。
三、Docker Build代理
docker build的本质,也是启动一个容器。但是环境略有不同,用户级配置无效。在构建时需要注入http_proxy等参数。
docker build . \
--build-arg "HTTP_PROXY=http://proxy:port" \
--build-arg "HTTPS_PROXY=http://proxy:port" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.xxxx.com" \
-t xxxx/image_name:tag
注意:无论是docker run还是docker build,默认是网络隔绝的。如果代理使用的是localhost:8888这类则会无效。这类访问的本地的代理,必须加上--network host设置网络模式为host。
四、配置完成
代理配置完成后,reboot 重启当然可以生效,但不重启也行。
docker build 代理是在执行前设置的,所以修改后,下次执行立即生效。Container 代理的修改也是立即生效的,但是只针对以后启动的 Container,对已经启动的 Container 无效。
dockerd 代理的修改比较特殊,它实际上是改 systemd 的配置,因此需要重载 systemd 并重启 dockerd 才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker