tanger
发布于 2024-01-05 / 6 阅读 / 0 评论 / 0 点赞

Docker-Registry 私有仓库搭建与界面化管理

Docker-Registry 私有仓库搭建与界面化管理

一、关于 Registry

官方的 Docker hub 是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。

但是有时候我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件 Registry 来达成目的。

 Registry 在 github 上有两份代码:老代码库和新代码库。老代码是采用 python 编写的,存在 pull 和 push 的性能问题,出到 0.9.1 版本之后就标志为 deprecated,不再继续开发。

 从 2.0 版本开始就到在新代码库进行开发,新代码库是采用 go 语言编写,修改了镜像 id 的生成算法、registry 上镜像的保存结构,大大优化了 pull 和 push 镜像的效率。

 官方在 Docker hub 上提供了 registry 的镜像,我们可以直接使用该 registry 镜像来构建一个容器,搭建我们自己的私有仓库服务。

二、搭建 Registry

首先搜索并拉取镜像

docker search registry    # 建议先搜索一下,可以看一下相关的镜像,说不定哪天就有更好的镜像了
docker pull registry    # 标签可以不加,因为当前最新就是v2

运行一个 registry 容器

docker run -d \            # 后台运行
--name registry-srv \    # 指定容器名
--restart=always \        # 设置自动启动
-p 5000:5000 \            # 端口映射宿主机,通过宿主机地址访问
-v /opt/zwx-registry:/var/lib/registry \     # 把镜像存储目录挂载到本地,方便管理和持久化
-v /opt/zwx-registry/srv-config.yml:/etc/docker/registry/config.yml \    # 把配置文件挂载到本地,方便修改和保存
registry

srv-config.yml 内容如下

  标红 delete 参数设置为 true,是为了让仓库支持删除功能。默认没有这个参数,也就是不能删除仓库镜像。

version: 0.1
log:
  fields:
    service: registry
storage:
delete: 
	enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

注册 https 协议(否则 push 安全认证过不去)

  需要通过本地仓库下载镜像,均需要配置,insecure-registries需要配置在registry-mirrors之后

vim /etc/docker/daemon.json        # 默认无此文件,需自行添加,有则追加以下内容。
{ "insecure-registries":["xx.xx.xx.xx:5000"] }  # 指定IP地址或域名

eg:
{
    "registry-mirrors": [
        "https://hub-mirror.c.163.com/",
        "https://docker.mirrors.ustc.edu.cn/"
    ],
    "insecure-registries": ["192.168.3.32:5000"]
}



systemctl daemon-reload    # 守护进程重启
systemctl restart docker    # 重启docker服务

镜像上传与下载

docker push xx.xx.xx.xx:5000/nginx            # 一定要注明仓库地址,否则会报错
docker pull xx.xx.xx.xx:5000/nginx

查看仓库镜像信息

curl -XGET http://xx.xx.xx.xx:5000/v2/_catalog    # 查看仓库镜像列表(也可以通过windows浏览器打开查看)
curl -XGET http://xx.xx.xx.xx:5000/v2/image_name/tags/list  # 查看指定应用镜像tag

三、搭建 Registry web

首先搜索并拉取镜像

docker search docker-registry-web
docker pull hyper/docker-registry-web    # 这个镜像用的人较多

 运行一个 registry web 容器

docker run -d \            # 后台运行
--name registry-web \    # 指定容器名
--restart=always \        # 设置自动启动
-p 8000:8080 \            # 端口映射宿主机,通过宿主机地址访问
-v /opt/zwx-registry/web-config.yml:/conf/config.yml \    # 把配置文件挂载到本地,方便修改和保存
hyper/docker-registry-web

web-config.yml 文件内容如下

标红 readonly 参数设置为 false,是为了 web 页面可以显示删除按钮。默认是 true,只读状态,没有删除按钮,只能查看。

registry:
  # Docker registry url
  url: http://10.88.77.32:5000/v2
  # Docker registry fqdn
  name: localhost:5000
  # To allow image delete, should be false
  readonly: false
  auth:
    # Disable authentication
    enabled: false

部署完成后,浏览器打开仓库 UI 地址即可查看到所有应用镜像

选择任意应用镜像库,即可查看到该镜像的所有 tag 信息,每个 tag 后面都有个删除按钮(默认没有,配置参考 config.yml)

四、快捷部署

  集群模式可以通过 docker stack 快速部署 registry 和 registry web。

  新建配置文件 srv-config.yml、web-config.yml 放到指定路径,再新建 docker-compose.yml 文件,执行命令即可。

docker stack deploy -c docker-compose.yml RGT
version: '3.7'      # docker stack 需要是3.0以上版本
services:
  registry-srv:      # 服务名
    image: registry
    
    ports:         # 映射端口
      - 5000:5000
      
    volumes:        # 挂载镜像路径和配置文件,注意修改路径与实际一致
      - /opt/zwx-registry:/var/lib/registry
      - /opt/zwx-registry/srv-config.yml:/etc/docker/registry/config.yml
      
    deploy:        # 设置单任务,并约束主节点运行
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      
  registry-web:      # 服务名  
    image: hyper/docker-registry-web
    
    ports:        # 映射端口
      - 8000:8080
    
    volumes:      # 挂载配置文件,注意修改路径与实际一致
      - /opt/zwx-registry/web-config.yml:/conf/config.yml
      
    environment:
      - REGISTRY_URL=http://registry-srv:5000/v2
      - REGISTRY_NAME=localhost:5000
    
    deploy:        # 设置单任务,并约束主节点运行
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager


评论