为Docker及其应用设置网络代理的方法

在 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):

  1. 右键点击 Docker Desktop 图标

  2. 选择 “Settings” → “Resources” → “PROXY”

  3. 启用并配置代理

macOS(Docker Desktop):

  1. 点击 Docker Desktop 菜单栏图标

  2. “Preferences” → “Resources” → “Proxies”

  3. 配置代理设置

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-image

4. 构建镜像时设置代理

# 方法一:在 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_PROXY

5. 常见问题解决

代理认证问题

# 如果代理需要认证
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配置完成!"

注意事项:

  1. 优先级:容器级别的设置会覆盖 Docker 守护进程的设置

  2. 重启生效:修改 Docker 服务配置后需要重启 Docker

  3. 安全性:避免在配置文件中硬编码密码,考虑使用认证代理或环境变量文件

  4. 不同 Docker 版本:不同版本可能有不同的配置方式

  5. 容器内部应用:某些应用可能需要额外的代理配置(如 apt、npm、pip 等)