目 录CONTENT

文章目录

docker更改代理拉取镜像

兜兜管理员
2024-09-26 / 0 评论 / 0 点赞 / 369 阅读 / 0 字
温馨提示:
本文最后更新于2026-06-24,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在 docker 拉取镜像时,遇到Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)报错,分析这个错误表明 Docker 无法访问 Docker 镜像仓库 https://registry-1.docker.io/v2/,而且已经尝试通过代理来解决网络访问问题,但依然遇到了超时问题 (i/o timeout)。虽然已经开启代理,但docker-compose 和 Docker Daemon 并不会自动继承你通过 export 设置的代理环境变量,因此你需要显式地为 Docker Daemon 配置代理,接下来会分别介绍 3 处代理配置的区别以及配置方法。

一、Docker 三处代理配置的核心区别

Docker 代理常见有三处配置位置:

  1. /etc/systemd/system/docker.service.d/http-proxy.conf

  2. /etc/docker/daemon.json

  3. /root/.docker/config.json

这三处最大的区别是:前两个主要给 Docker 自己用,第三个主要影响容器内部程序。

1.1.区别总览表

对比项

systemd 代理

daemon.json 代理

Docker CLI 代理

配置位置

/etc/systemd/system/docker.service.d/http-proxy.conf

/etc/docker/daemon.json

/root/.docker/config.json

配置层级

Linux systemd 服务层

Docker daemon 配置层

Docker 客户端用户配置层

主要影响对象

Docker 服务进程 dockerd

Docker 服务进程 dockerd

新创建的容器

主要用途

Docker 拉镜像、构建镜像走代理

Docker 拉镜像、构建镜像走代理

容器内部程序访问网络走代理

是否影响 docker pull

影响

影响

一般不是主要作用

是否影响 docker build

影响

影响

可能间接影响构建环境

是否影响 docker compose pull

影响

影响

一般不是主要作用

是否影响 docker compose up

间接影响,主要是拉镜像阶段

间接影响,主要是拉镜像阶段

会影响新创建容器的环境变量

是否会让容器内出现 HTTP_PROXY

通常不会

通常不会

是否会影响容器内部程序访问网络

通常不会

通常不会

是否可能影响 Testsigma 访问 MySQL

一般不会

一般不会

可能会

是否可能影响容器访问 localhost

一般不会

一般不会

可能会

是否可能导致容器内部服务异常

风险较低

风险较低

风险较高

是否建议和其他代理配置同时使用

可以单独使用

不建议和 systemd 代理重复使用

不建议在 Testsigma 场景中使用

Testsigma 部署建议

可以保留

建议不配置代理

建议停用

1.2.三者区别

配置位置

一句话说明

/etc/systemd/system/docker.service.d/http-proxy.conf

给 Docker 服务用,主要影响 Docker 拉镜像和构建镜像

/etc/docker/daemon.json

也是给 Docker 服务用,作用和 systemd 代理比较重复

/root/.docker/config.json

给 Docker 创建出来的容器用,容易把代理注入容器内部

推荐保留方式

只保留 systemd 代理,停用 daemon.json 代理和 /root/.docker/config.json 代理

可以这样理解:

/etc/systemd/system/docker.service.d/http-proxy.conf/etc/docker/daemon.json 是给 Docker 自己用的。

/root/.docker/config.json 是给容器里面的程序用的。

所以,如果只是想让 Docker 能正常拉镜像、构建镜像,保留 systemd 代理即可。

二、开启docker代理

2.1. 配置 systemd 代理

docker-compose 和 Docker Daemon 并不会自动继承你通过 export 设置的代理环境变量,因此你需要显式地为 Docker Daemon 配置代理。

步骤:

编辑 Docker Daemon 配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,以配置代理。

sudo mkdir -p /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

添加以下内容(根据你的代理配置进行调整):

