Docker 环境下的代理配置指南
在服务器或本地使用 Docker 时,网络受限是导致 docker pull 失败的最常见原因。然而,Docker 的架构分为守护进程(Daemon)、客户端(CLI)以及运行时的容器容器(Container),这三者的代理配置完全独立,绝不能混为一谈。
1. 区分三个代理层级
很多新手在终端里输入了 export http_proxy=...,却发现 docker pull 依然卡住。这是因为:
- Docker CLI (客户端):你输入的
export环境变量只影响终端里运行的命令本身(比如docker build时的上下文传输)。 - Docker Daemon (服务端/守护进程):实际执行
docker pull去拉取底层镜像的是系统后台运行的 Docker Daemon 服务。它根本无法读取你终端里的环境变量。 - Container (容器内部):当容器跑起来以后,它内部运行的应用程序(如 npm, wget)如果需要翻墙,又需要单独传入环境变量。
2. 配置 Docker Daemon 代理 (解决拉取镜像失败)
Linux 环境 (Systemd)
在原生 Linux 环境下,你需要为 systemd 服务配置环境变量。
- 为 Docker 服务创建一个专用的 systemd 覆盖目录:
sudo mkdir -p /etc/systemd/system/docker.service.d - 创建或编辑
http-proxy.conf文件:sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf - 写入代理配置(假设你的旁路由或本地代理监听在
192.168.1.100:7890):[Service] Environment="HTTP_PROXY=http://192.168.1.100:7890/" Environment="HTTPS_PROXY=http://192.168.1.100:7890/" Environment="NO_PROXY=localhost,127.0.0.1,.my-company.local" - 重新加载并重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
Docker Desktop 环境 (Windows / Mac)
如果您使用的是 Windows 或 Mac 版本的 Docker Desktop,配置则简单得多:
- 打开 Docker Desktop,点击右上角的齿轮图标进入 Settings。
- 导航至 Resources -> Proxies。
- 开启手动代理配置,填入您的 HTTP 代理地址(例如
http://127.0.0.1:7890)。 - 点击 Apply & restart 生效。
3. 配置容器内部代理
如果你正在 docker build 编译镜像,或者需要在容器内运行需要代理的脚本,可以通过在 ~/.docker/config.json 中配置默认代理,将其透传给所有新创建的容器。
编辑 ~/.docker/config.json:
{
"proxies": {
"default": {
"httpProxy": "http://192.168.1.100:7890",
"httpsProxy": "http://192.168.1.100:7890",
"noProxy": "localhost,127.0.0.1"
}
}
}
4. 验证代理配置
配置完成后,你可以通过以下命令检查 Docker Daemon 的环境变量是否成功注入:
sudo systemctl show --property=Environment docker
然后尝试拉取一个无本地缓存的外网镜像:
docker pull alpine:latest
如果能够迅速秒下,说明 Docker Daemon 代理配置已完美生效。