在 Ubuntu 22.04 上配置 Docker Registry 的 Pull-Through Cache(拉取穿透缓存)
来自通义AI
本文成功前提条件,在本测试服务器上可成功访问https://registry-1.docker.io。
在 Ubuntu 22.04 上配置 Docker Registry 的 Pull-Through Cache(拉取穿透缓存),并为 192.168.8.32 配置 SSL 证书,可以显著提升镜像拉取速度,并减少对公共镜像仓库(如 Docker Hub)的直接请求。
出自通义AI,新自部署,测试可用
以下是详细步骤:
🧩 一、环境准备
- 操作系统:Ubuntu 22.04
- 目标 IP:
192.168.8.32 - 服务端口:
5000(HTTPS) - 域名(可选但推荐):例如
registry-cache.local(可绑定到该 IP) - Docker 已安装
- Docker Compose(推荐使用)
🔧 二、安装 Docker 和 Docker Compose
bash
深色版本
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装 Docker
sudo apt install docker.io docker-compose -y
# 启用并启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
# 将当前用户加入 docker 组(可选)
sudo usermod -aG docker $USER
注:执行完后建议重新登录或执行
newgrp docker。
📁 三、创建项目目录
bash
深色版本
mkdir -p ~/docker-registry-cache/{config,data,ssl}
cd ~/docker-registry-cache
目录结构:
深色版本
~/docker-registry-cache/
├── config/
│ └── registry.yml
├── data/
├── ssl/
│ ├── domain.crt
│ └── domain.key
🔐 四、生成 SSL 证书(自签名或使用 Let's Encrypt)
由于是内网 IP 192.168.8.32,Let's Encrypt 不支持 IP 签发,因此使用 自签名证书。
重新生成一个包含 SAN(Subject Alternative Name)的 TLS 证书,支持你的私有 registry 地址(如 192.168.8.32)。
🔧 步骤:生成带 SAN 的自签名证书
假设:
- 你的私有镜像仓库 IP 是:
192.168.8.32 - 证书存放路径:
/root/docker-registry-cache/ssl/
1. 创建 OpenSSL 配置文件
创建一个配置文件 openssl-san.cnf,例如放在 /root/docker-registry-cache/ssl/openssl.cnf:
mkdir -p /root/docker-registry-cache/ssl
cat > /root/docker-registry-cache/ssl/openssl.cnf << 'EOF'
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req
[dn]
CN = 192.168.8.32
[v3_req]
basicConstraints = CA:false
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP = 192.168.8.32
DNS = localhost
DNS = *.docker.io
EOF
✅ 根据需要可添加更多
IP或DNS条目,比如你的主机名。
2. 生成私钥和证书
cd /root/docker-registry-cache/ssl
# 生成私钥
openssl genrsa -out domain.key 2048
# 生成自签名证书(有效期365天)
openssl req -new -x509 -sha256 -key domain.key -subj "/CN=192.168.8.32" \
-days 365 -config openssl.cnf -extensions v3_req -out domain.crt
✅ 现在 domain.crt 包含了 SAN 字段,支持 IP 地址。
🛠️ 五、配置 Docker Registry(Pull-Through Cache)
创建配置文件:config/registry.yml
version: 0.1
log:
level: info
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
tls:
certificate: /etc/docker/registry/certs/domain.crt
key: /etc/docker/registry/certs/domain.key
proxy:
remoteurl: https://registry-1.docker.io
username: [YOUR_DOCKERHUB_USERNAME] # 可选:用于提高拉取限额
password: [YOUR_DOCKERHUB_PASSWORD] # 可选
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
🔔 说明:
proxy.remoteurl: 指向 Docker Hub。- 如果你有 Docker Hub 账号,填写
username/password可避免匿名用户限流(100次/6小时)。- 若不想认证,可删除
username和password行。
🐳 六、创建 Docker Compose 文件
在项目根目录创建 docker-compose.yml:
version: '3'
services:
registry-cache:
image: registry:2
container_name: registry-cache
restart: always
ports:
- "5000:5000"
volumes:
- ./config/registry.yml:/etc/docker/registry/config.yml
- ./data:/var/lib/registry
- ./ssl:/etc/docker/registry/certs
environment:
REGISTRY_HTTP_ADDR: 0.0.0.0:5000
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
▶️ 七、启动服务
docker-compose up -d
检查日志:
docker logs registry-cache
看到类似 listening on [::]:5000 表示成功启动。
🔐 八、将证书添加到 Docker 信任列表(客户端和服务器)
为了让 Docker 信任自签名证书,需将 domain.crt 安装到 所有使用该缓存的机器。
在每台客户端机器上执行:
sudo mkdir -p /etc/docker/certs.d/192.168.8.32:5000
scp root@192.168.8.32:~/docker-registry-cache/ssl/domain.crt /tmp/domain.crt
sudo cp /tmp/domain.crt /etc/docker/certs.d/192.168.8.32:5000/ca.crt
✅ 必须命名为
ca.crt,路径为IP:PORT
重启 Docker:
sudo systemctl restart docker
🧪 九、测试 Pull-Through Cache
1. 拉取镜像通过缓存
docker pull 192.168.8.32:5000/library/nginx:alpine
第一次会从 Docker Hub 拉取并缓存,第二次会直接从本地缓存返回。
2. 查看缓存内容(可选)
进入容器查看:
docker exec -it registry-cache ls /var/lib/registry/docker/registry/v2/repositories
🔄 十、配置客户端使用缓存(推荐)
方法一:修改 Docker Daemon 配置(全局镜像加速)
编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [],
"proxies": {
"default": {
"httpProxy": "",
"httpsProxy": ""
}
},
"insecure-registries": [],
"live-restore": true
}
❌ 不支持直接设置 mirror 用于 registry-1.docker.io 的 Pull-Through。
✅ 正确做法:手动替换镜像前缀
# 原始命令
docker pull nginx:alpine
# 使用缓存
docker pull 192.168.8.32:5000/library/nginx:alpine
可编写脚本或 CI/CD 中统一替换。
🔐 十一、(可选)使用域名 + 内部 DNS 提升体验
建议设置内网 DNS 或修改 /etc/hosts:
# 所有客户端添加
192.168.8.32 registry-cache.local
然后使用:
docker pull registry-cache.local:5000/library/nginx:alpine
并相应更新证书 CN 和 SAN 为 registry-cache.local。
🛡️ 安全建议
-
防火墙限制:仅允许内网访问
5000端口sudo ufw allow from 192.168.0.0/16 to any port 5000 -
定期更新证书(自签名证书一年有效期)
-
监控磁盘使用:缓存可能增长很快,可定期清理或使用外部存储
✅ 验证是否生效
- 第一次拉取较慢 ✅
- 第二次极快 ✅
- 查看容器日志是否有
proxying请求 ✅ data/目录大小增长 ✅
更多推荐



所有评论(0)