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