Docker Registry UI

7 阅读2分钟

该项目旨在为你的私有 Docker 仓库提供简洁且功能完整的用户界面。

没有Harbor那样那么多的依赖组件,当你只需要一个内网Docker私库和一个简单的用户界面查看仓库有哪些镜像时,这个项目是一个不错的选择。该项目仅包含一个前端页面,后端也仅依赖registry镜像。

Docker-Compose

registry-ui 推荐的docker-compose启动配置如下:

version: '3.8'

services:
  registry-ui:
    image: joxit/docker-registry-ui:main
    restart: always
    ports:
      - 80:80
    environment:
      - SINGLE_REGISTRY=true
      - REGISTRY_TITLE=Docker Registry UI
      - DELETE_IMAGES=true
      - SHOW_CONTENT_DIGEST=true
      - NGINX_PROXY_PASS_URL=http://registry-server:5000
      - SHOW_CATALOG_NB_TAGS=true
      - CATALOG_MIN_BRANCHES=1
      - CATALOG_MAX_BRANCHES=1
      - TAGLIST_PAGE_SIZE=100
      - REGISTRY_SECURED=false
      - CATALOG_ELEMENTS_LIMIT=1000
    container_name: registry-ui

  registry-server:
    image: registry:2.8.2
    restart: always
    environment:
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin: '[http://registry.example.com]'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods: '[HEAD,GET,OPTIONS,DELETE]'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials: '[true]'
      REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers: '[Authorization,Accept,Cache-Control]'
      REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers: '[Docker-Content-Digest]'
      REGISTRY_STORAGE_DELETE_ENABLED: 'true'
    volumes:
      - ./registry/data:/var/lib/registry
    container_name: registry-server

Kubernetes部署

当想利用Kubernetes平台的故障恢复能力,去除组件单点故障,可以将registry部署到Kubernetes平台上。

  • registry-server.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: registry-server
  namespace: registry-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry-server
  template:
    metadata:
      labels:
        app: registry-server
    spec:
      volumes:
        - name: registry-data
          persistentVolumeClaim:
            claimName: registry-data-pvc
      containers:
        - name: registry-server
          image: 'joxit/registry:3.0.0'
          ports:
            - containerPort: 5000
              protocol: TCP
          env:
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin
              value: '[http://registry.ci.com]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods
              value: '[HEAD,GET,OPTIONS,DELETE]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials
              value: '[true]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers
              value: '[Authorization,Accept,Cache-Control]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers
              value: '[Docker-Content-Digest]'
            - name: REGISTRY_STORAGE_DELETE_ENABLED
              value: 'true'
          resources: {}
          volumeMounts:
            - name: registry-data
              mountPath: /var/lib/registry
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
  name: registry-server
  namespace: registry-ui
spec:
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000
  selector:
    app: registry-server
  type: ClusterIP
  • registry-ui.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: registry-ui
  namespace: registry-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry-ui
  template:
    metadata:
      labels:
        app: registry-ui
    spec:
      containers:
        - name: registry-ui
          image: 'joxit/docker-registry-ui:main-debian-amd64'
          ports:
            - containerPort: 80
              protocol: TCP
          env:
            - name: SINGLE_REGISTRY
              value: 'true'
            - name: REGISTRY_TITLE
              value: Docker Registry UI
            - name: DELETE_IMAGES
              value: 'true'
            - name: PULL_URL
              value: 'registry.ci.com:32041'
            - name: SHOW_CONTENT_DIGEST
              value: 'true'
            - name: NGINX_PROXY_PASS_URL
              value: 'http://registry-server:5000'
            - name: SHOW_CATALOG_NB_TAGS
              value: 'true'
            - name: CATALOG_MIN_BRANCHES
              value: '1'
            - name: CATALOG_MAX_BRANCHES
              value: '1'
            - name: TAGLIST_PAGE_SIZE
              value: '100'
            - name: REGISTRY_SECURED
              value: 'false'
            - name: CATALOG_ELEMENTS_LIMIT
              value: '1000'
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
  name: registry-ui
  namespace: registry-ui
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 32041
  selector:
    app: registry-ui
  type: NodePort

环境变量

            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin
              value: '[http://registry.ci.com]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods
              value: '[HEAD,GET,OPTIONS,DELETE]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials
              value: '[true]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers
              value: '[Authorization,Accept,Cache-Control]'
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers
              value: '[Docker-Content-Digest]'

这些环境变量并没有什么作用,可以去掉。