镜像仓库

镜像仓库(Registry)是存储和分发容器镜像的服务器应用。容器镜像是容器的可移植打包格式,包含了应用程序及其依赖的所有内容。镜像仓库主要用于存储这些镜像,并允许用户通过网络将镜像拉取到本地进行部署。本文将指导您如何在英博云上部署和使用私有Docker Registry。

前提条件

  • 已创建集群,详情请参考:创建集群
  • 已创建PVC存储卷,详情请参考创建存储
  • 本地已经安装docker
  • 账户余额充足

通过kubectl命令行部署创建

前提:

  1. 已安装kubectl工具到本地。详情请参考:安装和设置 kubectlopen in new window
  2. 已通过 kubectl 连接目标集群。具体操作详情请参考:连接集群
  3. PersistentVolumeClaim:镜像仓库registry挂载的共享存储卷大小,需要根据实际使用情况设置容量。
  4. Ingress Host:请输入自定义名称+集群的外网ingress,可通过对应集群详情页查看,如下图所示。
  1. 部署Docker Registry,示例文件 docker-registry.yaml代码如下:
### Part1: 持久化的存储卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: t512g # 存储卷的名称
  namespace: default # 存储卷的命名空间
spec:
  accessModes:
  - ReadWriteMany # 存储卷的读写模式
  resources:
    requests:
      storage: 512Gi
  storageClassName: shared-nvme-cn-beijing2 # 创建存储卷使用的StorageClass的名字
---
### Part2: 部署镜像仓库的 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-registry # Deployment 的名称
spec:
  replicas: 1 # 副本数,表示运行的 Pod 实例数量
  selector:
    matchLabels:
      app: docker-registry # 匹配标签,用于将 Pod 与 Deployment 关联
  template:
    metadata:
      labels:
        app: docker-registry # Pod 的标签
    spec:
      containers:
        - name: registry # 容器的名称
          resources:
            limits:
              cpu: "2"  容器的最大 CPU 配额
              memory: "4Gi" # 容器的最大内存配额
          image: registry-cn-beijing2-internal.ebtech.com/docker-hub-mirror/registry:2 # 镜像仓库的地址和镜像版本
          ports:
            - containerPort: 5000 # 容器暴露的端口
          volumeMounts:
            - name: cm-volume # 挂载 ConfigMap 的存储卷名称
              mountPath: /etc/docker/registry/ # 挂载到容器的路径
            - name: registry-storage # 挂载持久化存储卷的名称
              mountPath: /var/lib/registry # 镜像存储数据的路径
      volumes:
        - name: cm-volume # ConfigMap 类型的存储卷
          configMap:
            name: docker-registry-cm # ConfigMap 的名称
            items:
              - key: config.yml # ConfigMap 中的键
                path: config.yml # 在容器内的路径
        - name: registry-storage
          persistentVolumeClaim:
            claimName: t512g # 引用的持久化存储卷的名称
---
### Part3: 镜像仓库的配置 ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: docker-registry-cm # ConfigMap 的名称
data:
  config.yml: | # 镜像仓库的配置文件
    version: 0.1
    log:
      level: debug # 日志级别
    http:
      addr: :5000 # HTTP 服务监听的地址和端口
      headers:
        X-Content-Type-Options: [nosniff] # 安全头部配置
    storage:
      filesystem:
        rootdirectory: /var/lib/registry # 镜像存储路径
      delete:
        enabled: true # 是否允许删除镜像
---
Part4:镜像仓库的 Service
apiVersion: v1
kind: Service
metadata:
  name: docker-registry # Service 的名称
spec:
  selector:
    app: docker-registry # 与 Pod 的标签关联
  ports:
    - protocol: TCP # 使用的网络协议
      port: 5000 # Service 的端口号
      targetPort: 5000 # 映射到 Pod 的端口号
  type: ClusterIP # Service 类型,表示只在集群内部访问
---
Part5:外部访问的 Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: docker-registry-ingress # Ingress 的名称
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / 
spec:
  rules:
    - host: registry-tenant-39663739-yqwowner-ingress-cn-regionxxx.ebtech.com # Ingress Host
      http:
        paths:
          - path: / # 路径前缀
            pathType: Prefix # 路径匹配类型
            backend:
              service:
                name: docker-registry # Service 名称
                port:
                  number: 5000 # 映射的服务端口号
---
Part6:内部访问的 Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: docker-registry-ingress-internal # 内部 Ingress 的名称
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / 
spec:
  rules:
    - host: reg-tenant-39663739-yqwowner-ingress-cn-regionxxx-internal.ebtech.com # Ingress Host
      http:
        paths:
          - path: / # 路径前缀
            pathType: Prefix # 路径匹配类型
            backend:
              service:
                name: docker-registry # Service 名称
                port:
                  number: 5000 # 映射的服务端口号
  1. 执行以下命令,部署yaml文件。
kubectl apply -f docker-registry.yaml
  1. 执行以下命令,查看服务是否部署成功。
kubectl get pods -n default
kubectl get svc -n default
kubectl get pvc -n default
kubectl get ingress -n default

使用Docker Registry

调用接口查看镜像仓库列表

Docker Registry没有像harbor那样的web界面可以直观的查看镜像仓库列表,需要调用接口查看,

其中,ingress_hosts在本示例中为:reg-tenant-39663739-yqwowner-ingress-cn-regionxxx-internal.ebtech.com

curl -X GET https://ingress_hosts/v2/_catalog

推送镜像

  1. 为镜像打标签,使其指向Registry:
docker tag <image-name> reg-tenant-39663739-yqwowner-ingress-cn-regionxxx-internal.ebtech.com/<your-image-name>:tag
  1. 将镜像推送到Registry:
docker push reg-tenant-39663739-yqwowner-ingress-cn-regionxxx-internal.ebtech.com/<your-image-name>:tag

拉取镜像

docker pull reg-tenant-39663739-yqwowner-ingress-cn-regionxxx-internal.ebtech.com/<your-image-name>:tag