在NAS上的Docker部署的Docker私有镜像仓库Registry,以及我自己写的自动同步镜像到Registry仓库的工具docker-image-sync-to-registry

Docker 镜像同步工具

这是一个用于将 Docker Hub 上的镜像同步到私有 Docker Registry 的工具,基于 docker:dind 镜像修改构建。通过 Python 脚本爬取 Docker Hub 上的镜像分类,生成镜像列表,并同步到私有 Registry。

功能特点

  • 支持从 Docker Hub 同步镜像到私有 Registry
  • 支持定时同步(通过 cron 表达式配置)
  • 支持代理配置
  • 支持启动时立即同步选项
  • 支持自定义目标 Registry
  • 支持多架构镜像同步(amd64/arm64)
  • 支持自定义同步镜像数量限制
  • 支持 Docker Hub 分类镜像爬取
  • 支持镜像标签过滤和保留策略

项目地址

快速开始

  1. 克隆仓库:
git clone https://github.com/sqing33/docker-image-sync-to-registry.git
cd docker-image-sync-to-registry
  1. 配置环境:

    • 编辑 docker-compose.yml 文件,设置必要的环境变量
    • 配置 daemon.json 文件,设置 Registry 地址和镜像加速
  2. 启动服务:

docker-compose up -d

配置说明

1. docker-compose.yml 配置

services:
  image-sync:
    image: sqing33/docker-image-sync-to-registry # ghcr.io/sqing33/docker-image-sync-to-registry
    container_name: docker-image-sync-to-registry
    privileged: true
    environment:
      - REGISTRY_URL=http://registry:5000 # 镜像仓库地址
      - CRON_SCHEDULE=0 4 * * * # 每天凌晨4点执行
      - SYNC_ON_START=true # 容器启动时立即同步
      - TARGET_ARCH=linux/amd64 # 目标架构(linux/amd64,linux/arm64)
      - REMOVE_LIBRARY_PREFIX_ON_LOCAL=true # 是否移除本地镜像的library/前缀
      - MAX_PAGES_PER_CATEGORY=1 # 控制 Python 脚本爬取的页数
      - CRAWL_AFTER_CUSTOM_IMAGES=true # 拉取custom_images镜像列表之后是否继续爬取DockerHub
      - HTTP_PROXY=http://192.168.1.100:7890
      - HTTPS_PROXY=http://192.168.1.100:7890
      - NO_PROXY=localhost,127.0.0.1,docker.1panel.live,docker.1ms.run,http://registry:5000
    volumes:
      - /etc/timezone:/etc/timezone:ro # 容器时区同步宿主机
      - /etc/localtime:/etc/localtime:ro # 容器时间同步宿主机
      - /vol1/1000/Docker/docker-image-sync-to-registry/daemon.json:/etc/docker/daemon.json # 设置容器Docker加速源
      - /vol3/1000/Docker镜像仓库/docker缓存:/var/lib/docker/overlay2 # 挂载容器Docker下载镜像的目录
      - /vol1/1000/Docker/docker-image-sync-to-registry/custom_images.txt:/app/custom_images.txt:ro # 自定义镜像列表文件
附带部署 registry 的示例:
version: "3"

