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。