Docker 使用代理拉取镜像
1. 环境
- Ubuntu 22.04 LTS
2. 系统级服务代理
通常,可以使用 sudo -E 传递代理环境变量,但是 Docker 采用的是 C/S (客户端/服务端) 架构。docker pull 只是客户端。真正负责联网下载镜像的是运行在后台的 Docker Daemon 服务端(dockerd 进程)。使用 sudo -E 仅仅把代理环境变量传递给了 Docker 客户端。后台的 dockerd 进程根本没有获取到这些代理配置,因此它依然在尝试直连公网,最终导致 DNS 解析超时。
为此需要直接为 Docker Daemon 服务配置代理。以下是标准的系统级配置方法。
2.1 代理配置文件
1 | |
在文件中添加以下内容:
1 | |
请务必将上面的协议和端口替换为实际的代理地址。
注:NO_PROXY 很重要,它能确保拉取本地或内网私有仓库镜像时不经过代理。
2.2 重载配置
让 systemd 重新读取配置,并重启 docker 服务使其生效:
1 | |
2.3 测试
在重新执行拉取命令之前,先验证一下 Docker Daemon 是否已经成功加载了代理:
1 | |
成功加载代理后,应输出:
1 | |
之后就可以使用 sudo docker pull 拉取镜像了!
配置 Docker Daemon 代理仅对 拉取/推送镜像 (docker pull / docker push) 生效。它不会让 容器内部 (docker run) 或 构建过程 (docker build) 走代理。如果需要让容器内联网也走代理,需要修改 ~/.docker/config.json 或在运行/构建时通过 --env 或 --build-arg 显式传递参数。
3. 现代配置方法
从 Docker Engine 23.0 开始,官方原生支持在 /etc/docker/daemon.json 中直接配置代理,无需再去修改 systemd 文件。
创建或者修改文件:
1 | |
添加以下内容:
1 | |
请务必将上面的协议和端口替换为实际的代理地址。
应用配置:
1 | |