关于Docker的代理设置

如何在Docker中正确配置代理服务器

引言

在使用Docker时,许多用户会遇到需要通过代理服务器访问外部网络资源的情况。本文将详细介绍如何为Docker配置代理服务器,解决常见的代理配置问题,并提供实用的调试技巧。

一、Docker代理配置方法

1. 通过systemd配置(推荐)

这是最可靠的方法,适用于使用systemd管理Docker服务的Linux系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 创建代理配置文件
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
EOF

# 重新加载systemd配置并重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

2. 通过Docker守护进程配置

编辑/etc/docker/daemon.json文件:

1
2
3
4
5
6
7
8
9
10
11
12
sudo tee /etc/docker/daemon.json << EOF
{
"proxies": {
"http-proxy": "http://127.0.0.1:7890",
"https-proxy": "http://127.0.0.1:7890",
"no-proxy": "localhost,127.0.0.1,::1"
}
}
EOF

# 重启Docker服务
sudo systemctl restart docker

3. 通过Docker客户端配置

编辑~/.docker/config.json文件(如果不存在则创建),写入以下内容:

1
2
3
4
5
6
7
8
9
{
"proxies": {
"default": {
"httpProxy": "http://127.0.1:7890",
"httpsProxy": "http://127.0.1:7890",
"noProxy": "localhost,127.0.1,::1"
}
}
}

不过,该配置仅适用于新容器和构建,不会影响现有容器。

4. 使用 CLI 设置代理

无需配置 Docker 客户端, 在调用时在命令行上指定代理配置 docker build 和 docker run 命令。

命令行上的代理配置使用 –build-arg 标志进行构建,并使用 –env 标志来使用代理运行容器。

1
2
docker build --build-arg HTTP_PROXY="http://127.0.1:7890" .
docker run --env HTTP_PROXY="http://127.0.1:7890" redis

二、验证代理配置

配置完成后,可以通过以下命令验证:

1
2
3
4
5
# 检查代理设置是否生效
docker info | grep -i proxy

# 测试拉取镜像
docker pull hello-world

三、解决常见问题

问题1:代理配置后仍无法连接

症状:配置了代理,但Docker仍然无法拉取镜像,出现”EOF”错误。

解决方案

  1. 确保代理服务器正常运行:
    1
    curl -x http://127.0.0.1:7890 http://example.com
  2. 检查代理类型是否正确(HTTP vs SOCKS)
  3. 临时禁用代理测试:
    1
    2
    3
    sudo mv /etc/systemd/system/docker.service.d/http-proxy.conf /etc/systemd/system/docker.service.d/http-proxy.conf.bak
    sudo systemctl restart docker
    docker pull hello-world

问题2:docker-compose build不使用代理

症状docker pull工作正常,但docker-compose build不使用代理。

可以尝试的解决方案

  1. 修改docker-compose.yml,添加build参数:
    1
    2
    3
    4
    5
    6
    7
    8
    services:
    your-service:
    build:
    context: .
    args:
    HTTP_PROXY: ${HTTP_PROXY}
    HTTPS_PROXY: ${HTTPS_PROXY}
    NO_PROXY: ${NO_PROXY}
  2. 或者在运行命令时显式设置环境变量:
    1
    HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890 docker-compose build
  3. 关闭BuildKit(不推荐长期方案):
    1
    export DOCKER_BUILDKIT=0

五、总结

通过本文介绍的方法,应该能够解决大多数Docker代理配置问题。