services:
  registry:
    image: registry:2 # ghcr.io/sqing33/registry
    container_name: registry
    restart: always
    ports:
      - 1500:5000
    volumes:
      - /vol3/1000/Docker镜像仓库:/var/lib/registry
    environment:
      - REGISTRY_STORAGE_DELETE_ENABLED=true # 启用删除功能
    networks:
      - registry

  registry-ui:
    image: quiq/registry-ui # ghcr.io/sqing33/registry-ui
    container_name: registry-ui
    restart: always
    volumes:
      - /vol1/1000/Docker/registry/config.yml:/opt/config.yml:ro
    ports:
      - 1501:8000
    networks:
      - registry

  docker-image-sync:
    image: sqing33/docker-image-sync-to-registry # ghcr.io/sqing33/docker-image-sync-to-registry
    container_name: docker-image-sync-to-registry
    privileged: true
    environment:
      - REGISTRY_URL=http://registry:5000 # 镜像仓库地址
      - CRON_SCHEDULE=0 4 * * * # 每天凌晨4点执行
      - SYNC_ON_START=true # 容器启动时立即同步
      - TARGET_ARCH=linux/amd64 # 目标架构(linux/amd64,linux/arm64)
      - REMOVE_LIBRARY_PREFIX_ON_LOCAL=true # 是否移除本地镜像的library/前缀
      - MAX_PAGES_PER_CATEGORY=1 # 控制 Python 脚本爬取的页数
      - CRAWL_AFTER_CUSTOM_IMAGES=true # 拉取custom_images镜像列表之后是否继续爬取DockerHub
      - HTTP_PROXY=http://192.168.1.100:7890
      - HTTPS_PROXY=http://192.168.1.100:7890
      - NO_PROXY=localhost,127.0.0.1,docker.1panel.live,docker.1ms.run,http://registry:5000
    volumes:
      - /etc/timezone:/etc/timezone:ro # 容器时区同步宿主机
      - /etc/localtime:/etc/localtime:ro # 容器时间同步宿主机
      - /vol1/1000/Docker/docker-image-sync-to-registry/daemon.json:/etc/docker/daemon.json # 设置容器Docker加速源
      - /vol3/1000/Docker镜像仓库/docker缓存:/var/lib/docker/overlay2 # 挂载容器Docker下载镜像的目录
      - /vol1/1000/Docker/docker-image-sync-to-registry/custom_images.txt:/app/custom_images.txt:ro # 自定义镜像列表文件
    networks:
      - registry

networks:
  registry:
    name: registry

2. daemon.json 配置

{
  "registry-mirrors": ["https://docker.1panel.live", "https://docker.1ms.run"],
  "insecure-registries": ["[镜像仓库地址]"]
}

3. 参数信息

参数名说明默认值是否必填
REGISTRY_URL镜像仓库地址-
CRON_SCHEDULE定时同步的 cron 表达式0 4 * * *
SYNC_ON_START容器启动时是否立即同步true
TARGET_ARCH目标架构(linux/amd64,linux/arm64)linux/amd64
REMOVE_LIBRARY_PREFIX_ON_LOCAL是否移除本地镜像的 library/ 前缀false
MAX_PAGES_PER_CATEGORY控制 Python 脚本爬取的页数5
CRAWL_AFTER_CUSTOM_IMAGES拉取 custom_images 镜像列表之后是否继续爬取 DockerHubtrue
HTTP_PROXYHTTP 代理地址-
HTTPS_PROXYHTTPS 代理地址-
NO_PROXY不使用代理的地址列表localhost,127.0.0.1

4. 挂载卷说明

挂载路径说明是否必填
/etc/timezone容器时区同步宿主机
/etc/localtime容器时间同步宿主机
/etc/docker/daemon.json设置容器 Docker 加速源
/var/lib/docker/overlay2挂载容器 Docker 下载镜像的目录
/app/custom_images.txt自定义镜像列表文件

项目结构

.
├── Dockerfile              # Docker 镜像构建文件
├── docker-compose.yml      # Docker Compose 配置文件
├── daemon.json            # Docker daemon 配置文件
├── config.yml             # Registry UI 配置文件
├── docker_hub_crawler.py  # Docker Hub 爬虫脚本
└── sync_images.sh         # 镜像同步脚本

工作原理

  1. 爬虫模块(docker_hub_crawler.py):

    • 爬取 Docker Hub 上的镜像分类
    • 提取镜像名称和标签信息
    • 支持分页获取和去重处理
  2. 同步模块(sync_images.sh):

    • 读取 custom_images.txt 中的镜像列表
    • 读取爬虫生成的镜像列表
    • 使用 docker pull 拉取镜像
    • 使用 docker tag 重命名镜像
    • 使用 docker push 推送到私有仓库

项目截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

故障排除

  1. 同步失败检查项:

    • 网络连接状态
    • 代理配置正确性
    • Registry 可访问性
    • 磁盘空间充足性
    • 认证信息有效性
  2. 查看日志:

# 查看容器日志
docker logs docker-image-sync-to-registry

# 查看同步脚本日志
docker exec docker-image-sync-to-registry cat /var/log/sync_images.log
  1. 常见问题:
    • 网络超时:检查网络连接和代理设置
    • 认证失败:验证 Registry 认证信息
    • 空间不足:清理旧镜像或增加存储空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值