本文成功前提条件,在本测试服务器上可成功访问https://registry-1.docker.io

在 Ubuntu 22.04 上配置 Docker Registry 的 Pull-Through Cache(拉取穿透缓存),并为 192.168.8.32 配置 SSL 证书,可以显著提升镜像拉取速度,并减少对公共镜像仓库(如 Docker Hub)的直接请求。

出自通义AI,新自部署,测试可用

以下是详细步骤:


🧩 一、环境准备

  • 操作系统:Ubuntu 22.04
  • 目标 IP192.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.32Let'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

✅ 根据需要可添加更多 IPDNS 条目,比如你的主机名。


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


🛡️ 安全建议

  1. 防火墙限制:仅允许内网访问 5000 端口

    sudo ufw allow from 192.168.0.0/16 to any port 5000
  2. 定期更新证书(自签名证书一年有效期)

  3. 监控磁盘使用:缓存可能增长很快,可定期清理或使用外部存储


✅ 验证是否生效

  1. 第一次拉取较慢 ✅
  2. 第二次极快 ✅
  3. 查看容器日志是否有 proxying 请求 ✅
  4. data/ 目录大小增长 ✅
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