创建带代理的 docker 容器需区分三类场景:1. 容器内应用代理,通过 --env 注入 http_proxy 等变量;2. 构建阶段代理,用 arg/env + --build-arg;3. docker daemon 代理,需配置 systemd 覆盖文件;compose 中可在 environment 块统一管理,但 build 阶段需额外指定。

创建带代理设置的 Docker 容器,关键在于明确代理作用对象:是让容器内部应用能访问外网(如下载依赖、调用 API),还是让 Docker 本身(Client 或 Daemon)走代理拉镜像或连远程 daemon。不同目标对应不同配置方式,不能混用。
让容器内进程使用代理
这是最常见需求——比如 Node.js 应用要 npm install、Python 要 pip install、或者 curl 访问外部 HTTPS 接口。只需在启动容器时注入环境变量:
- 用 --env 直接传入:
docker run -it --env HTTP_PROXY=http://192.168.1.100:8080 --env HTTPS_PROXY=http://192.168.1.100:8080 ubuntu bash - 若代理需跳过内网地址,加上 NO_PROXY:
--env NO_PROXY="localhost,127.0.0.1,172.20.0.0/16" - 注意:代理地址必须能被容器网络访问到(例如宿主机 localhost 在 bridge 模式下不可达,应改用宿主机真实 IP 或用 host.docker.internal)
让 Docker 构建过程走代理
构建镜像时(docker build)需要下载基础镜像或 RUN 中执行 apt/yum/pip 等操作,此时代理需在构建阶段生效:
- 在 Dockerfile 开头添加:
ARG HTTP_PROXY和ENV HTTP_PROXY=${HTTP_PROXY}(同理设 HTTPS_PROXY) - 构建时传参:
docker build --build-arg HTTP_PROXY=http://192.168.1.100:8080 --build-arg HTTPS_PROXY=http://192.168.1.100:8080 -t myapp . - 也可全局配置构建代理(通过
~/.docker/config.json的buildkit部分),但不如 build-arg 灵活可控
让 Docker Daemon 拉取/推送镜像走代理
当你 pull/push 国外 registry(如 docker.io、quay.io、k8s.gcr.io)时,是 dockerd 进程自身需要联网,必须配置守护进程级代理:
- 创建 systemd 覆盖配置:
sudo mkdir -p /etc/systemd/system/docker.service.d - 新建文件
/etc/systemd/system/docker.service.d/http-proxy.conf,内容为:[Service]<br>Environment="HTTP_PROXY=http://192.168.1.100:8080"<br>Environment="HTTPS_PROXY=http://192.168.1.100:8080"<br>Environment="NO_PROXY=localhost,127.0.0.1,::1"
- 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart docker - 验证:
systemctl show --property=Environment docker应显示对应变量
用 Docker Compose 统一管理代理
多容器场景下,推荐在 docker-compose.yml 中集中定义,避免重复写 env:
- 在 service 下加
environment块:services:<br> app:<br> image: nginx<br> environment:<br> - HTTP_PROXY=http://192.168.1.100:8080<br> - HTTPS_PROXY=http://192.168.1.100:8080<br> - NO_PROXY=localhost,127.0.0.1
- 更干净的做法是用
.env文件存代理地址,再用${HTTP_PROXY}引用,便于环境切换 - 注意:Compose 不会自动为 build 阶段注入这些变量,构建仍需单独用
--build-arg











