Linux Docker使用代理
面对docker pull下载速度过慢,甚至根本无法正常下载的问题,下面介绍三种方法解决Docker联网的问题。
内容转载自:https://note.qidong.name/2020/05/docker-proxy/ 有所修改
通常的在终端中设置http_proxy的环境变量不能代理docker pull的流量,原因在于docker的流量是systemd管理的,与终端的环境变量无关。
dockerd代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/proxy.conf
在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:
[Service]
Environment="HTTP_PROXY=http://192.168.0.10:7890/"
Environment="HTTPS_PROXY=http://192.168.0.10:7890/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
要把上文的代理服务器地址换成你自己的,书写方式与http_proxy环境变量一致 (http://username:password@ip_address:port/)
Container代理
在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json
。以下配置,只在Docker 17.07及以上版本生效。
{
"proxies":
{
"default":
{
"httpProxy": "http://192.168.0.10:7890",
"httpsProxy": "http://192.168.0.10:7890",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
这一段本质上是在容器运行后,添加环境变量到容器的环境下,即根据配置自动设置http_proxy https_proxy HTTP_PROXY HTTPS_PROXY等环境变量。因此,对于不使用上述环境变量进行网络连接的linux程序来说,流量可能不会经过代理服务器。
docker build代理
虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。在构建时,需要注入http_proxy等参数。
docker build . \
--build-arg "HTTP_PROXY=http://192.168.0.10:7890/" \
--build-arg "HTTPS_PROXY=http://192.168.0.10:7890/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag
注意:无论是docker run还是docker build,默认是网络隔绝的。如果代理使用的是localhost:3128这类,则会无效。这类仅限本地的代理,必须加上--network host才能正常使用。而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。
重启生效
代理配置完成后,reboot重启当然可以生效,但不重启也行。
docker build代理是在执行前设置的,所以修改后,下次执行立即生效。Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。
dockerd代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启dockerd才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker