Learn how to set up a private Docker registry with a user-friendly UI! This guide walks you through deploying a Docker Registry 2.8.2 and the Joxit Docker Registry UI using Kubernetes, including necessary configurations for secure access and persistent storage.

Check out the GitHub repo for the Registry UI!

Download images

docker pull joxit/docker-registry-ui:main
docker pull registry:2.8.2

2024-02-24-12_29_02

Write kubernetes yaml file

1、 registry-server.yaml

apiVersion: v1
kind: Service
metadata:
  name: registry-server
spec:
  type: NodePort
  selector:
    app: registry-server
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000
      nodePort: 31284
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: registry-server
  template:
    metadata:
      labels:
        app: registry-server
    spec:
      containers:
        - name: registry-server
          image: registry:2.8.2
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5000
          env:
            - name: REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin
              value: "['*']"
            - 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"
          volumeMounts:
            - name: nfs-registry-server
              mountPath: /var/lib/registry
      volumes:
        - name: nfs-registry-server
          persistentVolumeClaim:
            claimName: registry-server-pvc

2、 registry-ui.yaml

apiVersion: v1
kind: Service
metadata:
  name: registry-ui
spec:
  type: NodePort
  selector:
    app: registry-ui
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 31285
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 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
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
          env:
            - name: SINGLE_REGISTRY
              value: "true"
            - name: REGISTRY_TITLE
              value: Docker Registry UI
            - name: DELETE_IMAGES
              value: "true"
            - name: SHOW_CONTENT_DIGEST
              value: "true"
            - name: NGINX_PROXY_PASS_URL
              value: http://192.168.1.102:31284
            - 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"

3、 registry-server-pv-pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: registry-server-pv
  labels:
    type: registry-server
spec:
  capacity:
    storage: 300Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.52.110
    path: /run/media/MyThings/ServiceData/registry-server-data
  persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: registry-server-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 300Gi
  selector:
    matchLabels:
      type: registry-server

Deploy Services

kubectl create -f registry-server-pv-pvc.yaml
kubectl create -f registry-server.yaml
kubectl create -f registry-ui.yaml

Configure Docker Daemon

1、 modify docker deamon.json file to allow http

vim /etc/docker/daemon.json

daemon.json

2、 restart docker.service to apply modification

sudo systemctl daemon-reload
sudo systemctl restart docker.service

3、 check docker succesfully added insecure registries

docker system info

docker-info