Docker 内部容器配置代理的几种方法
在企业内网、科研网络或需要访问外网受限环境时,经常需要为 Docker 配置 HTTP / HTTPS 代理,以便容器能够正常拉取镜像、访问外部服务或下载依赖。本文将系统介绍 Docker 中配置代理的几种常见方式,并重点说明 Docker daemon 级别的全局代理配置。
一、为什么需要为 Docker 配置代理
Docker 使用代理主要解决以下问题:
docker pull无法访问 Docker Hub- 容器内
apt / yum / pip / npm无法下载依赖 - 容器访问外部 API 超时
- 企业网络强制走代理出口
需要注意的是:
Docker 代理分为两层
- Docker daemon(宿主机 Docker 服务)
- Docker container(容器内部进程)
不同层级的代理配置方式不同。
二、方式一:为 Docker daemon 配置全局代理(推荐)
这是最常用、最稳定的方式,适用于:
docker pull- 所有新启动的容器
- systemd 管理的 Docker 服务
1️⃣ 创建 systemd 配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d2️⃣ 配置 Docker daemon 代理
创建 proxy.conf 文件:
sudo tee /etc/systemd/system/docker.service.d/proxy.conf >/dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=http://misin:misin@local.domain.com:10666"
Environment="HTTPS_PROXY=http://misin:misin@local.domain.com:10666"
Environment="NO_PROXY=localhost,127.0.0.1,::1,172.20.0.0/16,172.16.0.0/12,192.168.0.0/16,local.domain.com,.local.domain.com"
EOF参数说明
- HTTP_PROXY / HTTPS_PROXY
代理服务器地址(支持用户名密码) NO_PROXY
不走代理的地址,通常包括:- 本地回环地址
- Docker 内网网段
- 内部域名
3️⃣ 重载并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker4️⃣ 验证是否生效
systemctl show --property=Environment docker或测试拉取镜像:
docker pull busybox✅ 优点
- 一次配置,全局生效
- 对
docker pull、docker build生效 - 无需修改每个容器
⚠️ 注意事项
- 只对新启动的容器生效
- 不影响已运行的容器
- systemd 管理的 Docker 才适用
三、方式二:启动容器时指定代理环境变量
适用于 临时测试或单个容器。
docker run -e HTTP_PROXY=http://proxy:port \
-e HTTPS_PROXY=http://proxy:port \
-e NO_PROXY=localhost,127.0.0.1 \
ubuntu env特点
- 只影响当前容器
- 不影响 Docker daemon
- 重启容器需重新配置
四、方式三:在 Dockerfile 中配置代理(不推荐长期使用)
ENV HTTP_PROXY=http://proxy:port
ENV HTTPS_PROXY=http://proxy:port
ENV NO_PROXY=localhost,127.0.0.1风险
- 代理信息会写入镜像层(⚠️ 泄露风险)
- 构建完成后仍然存在
- 不适合包含账号密码的代理
五、方式四:Docker Compose 中配置代理
services:
app:
image: ubuntu
environment:
HTTP_PROXY: http://proxy:port
HTTPS_PROXY: http://proxy:port
NO_PROXY: localhost,127.0.0.1适合多容器应用统一管理。
六、容器内验证代理是否生效
进入容器:
docker exec -it <container_id> bash查看环境变量:
env | grep -i proxy测试网络:
curl https://www.google.com七、常见问题排查
1️⃣ docker pull 仍然超时
- 检查 daemon 是否重启
- 检查 systemd 环境变量是否生效
- 确认代理支持 HTTPS CONNECT
2️⃣ 容器访问内网失败
- 检查
NO_PROXY是否包含 Docker 网段 常见网段:
172.17.0.0/16172.16.0.0/12192.168.0.0/16
八、总结
| 场景 | 推荐方式 |
|---|---|
| 全局使用、拉镜像 | Docker daemon 代理 |
| 单个容器测试 | docker run -e |
| 多容器项目 | docker-compose |
| 镜像构建阶段 | daemon + build args |
生产环境强烈推荐使用 Docker daemon 级别代理配置
如果你愿意,我可以:
- 帮你改写成 公司内部规范文档
- 补充 Docker BuildKit / buildx 代理
- 或按 K8s / containerd 场景继续扩展