You need to enable JavaScript to run this app.
导航
通过远端代理仓域名拉取 Docker Hub 中非 Docker 官方镜像
最近更新时间:2025.01.03 16:55:26首次发布时间:2024.11.27 16:29:09

远端代理实例通过远端代理的缓存功能,实现就近访问的效果,有效提升跨境镜像拉取的效率。除了 Docker 官方镜像(带有 Docker Official Image 标识)以外,很多的非官方镜像本也会被经常使用。本文介绍如何通过远端代理仓拉取 Docker Hub 中的非官方镜像。

注意

与拉取 Docker 官方镜像(Docker Official Image)不同,通过远端代理仓拉取 Docker Hub 中非官方镜像时:

  • 需要为远端代理仓配置访问镜像所需的用户名和密码。
  • 需要在远端代理仓中创建和 Docker Hub 中同名的命名空间。

场景介绍

本文以拉取 Docker Hub 中非官方镜像(无 Docker Official Image 标识)Grafana 为例。

  • Docker 官方镜像,具有 Docker Official Image 标识。
    alt

  • 非 Docker 官方镜像,不具有 Docker Official Image 标识。

    alt

前提条件

  • 已创建 VKE 集群,操作详情参见 创建集群

    注意

    如果镜像运行在 VCI 集群(容器网络模型为 VPC-CNI)中,通过远端代理仓库拉取镜像的方法参见 创建实例并配置远端代理仓

  • 已获取 VKE 集群所处 VPC 信息,支持在集群概览页查看。
    alt

操作步骤

第一步:创建远端代理仓

  1. 登录 镜像仓库控制台,创建远端代理仓。操作详情参见 创建远端代理仓

    • 远端代理选择 Docker 类型。
    • 必须开启镜像拉取鉴权功能,设置用户名和密码。

    alt

  2. 在远端代理仓概览页,获取 访问域名
    alt

  3. (可选)使用标准版本远端代理仓时,需要在远端代理仓的 访问控制 > VPC 页面,添加 VKE 集群所在 VPC,确保代理和集群的网络连通。添加 VPC 的说明参见 连通本账号 VPC

    说明

    小微版远端代理仓时默认使用同地域内网,无需单独配置。

    alt

第二步:创建命名空间

完成远端代理仓创建以后,需要在镜像仓库中创建和 Docker Hub 中镜像同名的命名空间。

  1. 获取 Docker Hub 中镜像所处的命名空间,本示例为 grafana

    alt

  2. 在远端代理仓中创建命名空间 grafana,操作详情参见 创建命名空间

    1. 登录 镜像仓库控制台
    2. 在顶部导航栏,选择目标地域。
    3. 在左侧导航栏单击 实例列表,然后在 实例列表 区域中找到需要创建命名空间的标准版实例,单击 进入实例
    4. 在标准版实例页面左侧导航栏单击 命名空间
    5. 命名空间 页面,单击 创建命名空间

    alt

第三步:拉取镜像

注意

拉取远端代理仓中镜像发布应用时,需要将 nginx 替换为 {访问域名}/library/nginx:latest

使用访问域名拉取镜像文件。

# docker pull [访问域名]/[命名空间]/[镜像仓库]:[镜像版本号]

docker pull ****.cr.volces.com/grafana/grafana:main-ubuntu

第四步:发布应用

支持多种方式调用远端代理仓中的镜像文件,发布应用。

  • 方式一:通过远端代理仓域名

    使用 访问域名 下载并使用镜像文件,域名支持在远端代理仓概览页查看。

    注意

    发布应用时需要将 nginx 替换为 {访问域名}/library/nginx:latest

    alt

  • 方式二:通过 Kyverno 替换访问域名

    通过 Kyverno,在部署 Kubernetes 应用时自动替换访问域名。

    1. 安装 Kyverno

    2. 创建 policy

      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: replace-image-registry-with-harbor
        annotations:
          policies.kyverno.io/title: Replace Image Registry With Harbor
          pod-policies.kyverno.io/autogen-controllers: none
          policies.kyverno.io/category: Sample
          policies.kyverno.io/severity: medium
          policies.kyverno.io/subject: Pod
          kyverno.io/kyverno-version: 1.11.4
          kyverno.io/kubernetes-version: "1.27"
          policies.kyverno.io/description: >-
            Some registries like Harbor offer pull-through caches for images from certain registries.
            Images can be re-written to be pulled from the redirected registry instead of the original and
            the registry will proxy pull the image, adding it to its internal cache.
            The imageData context variable in this policy provides a normalized view
            of the container image, allowing the policy to make decisions based on various 
            "live" image details. As a result, it requires access to the source registry and the existence
            of the target image to verify those details.
      spec:
        rules:
          - name: redirect-docker
            match:
              any:
                - resources:
                    kinds:
                      - Pod
                    operations:
                      - CREATE
                      - UPDATE
            mutate:
              foreach:
                - list: request.object.spec.initContainers[]
                  context:
                    - name: imageData
                      imageRegistry:
                        reference: "{{ element.image }}"
                  preconditions:
                    any:
                      - key: "{{imageData.registry}}"
                        operator: Equals
                        value: index.docker.io
                  patchStrategicMerge:
                    spec:
                      initContainers:
                        - name: "{{ element.name }}"
                          image: <访问域名>/{{imageData.repository}}:{{imageData.identifier}}
                - list: request.object.spec.containers[]
                  context:
                    - name: imageData
                      imageRegistry:
                        reference: "{{ element.image }}"
                  preconditions:
                    any:
                      - key: "{{imageData.registry}}"
                        operator: Equals
                        value: index.docker.io
                  patchStrategicMerge:
                    spec:
                      containers:
                        - name: "{{ element.name }}"
                          image: <访问域名>/{{imageData.repository}}:{{imageData.identifier}}
      
    3. 使用 nginx:latest 发布应用。