docker-proxy
2022年8月27日2022年9月25日

最近在使用 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


运行容器的时候,如果你需要在容器内使用代理,则需要配置容器的代理。

这里有三种配置方法:

  1. 容器运行时指定
1docker run -e HTTP_PROXY=http://ip:port/ -e HTTPS_PROXY=http://ip:port/ -e NO_PROXY=localhost ...

这种方式的优点就是直接,但缺点就是每次启动容器都需要显示的设置。 为了解决这种情况,在 Docker 17.07 以上,可以使用配置 Docker 客户端的方式,即 2。

  1. 客户端全局配置

`~/.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}
  1. 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 ..