Docker代理配置需分三层:守护进程(拉镜像)、Dockerfile构建(下载依赖)、容器运行时(应用访问),每层须显式设置HTTP_PROXY/HTTPS_PROXY/NO_PROXY,多级代理需透传且NO_PROXY须精确覆盖内网地址段与域名。

Docker容器本身不自动继承宿主机代理,多级代理更需显式透传和分层控制。
关键不是“在容器里装代理软件”,而是让容器内的进程(如curl、apt、pip、Java应用)能按需走指定代理链。内网访问场景下,常需先过公司统一出口代理,再经部门级网关,最后抵达目标内网服务——这要求代理配置可叠加、可绕行、可区分协议。
一、宿主机 Docker 守护进程代理:拉镜像用
这是最基础一层,只影响docker pull、docker build 等守护进程行为,不影响容器内程序:
- Linux:写入
/etc/systemd/system/docker.service.d/proxy.conf,内容示例:
[Service] Environment="HTTP_PROXY=http://proxy-corp:8080" Environment="HTTPS_PROXY=http://proxy-corp:8080" Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,svc.cluster.local"
- 注意:
HTTPS_PROXY值必须是http://协议(即使代理本身支持 HTTPS),Docker 客户端不支持 HTTPS 代理隧道; -
NO_PROXY要包含所有内网地址段和 Kubernetes 服务域名,避免误代理导致 DNS 解析失败或连接超时; - 执行
sudo systemctl daemon-reload && sudo systemctl restart docker生效。
二、构建阶段(Dockerfile)代理:编译/下载依赖用
Docker 构建时容器尚未运行,需通过构建参数注入代理环境:- 在
Dockerfile开头声明构建参数:
ARG HTTP_PROXY ARG HTTPS_PROXY ARG NO_PROXY ENV HTTP_PROXY=$HTTP_PROXY ENV HTTPS_PROXY=$HTTPS_PROXY ENV NO_PROXY=$NO_PROXY
- 构建命令中传入实际值(支持多级代理地址,例如部门网关 → 公司出口):
docker build \ --build-arg HTTP_PROXY=http://dept-gw:3128 \ --build-arg HTTPS_PROXY=http://dept-gw:3128 \ --build-arg NO_PROXY="localhost,127.0.0.1,172.20.0.0/16" \ -t myapp .
- 这样 apt/yum/npm/pip 等工具在 RUN 指令中会自动使用代理;
- 若某步需直连内网服务(如拉取私有 Maven 仓库),可在对应 RUN 前临时 unset 环境变量。
三、运行时容器代理:应用访问外部或内网服务用
容器启动后,内部进程是否走代理,完全取决于你是否把代理变量传进去:- 方式 1:启动时用
-e注入(推荐用于调试或单次运行):
docker run -it \ -e HTTP_PROXY=http://dept-gw:3128 \ -e HTTPS_PROXY=http://dept-gw:3128 \ -e NO_PROXY="localhost,127.0.0.1,10.100.5.22,*.intra.company.com" \ alpine sh -c "curl -v http://internal-api.intra.company.com"
- 方式 2:在
docker-compose.yml中统一配置(适合微服务集群):
services:
app:
image: myapp:latest
environment:
- HTTP_PROXY=http://dept-gw:3128
- HTTPS_PROXY=http://dept-gw:3128
- NO_PROXY=localhost,127.0.0.1,10.100.0.0/16,*.svc.cluster.local-
NO_PROXY必须精确覆盖所有内网目标(IP 段、域名通配符),否则请求会被发往代理并失败; - 若存在两级代理(如
dept-gw → corp-proxy → internet),确保dept-gw本身已配置好上行代理,容器只需指向第一级即可; - Java 应用需额外加 JVM 参数
-Dhttp.proxyHost=... -Dhttps.proxyHost=...,因部分 Java 版本不读 ENV。
四、特殊场景:容器需同时访问内网与外网,且路径不同
纯NO_PROXY 有时不够灵活。这时可用透明代理方案:
- 在宿主机部署
privoxy或mitmproxy,配置规则:匹配*.intra.company.com→ 直连;匹配github.com→ 走corp-proxy;其余走dept-gw; - 容器统一设
HTTP_PROXY=http://host.docker.internal:8118(macOS/Windows)或宿主机真实 IP(Linux); - 该方式解耦容器逻辑与网络策略,适合多团队共用一套代理规则的大型内网环境。


















