在 Docker 中设置网络代理主要有以下几种方法:
1. 为 Docker 守护进程设置代理(拉取镜像时使用)
方法一:通过 systemd 配置(Linux)
# 创建代理配置文件
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
添加以下内容:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp"
应用配置:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker
方法二:通过 Docker 配置文件(不同系统位置不同)
Linux (/etc/docker/daemon.json):
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1"
}
}
}
Windows(Docker Desktop):
右键点击 Docker Desktop 图标
选择 “Settings” → “Resources” → “PROXY”
启用并配置代理
macOS(Docker Desktop):
点击 Docker Desktop 菜单栏图标
“Preferences” → “Resources” → “Proxies”
配置代理设置
2. 为容器设置代理(容器内应用程序使用)
方法一:在 Dockerfile 中设置
ENV HTTP_PROXY=http://proxy.example.com:8080
ENV HTTPS_PROXY=http://proxy.example.com:8080
ENV NO_PROXY=localhost,127.0.0.1
方法二:运行容器时设置环境变量
docker run -e HTTP_PROXY="http://proxy.example.com:8080" \
-e HTTPS_PROXY="http://proxy.example.com:8080" \
-e NO_PROXY="localhost,127.0.0.1" \
your-image
方法三:使用 docker-compose
version: '3'
services:
app:
image: your-image
environment:
- HTTP_PROXY=http://proxy.example.com:8080
- HTTPS_PROXY=http://proxy.example.com:8080
- NO_PROXY=localhost,127.0.0.1
# 或者从文件读取
# env_file:
# - .env
3. 创建带代理配置的 Docker 网络
# 创建自定义网络
docker network create \
--driver bridge \
--subnet 172.28.0.0/16 \
--opt com.docker.network.bridge.name=mybridge \
my-network
# 运行容器并连接到该网络
docker run --network=my-network --env HTTP_PROXY=... your-image4. 构建镜像时设置代理
# 方法一:在 docker build 命令中设置
docker build \
--build-arg HTTP_PROXY=http://proxy.example.com:8080 \
--build-arg HTTPS_PROXY=http://proxy.example.com:8080 \
-t your-image .
# 方法二:在 Dockerfile 中使用 ARG
# Dockerfile 内容:
# ARG HTTP_PROXY
# ARG HTTPS_PROXY5. 常见问题解决
代理认证问题
# 如果代理需要认证
HTTP_PROXY=http://username:password@proxy.example.com:8080
验证代理是否生效
# 查看 Docker 服务环境变量
systemctl show --property=Environment docker
# 在容器内测试
docker run --rm alpine env | grep -i proxy
# 测试网络连接
docker run --rm alpine ping -c 3 google.com
docker run --rm alpine wget -O- http://example.com跳过代理(NO_PROXY 配置)
# 常见的不需要代理的地址
localhost,127.0.0.1,::1,*.local,*.internal,192.168.*,10.*,172.16.*,172.17.*,172.18.*,172.19.*,172.20.*,172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,172.28.*,172.29.*,172.30.*,172.31.*,*.corp
6. 一键设置脚本(Linux)
#!/bin/bash
# docker-proxy-setup.sh
PROXY_SERVER="http://proxy.example.com:8080"
NO_PROXY_LIST="localhost,127.0.0.1,*.local"
# 设置 Docker 服务代理
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=$PROXY_SERVER"
Environment="HTTPS_PROXY=$PROXY_SERVER"
Environment="NO_PROXY=$NO_PROXY_LIST"
EOF
# 设置用户环境变量(用于 docker build)
echo "export HTTP_PROXY=$PROXY_SERVER" >> ~/.bashrc
echo "export HTTPS_PROXY=$PROXY_SERVER" >> ~/.bashrc
echo "export NO_PROXY=$NO_PROXY_LIST" >> ~/.bashrc
# 重新加载配置
sudo systemctl daemon-reload
sudo systemctl restart docker
echo "Docker proxy配置完成!"注意事项:
优先级:容器级别的设置会覆盖 Docker 守护进程的设置
重启生效:修改 Docker 服务配置后需要重启 Docker
安全性:避免在配置文件中硬编码密码,考虑使用认证代理或环境变量文件
不同 Docker 版本:不同版本可能有不同的配置方式
容器内部应用:某些应用可能需要额外的代理配置(如 apt、npm、pip 等)