为 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,大写环境变量同理)。并且只对在设置之后运行的容器生效。