加速访问 Docker 注册表
使用镜像的方式加速 Docker Hub 访问速度
如果只是需要更流畅的访问 Docker Hub,可以使用 镜像 的方式。
下面展示使用上海交通大学 Docker Hub 镜像的例子。
编辑或新建 /etc/docker/daemon.json 文件,向其中添加 registry-mirrors 项,填入一个列表:
{
"registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn"]
}
使用代理的方式加速所有 Docker 注册表
如果需要访问其他的 Docker 注册表地址,例如我当前正在使用的 devcontainer 会使用到微软的 Docker 注册表,那即使修改了 Docker Hub 镜像地址也没有用。为了能够快速访问,需要给 Docker 守护进程设置代理。
对于 Docker Engine 23.0 版本以上
对于 Docker Engine 23.0 版本以上的,可以在 /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"
}
}
对于常规安装方式
-
给
docker服务创建一个放置 systemd 的目录:sudo mkdir -p /etc/systemd/system/docker.service.d -
创建 /etc/systemd/system/docker.service.d/http-proxy.conf 文件添加 HTTP 代理:
[Service] Environment="HTTP_PROXY=http://proxy.example.com:3128" Environment="HTTPS_PROXY=https://proxy.example.com:3129" -
如果有需要在不使用代理的情况下访问 Docker 注册表,可以使用
NO_PROXY环境变量。我个人是不需要添加此项,如果有需要的话建议还是看看文末的官方文档吧,因为一些特殊字符需要转义才能使用。 -
刷新更改并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker -
验证修改成功应用:
sudo systemctl show --property=Environmehttps://docs.docker.com/network/proxy/#configure-the-docker-clientnt docker返回类似下述内容表示修改成功:
Environment=HTTP_PROXY=http://proxy.example.com:3128 HTTPS_PROXY=https://proxy.example.com:3129 NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp
对于非 root 用户安装方式
类似常规安装,但是第一步的目录路径修改为 ~/.config/systemd/user/docker.service.d;第四步无需指定 sudo;第五步的命令则是:
systemctl --user show --property=Environment docker
代理容器内网络请求
Tip
如果要使用本机代理,可能需要先在本机代理的客户端上允许局域网链接 然后代理的 HOST 地址为
docker network inspect bridge中Gateway的 IP
-
创建并编辑 ~/.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" } } }保存文件后会立刻生效,不需要重启 Docker。但是,这个配置不会作用于已有的容器,只会作用于新容器和构建。
如果要代理 ftp 请求,需要指定
ftpProxy项;此外,还可以使用allProxy代理所有请求。 -
验证配置:
2.1. 方式一:
docker run --rm alpine sh -c 'env | grep -i _PROXY'返回如下:
https_proxy=http://proxy.example.com:3129 HTTPS_PROXY=http://proxy.example.com:3129 http_proxy=http://proxy.example.com:3128 HTTP_PROXY=http://proxy.example.com:3128 no_proxy=*.test.example.com,.example.org,127.0.0.0/8 NO_PROXY=*.test.example.com,.example.org,127.0.0.0/82.2. 方式二(如果在国内使用境外代理):
docker run -it --rm curlimages/curl google.com
为 Docker CLI 设置代理
可以在调用 docker build 和 docker run 时在命令行上设置代理。
例如在使用 docker build 时,添加 --build-arg 参数:
docker build --build-arg HTTP_PROXY="http://proxy.example.com:3128" .
在使用 docker run 时,指定 --env 参数:
docker run --env HTTP_PROXY="http://proxy.example.com:3128" redis