破解Docker镜像拉取难题:为Docker配置代理加速镜像拉取

2,490 阅读2分钟

概述

为什么需要配置代理与镜像加速?

跨国网络限制:境外镜像仓库拉取速度慢或无法访问

企业安全策略:通过统一代理服务器进行网络审计和管控

两种代理配置方式对比

配置方式生效范围持久性适用场景
daemon.json守护进程级别永久生效固定代理服务器
Systemd环境变量系统服务级别需reload动态调整代理设置

参考官方文档:Daemon proxy configuration

守护进程配置(推荐长期使用)

编辑vim /etc/docker/daemon.json进行配置

{
  "proxies": {
    "http-proxy": "http://192.168.1.1:7890",
    "https-proxy": "http://192.168.1.1:7890",
    "no-proxy": "localhost,127.0.0.1,*.test.example.com"
  }
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

重新启动守护进程以使代理配置生效

# 重载配置并重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -i proxy

Systemd环境变量配置(适合临时调整)

Docker守护进程会在启动环境中检查以下环境变量,以配置 HTTP 或 HTTPS 代理行为:

HTTP_PROXY

HTTPS_PROXY

NO_PROXY

创建一个名为/etc/systemd/system/docker.service.d的目录,这种.d目录下的配置将覆盖默认配置

 mkdir -p /etc/systemd/system/docker.service.d

创建一个名为/etc/systemd/system/docker.service.d/http-proxy.conf的文件

vim /etc/systemd/system/docker.service.d/proxy.conf

添加HTTP_PROXY环境变量

[Service]
Environment="HTTP_PROXY=http://192.168.1.1:7890/"
Environment="HTTPS_PROXY=http://192.168.1.1:7890/"
# 如果`NO_PROXY=*`,那么所有请求都将不通过代理服务器,如指定本地私有的镜像仓库地址
Environment="NO_PROXY=127.0.0.1,localhost,192.168.*,*.example.com"

重新加载配置文件,重启 Dockerd 才能生效

systemctl daemon-reload

systemctl restart docker

验证环境变量,确认环境变量已经正确配置

systemctl show --property=Environment docker

docker info的结果中也可以查看到配置项

# docker info
Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http://192.168.1.1:7890
 HTTPS Proxy: http://192.168.1.1:7890
 No Proxy: 127.0.0.1,localhost
 Experimental: false

注意:

若需身份验证,使用http://用户名:密码@代理IP:端口格式

临时禁用代理

# 临时禁用代理
sudo systemctl set-environment HTTP_PROXY=""
sudo systemctl restart docker

# 查看实时日志
journalctl -u docker.service -f

其他

代理连通性测试

curl -v -x http://proxy:port https://registry.hub.docker.com

参数说明

-v 参数
	作用:开启详细模式(verbose)
	
-x 参数
	全称:--proxy
	格式:[协议://]主机:端口

示例:

# curl -v --proxy http://192.168.1.10:7890 https://registry.hub.docker.com
*   Trying 192.168.1.10:7890...
* Connected to 192.168.1.10 (192.168.1.10) port 7890
* CONNECT tunnel: HTTP/1.1 negotiated
* allocate connect buffer
* Establish HTTP proxy tunnel to registry.hub.docker.com:443
> CONNECT registry.hub.docker.com:443 HTTP/1.1
> Host: registry.hub.docker.com:443
> User-Agent: curl/8.5.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established
<

代理认证测试

curl -v -x http://user:password@ip:port https://registry.hub.docker.com

绕过代理测试

# curl -v --noproxy '*' https://registry.hub.docker.com
* Host registry.hub.docker.com:443 was resolved.
* IPv6: (none)
* IPv4: 31.13.95.37
*   Trying 31.13.95.37:443...