前言
在内网环境中,为了实现全局代理上网,Linux 系统通常通过修改 .bashrc
或 /etc/profile
等文件,设置 HTTP 和 HTTPS 代理。这种方式可以为大多数应用提供代理支持,但 Docker 并不会自动读取系统的环境变量,因此需要单独为其配置代理。
以下是为 Docker 添加 HTTP 和 HTTPS 代理的详细步骤:
1. 创建代理配置文件目录
首先,需要为 Docker 服务创建一个配置目录。执行以下命令:
mkdir -p /etc/systemd/system/docker.service.d
2. 新增代理配置文件
在目录 /etc/systemd/system/docker.service.d
下创建一个新的配置文件 proxy.conf
:
vim /etc/systemd/system/docker.service.d/proxy.conf
添加以下内容:
[Service]
Environment="HTTP_PROXY=http://192.168.1.100:3128/"
Environment="HTTPS_PROXY=http://192.168.1.100:3128/"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.1.0/24,.example.com"
- HTTP_PROXY:设置 HTTP 代理的地址,格式为
http://proxy_address:port
,例如http://192.168.1.100:3128/
。 - HTTPS_PROXY:设置 HTTPS 代理的地址,格式与 HTTP 代理相同。
- NO_PROXY:指定不使用代理的地址,多个地址用逗号分隔,例如
localhost,127.0.0.1
,也可以加入内网镜像源的地址,支持 CIDR 格式和域名通配符,如.example.com
。
示例:假设你有一个 Squid 代理服务器运行在内网 IP
192.168.1.100
的 3128 端口,并希望通过代理访问外网,同时直连内网地址192.168.1.0/24
和子域名.example.com
,上述配置即为理想设置。
3. 重新加载配置
设置完成后,需要重新加载 systemd
的配置并重启 Docker 服务:
# 重新加载 systemd 配置
systemctl daemon-reload
# 重启 Docker 服务
systemctl restart docker
4. 验证代理是否生效
执行以下命令,检查 Docker 是否正确读取了代理配置:
docker info | grep -i proxy
如果代理配置正确,你会看到类似以下的输出:
HTTP Proxy: http://192.168.1.100:3128/
HTTPS Proxy: http://192.168.1.100:3128/
No Proxy: localhost,127.0.0.1,192.168.1.0/24,.example.com
5. 测试镜像拉取
拉取一个镜像,验证代理是否生效:
docker pull alpine
如果镜像能够正常拉取,说明代理配置已成功生效。
常见问题与解决方法
1. 配置不生效
- 确保代理地址和端口正确。
- 检查
proxy.conf
的语法是否正确,尤其是引号的使用。 - 确保 Docker 服务已经被正确重启。
2. 某些地址不需要代理
- 在
NO_PROXY
中添加内网地址或特殊的域名。 - 确保
NO_PROXY
字段中的地址格式正确,例如.example.com
匹配所有子域名。
通过以上步骤,你可以在内网环境下为 Docker 配置代理,从而解决拉取镜像时无法连接外网的问题。代理配置后,Docker 将能够顺畅地访问外网,同时也可以通过 NO_PROXY
字段保留对内网地址的直连。