最近在使用 docker 的时候,即便是配置了国内的镜像,也还是慢的可怕。
而且国内的镜像源并不能实时同步镜像的最新版本,所以还是选择了国外的源 + 代理的方式。
pull-time proxy
拉取镜像的时候,是使用dockerd
守护进程。因此代理需要配置在dockerd
环境,而这个环境是systemd
负责,因此实际上是配置systemd
代理。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
添加下面的内容到proxy.conf
文件中:
[Service]
Environment="HTTP_PROXY=http://ip:port/"
Environment="HTTPS_PROXY=http://ip:port/"
Environment="NO_PROXY=localhost,127.0.0.1"
这里的 ip 是你的代理 ip 一般是 localhost,port 则是你代理转发的端口。
run-time proxy
运行容器的时候,如果你需要在容器内使用代理,则需要配置容器的代理。
这里有三种配置方法:
- 容器运行时指定
docker run -e HTTP_PROXY=http://ip:port/ -e HTTPS_PROXY=http://ip:port/ -e NO_PROXY=localhost ...
这种方式的优点就是直接,但缺点就是每次启动容器都需要显示的设置。
为了解决这种情况,在 Docker 17.07 以上,可以使用配置 Docker 客户端的方式,即 2。
- 客户端全局配置
在~/.docker/config.json
中,加入以下内容:
{
"proxies": {
"default": {
"httpProxy": "http://ip:port",
"httpsProxy": "http://ip:port",
"noProxy": "localhost,127.0.0.0/8"
}
}
}
- host 网络模式
如果你的容器使用的是 host 网络模式,那么容器内的网络就是宿主机的网络,因此可以直接使用宿主机的代理。
docker run --network host ...
上面的 ip 是 docker0 网卡的 ip,而不是容器内部的 ip。使用 ip addr show docker0 查看。
build-time proxy
容器构建的时候,本质上也是启动了一个容器。
这里没找到配置文件的方法,只能使用环境变量的方式,但是参数略有不同。
docker build \
--build-arg "HTTP_PROXY=http://ip:port/" \
--build-arg "HTTPS_PROXY=http://ip:port/" \
--build-arg "NO_PROXY=localhost,127.0.0.1" \
...
同样的,这里的 ip 也是docker0
网卡的 ip。
构建过程中,更推荐使用 host 网络模式,因为这样可以直接使用宿主机的代理。
重启生效
重启计算机即可
build-time
代理是在执行前设置的,所以修改后,下次执行立即生效。run-time
代理的修改也是立即生效的,但是只针对以后启动的容器,对已经启动的容器无效。
pull-time
代理的修改比较特殊,它实际上是改systemd
的配置,因此需要重载systemd
并重启dockerd
才能生效。
sudo systemctl daemon-reload
sudo systemctl restart docker