Docker 内部容器配置代理的几种方法

在企业内网、科研网络或需要访问外网受限环境时,经常需要为 Docker 配置 HTTP / HTTPS 代理,以便容器能够正常拉取镜像、访问外部服务或下载依赖。本文将系统介绍 Docker 中配置代理的几种常见方式,并重点说明 Docker daemon 级别的全局代理配置


一、为什么需要为 Docker 配置代理

Docker 使用代理主要解决以下问题:

  • docker pull 无法访问 Docker Hub
  • 容器内 apt / yum / pip / npm 无法下载依赖
  • 容器访问外部 API 超时
  • 企业网络强制走代理出口

需要注意的是:

Docker 代理分为两层

  1. Docker daemon(宿主机 Docker 服务)
  2. Docker container(容器内部进程)

不同层级的代理配置方式不同。


二、方式一:为 Docker daemon 配置全局代理(推荐)

这是最常用、最稳定的方式,适用于:

  • docker pull
  • 所有新启动的容器
  • systemd 管理的 Docker 服务

1️⃣ 创建 systemd 配置目录

sudo mkdir -p /etc/systemd/system/docker.service.d

2️⃣ 配置 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 docker

4️⃣ 验证是否生效

systemctl show --property=Environment docker

或测试拉取镜像:

docker pull busybox

✅ 优点

  • 一次配置,全局生效
  • docker pulldocker 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/16
    • 172.16.0.0/12
    • 192.168.0.0/16

八、总结

场景推荐方式
全局使用、拉镜像Docker daemon 代理
单个容器测试docker run -e
多容器项目docker-compose
镜像构建阶段daemon + build args
生产环境强烈推荐使用 Docker daemon 级别代理配置

如果你愿意,我可以:

  • 帮你改写成 公司内部规范文档
  • 补充 Docker BuildKit / buildx 代理
  • 或按 K8s / containerd 场景继续扩展
最后修改:2025 年 12 月 17 日
反正没人给,你也爱给不给吧。