最近在用docker拉“墙”外镜像时设置的proxy总是不生效,坑了好久终于好了,记录一下。

要想让docker走代理说起来也简单,分几种情况:

  • 想要运行起来的容器使用代理
  • 想要docker pull的时候走代理

第一种情况就是设置docker client配置文件,一般在~/.docker/config.json;对于Docker 1.06以及以下版本的这个方法不适用,只能给容器设置环境变量,如在Dockerfile中添加

ENV HTTP_PROXY="http://127.0.0.1:3001"

或是docker run的时候带上--env HTTP_PROXY="http://127.0.0.1:3001"。官方文档在这里

对于第二种情况还需要细分,如果是比如WSL2里安装的docker,docker服务是通过sudo service docker start起来的,启动时实际会执行脚本/etc/init.d/docker;而这个脚本中会读取/etc/default/docker这个文件中的内容加载为环境变量,所以需要在文件中添加:

export HTTP_PROXY="http://web-proxy:8080"
export HTTPS_PROXY="http://web-proxy:8080"
export NO_PROXY="localhost,127.0.0.0/8,172.16.0.0/12,192.168.0.0/16,10.0.0.0/8"

如果docker服务是通过systemd来管理的,docker deamon起来时会读取systemd相关的docker.sevice的服务配置,要想让docker pull可以走proxy需要在systemd的docke.sevice目录下添加http-proxy.conf文件中添加:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80"
Environment="HTTPS_PROXY=https://proxy.example.com:443"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"

而使用systemd的时候,docker服务文件位置会因为起docker服务的方式不同略微不同。正常情况下文件路径为/etc/systemd/system/docker.service.d,如果文件夹不存在需要创建,然后添加http-proxy.conf文件;在使用rootless mode起docker服务时路径在~/.config/systemd/user/docker.service.d。

systemd的配置文件更改后需要执行systemd重启。

# 一般模式重启
sudo systemctl daemon-reload
sudo systemctl restart docker

# rootless mode重启
systemctl --user daemon-reload
systemctl --user restart docker

参考: