15.2.4 镜像加速与代理配置

为提升镜像拉取速度与稳定性,应优先配置镜像加速与网络代理。镜像加速改善访问速度,代理适用于受限网络出口,两者可叠加但需明确优先级与生效范围,避免证书或路由冲突。

原理草图:镜像加速与代理的作用路径

文章图片

镜像加速配置(Daemon 级)#

适用场景:访问官方镜像慢、跨境网络不稳定、需内部镜像加速。

配置文件与命令

# 1) 编辑 daemon.json(不存在则创建)
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "registry-mirrors": ["https://mirror.example.com"]
}
EOF

# 2) 重新加载并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 3) 验证生效
docker info | grep -i "Registry Mirrors" -A2

预期效果
- docker info 中出现 Registry Mirrors 字段且包含配置地址。


HTTP/HTTPS 代理配置(Daemon 级)#

适用场景:公司内网统一出口、无法直接访问外网。

systemd drop-in 配置

# 1) 创建 drop-in 目录
sudo mkdir -p /etc/systemd/system/docker.service.d/

# 2) 写入代理配置
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=http://user:pass@proxy-host:3128"
Environment="HTTPS_PROXY=http://user:pass@proxy-host:3128"
Environment="NO_PROXY=localhost,127.0.0.1,::1,registry.local,10.0.0.0/8"
EOF

# 3) 重新加载并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 4) 验证代理生效
systemctl show --property=Environment docker

命令解释
- Environment=...:设置 Docker daemon 的环境变量。
- NO_PROXY:绕过代理的域名或网段,避免内网仓库绕行。


构建阶段代理(仅影响 build)#

目标:构建时使用代理,但不固化凭据进镜像。

# 构建时通过 build-arg 传入代理
docker build \
  --build-arg HTTP_PROXY=http://proxy-host:3128 \
  --build-arg HTTPS_PROXY=http://proxy-host:3128 \
  -t demo:proxy .
# Dockerfile 示例
FROM alpine:3.19
ARG HTTP_PROXY
ARG HTTPS_PROXY
ENV HTTP_PROXY=${HTTP_PROXY}
ENV HTTPS_PROXY=${HTTPS_PROXY}
RUN apk add --no-cache curl \
 && curl -I https://www.example.com

说明
- ARG 仅在构建阶段生效;
- ENV 会进入镜像层,建议仅用于临时构建或配合多阶段构建移除。


私有仓库证书与不安全仓库#

HTTPS 私有仓库

# 假设私有仓库为 registry.local:5000
sudo mkdir -p /etc/docker/certs.d/registry.local:5000
sudo cp /path/to/ca.crt /etc/docker/certs.d/registry.local:5000/ca.crt

# 重启 Docker
sudo systemctl restart docker

不安全仓库(不推荐生产)

sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "insecure-registries": ["registry.local:5000"]
}
EOF
sudo systemctl restart docker

排错与验证(含命令)#

1) 镜像拉取超时

# 检查代理连通性
curl -I http://proxy-host:3128

# 检查 NO_PROXY 是否包含内网仓库
systemctl show --property=Environment docker | tr ' ' '\n' | grep NO_PROXY

2) 证书错误(x509)

# 确认 CA 证书路径与 registry 域名一致
ls -l /etc/docker/certs.d/registry.local:5000/ca.crt

3) 镜像加速未生效

# 验证 JSON 是否有效
cat /etc/docker/daemon.json | python -m json.tool

# 确认 daemon 重启
systemctl status docker --no-pager

4) 代理冲突

# 客户端环境变量与 daemon 不一致易导致拉取失败
env | grep -i proxy
systemctl show --property=Environment docker

练习:完整验证流程#

目标:同时启用镜像加速与代理,并验证拉取结果。

# 1) 设置镜像加速
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
  "registry-mirrors": ["https://mirror.example.com"]
}
EOF

# 2) 设置 daemon 代理
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=http://proxy-host:3128"
Environment="HTTPS_PROXY=http://proxy-host:3128"
Environment="NO_PROXY=localhost,127.0.0.1,::1,mirror.example.com"
EOF

# 3) 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 4) 验证镜像拉取
docker pull alpine:3.19
docker images | grep alpine

预期结果
- docker pull 成功完成;
- docker info 中显示 Registry Mirrors