# 代理无密码配置
[Service] 
Environment="HTTP_PROXY=http://127.0.0.1:7890" 
Environment="HTTPS_PROXY=http://127.0.0.1:7890" 
Environment="NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"

# 代理存在密码配置
[Service]
Environment="HTTP_PROXY=http://账号aaa:密码bbb@127.0.0.1:7890"
Environment="HTTPS_PROXY=http://账号aaa:密码bbb@127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"

保存并退出编辑器。

然后,重新加载 Docker 的 systemd 配置并重启 Docker 服务:

sudo systemctl daemon-reload 
sudo systemctl restart docker

2.2. 配置 daemon.json代理(IP代理)

除了 Docker Daemon,你也可以为 docker-compose 和 Docker CLI 设置代理。编辑 Docker 的全局配置文件 /etc/docker/daemon.json,以便 Docker CLI 使用代理。

sudo vim /etc/docker/daemon.json

在文件中添加代理设置:

{
  "proxies": {
    "default": {
      "httpProxy": "http://127.0.0.1:7890",
      "httpsProxy": "http://127.0.0.1:7890",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

# 新版的docker格式可能变了,如果上方的报错就用下面的格式  代理有密码方式
{
  "proxies": {
    "http-proxy": "http://账号aaa:密码bbb@127.0.0.1:7890",
    "https-proxy": "http://账号aaa:密码bbb@127.0.0.1:7890",
    "no-proxy": "localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
  }
}

保存并退出编辑器,然后重启 Docker:

sudo systemctl restart docker

2.3. 配置 daemon.json 镜像加速

现在的内地网络环境是无法直接访问 Docker Hub,也可以使用 Docker 官方或第三方镜像加速器。例如,如果你在中国大陆,可以使用 Docker 提供的中国区加速镜像源。

修改 /etc/docker/daemon.json 文件,添加加速器配置:

sudo nano /etc/docker/daemon.json

添加以下内容:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.cn",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com",
    "https://docker.nju.edu.cn",
    "https://docker.1panel.live",
    "https://ghcr.io"
  ],
  "dns": [
    "119.29.29.29",
    "223.5.5.5",
    "114.114.114.114"
  ],
  "ipv6": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

保存文件后,重新启动 Docker:

sudo systemctl restart docker

这样,Docker 将通过加速器访问镜像,绕过网络限制。

2.4. 配置Docker CLI 代理,用户层代理config.json

/root/.docker/config.json 是 Docker CLI 的用户级配置文件。

它主要作用是:当 root 用户执行 docker rundocker compose up 创建新容器时,自动给新容器注入代理环境变量。

那么 /root/.docker/config.json 可以这样配置:

mkdir -p /root/.docker

cat > /root/.docker/config.json <<'EOF'
{
  "proxies": {
    "default": {
      "httpProxy": "http://aaa:bbb@192.168.1.54:7890",
      "httpsProxy": "http://aaa:bbb@192.168.1.54:7890",
      "noProxy": "localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
    }
  }
}
EOF

# 如果代理有账号密码,写法是:http://账号:密码@代理IP:端口
# 例如:http://aaa:bbb@192.168.1.54:7890

然后设置文件权限:

chmod 600 /root/.docker/config.json

查看配置内容:

cat /root/.docker/config.json

配置后是否需要重启 Docker?

单独修改 /root/.docker/config.json 后,一般不需要重启 Docker 服务。

但是需要注意:

这个配置只会影响之后新创建的容器,已经运行的容器不会自动更新代理环境变量。

所以,如果想让已有容器重新读取这个配置,需要重新创建容器。

例如 Testsigma:

cd /opt/testsigma
docker compose up -d --force-recreate

验证容器是否注入代理,可以用临时容器测试:

docker run --rm alpine env | grep -i proxy

如果配置生效,可能会看到类似:

HTTP_PROXY=http://aaa:bbb@192.168.1.54:7890
HTTPS_PROXY=http://aaa:bbb@192.168.1.54:7890
NO_PROXY=localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12

也可以检查 Testsigma 容器:

docker exec -it testsigma-server bash -lc "env | grep -i proxy || echo '容器内没有代理环境变量'"

这个配置是否影响 docker pull

/root/.docker/config.json 主要影响容器内部代理环境。

如果你的目标是让 Docker 拉镜像时走代理,应该优先配置:

/etc/systemd/system/docker.service.d/http-proxy.conf

也就是 Docker 服务级代理。

不建议只依赖 /root/.docker/config.json 来解决 docker pull 拉镜像的问题。

2.5. 检查代理连接

确保 Clash 或其他代理服务已经正确配置并运行。通过以下命令测试网络连接是否通过代理正常工作:

curl -x http://127.0.0.1:7890 https://registry-1.docker.io/v2/

如果输出正常,则说明代理设置有效。如果代理设置有问题,可能需要检查 Clash 的配置。

2.6. 避免防火墙和 DNS 问题

有时,防火墙可能会阻止 Docker 的网络连接。你可以尝试临时关闭防火墙来排除这个问题:

sudo ufw disable

也可以在 Docker 的 daemon.json 文件中添加自定义的 DNS 服务器,例如 Google 的 8.8.8.8

{
  "dns": ["8.8.8.8"]
}

保存并重启 Docker 后,再次尝试拉取镜像。

2.7.总结

通过上述步骤,你可以确保 Docker Daemon 正确使用代理并避免网络超时问题。代理配置和镜像加速器可以帮助你顺利访问 Docker Hub 或镜像仓库。如果问题依旧,建议检查代理服务的连通性以及网络环境是否有进一步的限制。

三、关闭docker代理

要关闭 Docker 的代理设置,可以按以下步骤进行操作:

3.1. 移除 Docker Daemon 的代理配置

如果你已经为 Docker Daemon 设置了代理配置,那么需要移除该配置文件或注释掉代理相关的行。

具体步骤:编辑代理配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf

sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

注释掉或删除与 HTTP_PROXYHTTPS_PROXY 相关的行:

# [Service] 
# Environment="HTTP_PROXY=http://127.0.0.1:7890" 
# Environment="HTTPS_PROXY=http://127.0.0.1:7890" 
# Environment="NO_PROXY=localhost,127.0.0.1"

保存并退出编辑器,然后重新加载 systemd 并重启 Docker:

sudo systemctl daemon-reload 
sudo systemctl restart docker

3.2. 移除 Docker 的全局代理配置

如果你还在 /etc/docker/daemon.json 文件中设置了代理,也需要将该代理配置移除。

步骤:编辑 Docker 的全局配置文件 /etc/docker/daemon.json

sudo nano /etc/docker/daemon.json

删除或注释掉代理相关的配置内容:

{
  "proxies": {
    "default": {
      "httpProxy": "",
      "httpsProxy": "",
      "noProxy": ""
    }
  }
}

或者直接删除 proxies 块。

保存文件后,重新启动 Docker:

sudo systemctl restart docker

3.3. 验证 Docker 代理已被关闭

你可以通过以下方式验证 Docker 代理是否已成功关闭:

查看 Docker 环境变量是否不再包含代理信息:

docker info | grep -i proxy

如果不返回任何内容,说明代理已经成功移除。

尝试拉取一个 Docker 镜像,确保不会再通过代理访问:

docker pull busybox

3.4. 还原 docker-compose 的环境变量

如果你为 docker-compose 设置了环境变量来使用代理,你可以通过以下方式清除这些变量:

unset http_proxy 
unset https_proxy 
unset all_proxy

3.5.总结

这会在当前终端会话中移除代理设置。如果你在 .bashrc.bash_profile 中设置了这些环境变量,记得移除这些配置。

通过以上步骤,你应该已经成功关闭了 Docker 的代理配置。

0

评论区