为 docker 守护进程设置代理

如果需要通过代理,去拉取/上传镜像,那么应该为 docker 的守护进程设置代理。对于 windows 上的 Docker Desktop 而言,可以直接在 docker 的设置中操作。

在docker的设置项,Resources,proxies中设置,如上,

填入你的代理地址和端口。

最下面(被我完全遮盖的)是用来配置不使用代理的目标地址(site 和 ip 中的白名单),应该在在这里绕过你使用的镜像站。

重启docker,生效。

对于 linux 而言,存在两种为 docker 设置代理的方式,一种是修改环境变量,docker 会识别下面的环境变量:

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • NO_PROXY
  • no_proxy

也可以在 /etc/docker/daemon.json 中设置,例如:

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

在这里同样可以设置用于拉取 image 的 docker hub 镜像站,例如:

{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}

docker hub 的个镜像的当前状态可以查看:https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6

为 docker 容器设置代理

如果只是某个特定容器需要代理,应该在启动或者创建镜像时通过命令指定,例如:

 docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
 docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis

如果所有容器都需要使用代理,那么可以在 ~/.docker/config.json 中配置,例如:

{
 "proxies": {
   "default": {
     "httpProxy": "http://proxy.example.com:3128",
     "httpsProxy": "https://proxy.example.com:3129",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   }
 }
}

注意,这个配置只是设置了容器中代理相关的环境变量(http_proxy, https_proxy, ftp_proxy, no_proxy, all_proxy,大写环境变量同理)。并且只对在设置之后运行的容器生效。