200字
基于Registry搭建docker加速镜像服务
2025-10-04
2025-10-04

基于Registry搭建docker加速镜像服务

背景

  • 场景:
    1. docker.io网络访问不通畅,服务器难以拉取镜像
    2. 多个服务器拉取相同镜像时,外网连接负载较重
  • 目的:
    1. 当存在能够访问docker.io的客户端时,可通过该客户端上传镜像至内网仓库,回避网络问题
    2. 通过搭建内网docker仓库,令服务器直接从内网拉取镜像,缓解外网负载
  • 条件:
    1. 能够获取Registry镜像
    2. 可选:具有Nginx服务,具有内网域名,具有内网域名对应的SSL证书

准备

  • 若具有Nginx服务,具有内网域名,具有内网域名对应的SSL证书,则可进一步优化使用方式:
    1. 在Nginx中新建转发服务,<自定义分配的url>指向<服务器端ip>:<Registry端口号>
    2. 配置对应的SSL
    3. 将签发该证书的CA证书添加至客户端/etc/docker/certs.d/<自定义分配的url>/ca.crt
  • 若不具有SSL证书且无法解决http安全问题,则在客户端修改/etc/docker/daemon.json,添加如下内容
{
  "insecure-registries": ["<服务器端ip>:<Registry端口号>"]
}
  • 重启docker

执行

  • 服务器端docker-compose.yml配置如下
version: '3'

services:
  registry-docker:
    image: registry:2
    restart: unless-stopped
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
      #REGISTRY_PROXY_USERNAME: <dockerhub username>
      #REGISTRY_PROXY_PASSWORD: <dockerhub password>
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
      REGISTRY_HTTP_SECRET: "<通过openssl rand -hex 32生成的随机密钥>"
      # 每个客户端都需要认证才能访问
      #REGISTRY_AUTH: htpasswd
      #REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      #REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    ports:
      - 5000:5000
    volumes:
      - <Registry的数据目录>:/var/lib/registry
      #- <Registry的认证文件目录>:/auth  # 挂载认证文件
  • 备注:
    1. 如果认为该服务可能受到恶意攻击,可以启用Registry的认证配置
      1. 取消掉docker-compose.yml中关于认证的注释
      2. 服务器端需执行
        • docker run --rm --entrypoint htpasswd httpd:2 -Bbn <username> <password> >> /path/to/registry/auth/htpasswd
      3. 将客户端的认证文件添加至服务器端
      4. 客户端的docker在进行pull前,需要先进行登录:docker login <自定义分配的url>,输入账号密码
      5. 除非执行docker logout,否则会一直登录

测试

在客户端进行测试

# 拉取测试镜像并打标签
docker pull hello-world
docker tag hello-world <服务器ip>:<Registry端口>/my-hello-world

# 尝试推送至服务器端的Registry
# 不进行Nginx转发时,执行这一行,会出现http安全问题
docker push <服务器ip>:<Registry端口>/my-hello-world
# 进行Nginx转发时,执行这一行
docker push <自定义分配的url>/my-hello-world

# 删除本地镜像
docker rmi <服务器端ip>:<Registry端口号>/my-hello-world
docker rmi hello-world

# 尝试从服务器端拉取镜像
# 不进行Nginx转发时,执行这一行
docker pull <服务器ip>:<Registry端口>/my-hello-world
# 进行Nginx转发时,执行这一行
docker pull <自定义分配的url>/my-hello-world

Registry的API

  • 查询镜像目录:curl -u <username>:<passwd> -X GET <自定义分配的url>/v2/_catalog
  • 查询指定镜像的版本:curl -u <username>:<passwd> -X GET <自定义分配的url>/v2/<image>/tags/list
基于Registry搭建docker加速镜像服务
作者
RM706
发表于
2025-10-04
License
CC BY-NC-SA 4.0