All Products
Search
Document Center

Compute Nest:Artefak gambar kontainer

Last Updated:Apr 02, 2026

Paket penyebaran gambar kontainer memungkinkan Anda mendistribusikan gambar kontainer Docker privat kepada konsumen layanan melalui Compute Nest tanpa membuat gambar tersebut tersedia secara publik. Compute Nest mengelola repositori Container Registry (ACR) publik tempat gambar dari setiap penyedia layanan disimpan dalam namespace terisolasi. Selama penerapan, Compute Nest mengganti pengenal templat dengan URL gambar aktual dan kunci pull berdurasi pendek, sehingga kluster ACK dapat menarik gambar Anda tanpa mengekspos kredensial secara permanen.

Penggunaan repositori Container Registry publik Compute Nest menghilangkan beban menjalankan instans Container Registry sendiri—tanpa biaya instans, kebijakan kontrol akses manual, maupun risiko penghapusan gambar secara tidak sengaja. Compute Nest mengelola penyimpanan, pemindaian keamanan, dan akses secara terpusat.

Batasan

Paket penyebaran gambar kontainer tidak cocok untuk semua skenario. Hindari pendekatan ini jika:

  • Layanan Anda memerlukan auto scaling.

  • Workload Anda pulls images frequently.

Jika salah satu batasan tersebut berlaku, lihat Alternatif di bawah.

Alternatif

SkenarioAlternatif
Layanan tidak dapat mengakses InternetBuat repositori Container Registry yang dikelola sendiri dan tarik gambar melalui jaringan internal menggunakan URL internal. Lihat Configure a VPC ACL.
Gambar harus ditarik setelah penerapan — layanan privatBuat repositori Container Registry publik yang dikelola sendiri agar gambar tetap dapat diakses saat proses pull.
Gambar harus ditarik setelah penerapan — layanan fully managedBuat repositori Container Registry privat dan konfigurasikan komponen aliyun-acr-credential-helper di kluster Container Service for Kubernetes (ACK) Anda untuk menarik gambar tanpa kata sandi.
Gambar kontainer publikTarik langsung dari URL publik selama penerapan. Tidak diperlukan paket penyebaran.

Cara kerja

Semua penyedia layanan berbagi satu repositori Container Registry publik Compute Nest. Compute Nest menetapkan namespace khusus untuk setiap penyedia yang dinamai sesuai ID akun Alibaba Cloud mereka, sehingga gambar tetap terisolasi antar penyewa.

Unggah gambar

  1. Panggil API Compute Nest untuk mendapatkan kunci unggah sementara. Compute Nest memanggil API Container Registry dan mengembalikan kunci tercakup (scoped key) untuk namespace Anda.

  2. Gunakan kunci sementara tersebut untuk mendorong (push) gambar lokal Anda ke repositori Container Registry. Gambar tersebut akan masuk ke namespace Anda.

Terapkan ke kluster ACK

  1. Compute Nest menghasilkan kunci pull sementara yang tercakup pada namespace Anda dan menyimpannya sebagai Secret Kubernetes di kluster ACK target.

  2. Compute Nest mengganti pengenal {{ computenest::acrimage::yourimage }} dalam Template Resource Orchestration Service (ROS) Anda dengan URL gambar Container Registry yang sebenarnya, serta menetapkan Secret tersebut sebagai imagePullSecret.

  3. Kluster ACK menarik dan menerapkan gambar tersebut.

Pengenal templat ROS

Tentukan pengenal berikut dalam templat ROS Anda. Compute Nest akan menggantinya dengan nilai aktual saat penerapan.

PengenalDiganti dengan
{{ computenest::acrimage::yourimage }}URL Container Registry dari gambar terkait, contohnya: compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0
{{ computenest::acr::dockerconfigjson }}Kunci sementara yang digunakan untuk menarik gambar

Contoh berikut menunjukkan resource ALIYUN::CS::ClusterApplication yang menggunakan kedua pengenal tersebut. Kunci pull disimpan dalam Secret bernama computenestrepo, yang kemudian dirujuk sebagai imagePullSecret untuk Penyebaran (Deployment).

Contoh kode

Resources:
  ClusterApplication:
    Type: ALIYUN::CS::ClusterApplication
    Properties:
      YamlContent: |
          apiVersion: v1
          data:
            .dockerconfigjson: {{computenest::acr::dockerconfigjson}}
          kind: Secret
          metadata:
            name: computenestrepo
            namespace: nginx
          type: kubernetes.io/dockerconfigjson
          ---
          apiVersion: apps/v1
          kind: Deployment
          spec:
            template:
              spec:
                containers:
                - name: nginx
                  image: {{ computenest::acrimage::nginx }}
                  ports:
                  - containerPort: 80
                imagePullSecrets:
                - name: computenestrepo

Buat paket penyebaran gambar kontainer

Sebelum memulai, pastikan Anda telah:

  • Menginstal Docker dan membuat gambar Docker. Lihat Install and use Docker.

  • Memastikan bahwa paket penyebaran gambar kontainer sesuai dengan skenario Anda (lihat Batasan).

  1. Masuk ke Konsol Compute Nest. Di panel navigasi kiri, klik Service Deployment Package. Di bagian Deployment Package, klik Create Deployment Package.

  2. Di bagian Deployment Package Information, konfigurasikan parameter berikut.

    ParameterDeskripsi
    Deployment Package NameNama untuk paket penyebaran. Harus terdiri dari 3–128 karakter; hanya huruf, angka, dan garis bawah (_). Tidak dapat diubah setelah dibuat.
    Version NameNama untuk versi ini. Harus terdiri dari 3–50 karakter; hanya huruf, angka, dan garis bawah (_).
    DescriptionDeskripsi paket penyebaran. Harus terdiri dari 10–500 karakter.
    Resource GroupKelompok sumber daya tempat paket penyebaran akan ditugaskan. Kelompok sumber daya memungkinkan Anda mengatur sumber daya berdasarkan penggunaan, izin, dan wilayah. Lihat Manage resource groups.
    Tag SettingsTag yang akan dilampirkan ke paket penyebaran. Pilih atau masukkan kunci tag dan nilainya. Maksimal 20 tag per paket penyebaran. Untuk membuat tag kustom, lihat Add a custom tag.
  3. Konfigurasikan gambar kontainer. Contoh ini menggunakan gambar apache-php5.

    1. Di bagian Deployment Package Content, atur Deployment Package Type menjadi Container Image.

    2. Klik Obtain Access Credential untuk mendapatkan perintah login dan perintah push gambar ke repositori Container Registry Compute Nest. image

    3. Buka terminal dan jalankan perintah login untuk mengautentikasi ke repositori. image

    4. Beri tag gambar lokal Anda. image

    5. Dorong (push) gambar yang telah diberi tag ke repositori Container Registry Compute Nest. image

  4. Atur parameter Select Product, lalu klik Publish Deployment Package.

  5. Kembali ke halaman Service Deployment Package. Di tab Packages, klik ID paket penyebaran. Di halaman Deployment Package Details, pastikan statusnya adalah Available.

Gunakan paket penyebaran gambar kontainer

Contoh ini membuat layanan privat untuk menunjukkan cara mereferensikan paket penyebaran gambar kontainer.

  1. Masuk ke Konsol Compute Nest.

  2. Di panel navigasi kiri, klik My Services. Di tab Created Services, klik Create Service.

  3. Di halaman Create Service, atur Select Service Creation Method menjadi Custom Launch dan Select Service Type menjadi Private Service, lalu klik Next: Configure Settings.

    image

  4. Lengkapi bagian Basic Information. Di bagian Service Deployment, atur jenis input templat menjadi Custom Template, pilih Manually Import Template, atur Deployment Method menjadi ROS, lalu masukkan konten templat Anda. Dalam resource ALIYUN::CS::ClusterApplication, sertakan kedua pengenal berikut:

    • {{ computenest::acr::dockerconfigjson }} — kredensial pull

    • {{ computenest::acrimage::yourimage }} — referensi gambar kontainer

    Templat contoh

    Catatan

    Templat contoh berikut hanya untuk pengujian.

    ROSTemplateFormatVersion: '2015-09-01'
    Description:
      en: Application deployed by docker
      zh-cn:  使用docker部署单机应用
    Parameters:
      PayType:
        Type: String
        Label:
          en: ECS Instance Charge Type
          zh-cn: 付费类型
        Default: PostPaid
        AllowedValues:
          - PostPaid
          - PrePaid
        AssociationProperty: ChargeType
        AssociationPropertyMetadata:
          LocaleKey: InstanceChargeType
      PayPeriodUnit:
        Type: String
        Label:
          en: Pay Period Unit
          zh-cn: 购买资源时长周期
        Default: Month
        AllowedValues:
          - Month
          - Year
        AssociationProperty: PayPeriodUnit
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
      PayPeriod:
        Type: Number
        Label:
          en: Period
          zh-cn: 购买资源时长
        Default: 1
        AllowedValues:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
        AssociationProperty: PayPeriod
        AssociationPropertyMetadata:
          Visible:
            Condition:
              Fn::Not:
                Fn::Equals:
                  - ${PayType}
                  - PostPaid
      EcsInstanceType:
        Type: String
        Label:
          en: Instance Type
          zh-cn: 实例类型
        AssociationProperty: ALIYUN::ECS::Instance::InstanceType
        AssociationPropertyMetadata:
          InstanceChargeType: ${PayType}
        AllowedValues:
          - ecs.g8i.large
          - ecs.g6.large
    
      InstancePassword:
        NoEcho: true
        Type: String
        Description:
          en: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
          zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
        AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
        Label:
          en: Instance Password
          zh-cn: 实例密码
        ConstraintDescription:
          en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in)
          zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
        MinLength: 8
        MaxLength: 30
        AssociationProperty: ALIYUN::ECS::Instance::Password
      ZoneId:
        Type: String
        Label:
          en: Zone ID
          zh-cn: 可用区ID
        AssociationProperty: ALIYUN::ECS::Instance::ZoneId
      VpcId:
        Type: String
        Label:
          en: VPC ID
          zh-cn: 专有网络VPC实例ID
        Description:
          en: >-
            Please search the ID starting with (vpc-xxx) from console-Virtual
            Private Cloud
          zh-cn: 现有虚拟专有网络的实例ID
        AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
      VSwitchId:
        Type: String
        Label:
          en: vSwitch ID
          zh-cn: 交换机实例ID
        Description:
          en: >-
            Instance ID of existing business network switches, console-Virtual
            Private Cloud-VSwitches under query
          zh-cn: 现有业务网络交换机的实例ID
        Default: ''
        AssociationProperty: 'ALIYUN::ECS::VSwitch::VSwitchId'
        AssociationPropertyMetadata:
          VpcId: VpcId
          ZoneId: ZoneId
      AdminPassword:
        Type: String
        AssociationProperty: ALIYUN::ECS::Instance::Password
        Label: Administrator password
        NoEcho: True
    Resources:
      SecurityGroup:
        Type: ALIYUN::ECS::SecurityGroup
        Properties:
          SecurityGroupName:
            Ref: ALIYUN::StackName
          VpcId:
            Ref: VpcId
          SecurityGroupIngress:
            - PortRange: 80/80
              Priority: 1
              SourceCidrIp: 0.0.0.0/0
              IpProtocol: tcp
              NicType: internet
      InstanceGroup:
        Type: ALIYUN::ECS::InstanceGroup
        Properties:
          # The billing method.
          InstanceChargeType:
            Ref: PayType
          PeriodUnit:
            Ref: PayPeriodUnit
          Period:
            Ref: PayPeriod
          VpcId:
            Ref: VpcId
          VSwitchId:
            Ref: VSwitchId
          SecurityGroupId:
            Ref: SecurityGroup
          ZoneId:
            Ref: ZoneId
          ImageId: centos_7
          Password:
            Ref: InstancePassword
          InstanceType:
            Ref: EcsInstanceType
          SystemDiskCategory: cloud_essd
          SystemDiskSize: 200
          InternetMaxBandwidthOut: 5
          IoOptimized: optimized
          MaxAmount: 1
      WaitCondition:
        Type: ALIYUN::ROS::WaitCondition
        Properties:
          Count: 1
          Handle:
            Ref: WaitConditionHandle
          Timeout: 300
      WaitConditionHandle:
        Type: ALIYUN::ROS::WaitConditionHandle
      InstallPackage:
        Type: ALIYUN::ECS::RunCommand
        Properties:
          InstanceIds:
            Fn::GetAtt:
              - InstanceGroup
              - InstanceIds
          Type: RunShellScript
          Sync: true
          Timeout: 300
          CommandContent:
            Fn::Sub:
              - |
                yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
                yum makecache fast
                yum -y install docker-ce jq
                systemctl enable docker
                systemctl start docker
                sleep 10
    
                dockerJson='{{ computenest::acr::dockerconfigjson }}'
                decodeDockerJson=$(echo $dockerJson | base64 -d)
                host=$(echo $decodeDockerJson | jq '.auths' | jq 'keys' | jq .[0])
                username=$(echo $decodeDockerJson | jq ".auths.$host.username" | tr -d '"')
                password=$(echo $decodeDockerJson | jq ".auths.$host.password" | tr -d '"')
                host=$(echo $host | tr -d '"')
                docker login $host --username=$username --password=$password
    
                mkdir -p /home/admin/application
                cat >/home/admin/application/docker-compose.yaml<<EOF
                # You can reference parameters in the docker-compose.yaml file.
                # A NGINX service instance.
                services:
                  # The service name.
                  nginx:
                    # The Docker image.
                    image: {{computenest::acrimage::nginx}}
                    # The port mapping.
                    ports:
                      - 80:80
                    volumes:
                      - /home/admin/application/nginx/logs:/var/log/nginx/
                EOF
    
                cat > /etc/systemd/system/docker-compose-app.service <<EOF
                [Unit]
                Description=Docker Compose Application Service
                Requires=docker.service
                After=docker.service
    
                [Service]
                Type=oneshot
                RemainAfterExit=yes
                WorkingDirectory=/home/admin/application
                ExecStart=/usr/bin/docker compose up -d
                ExecStop=/usr/bin/docker compose down
                TimeoutStartSec=0
    
                [Install]
                WantedBy=multi-user.target
                EOF
    
                systemctl enable docker-compose-app
    
                # The code snippet that is run before Docker Compose starts. You can reference parameters in the command.
                echo "before docker compose starts"
                mkdir -p /home/admin/application/nginx/logs
    
                systemctl start docker-compose-app
                sleep 10
                # The code snippet that is run after Docker Compose starts. You can reference parameters in the command.
                echo "after docker compose starts"
                echo ${AdminPassword}
    
                # The callback is invoked when the script is successfully run, and WaitCondition no longer needs to wait for sending signals.
                ${CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}"
              - CurlCli:
                  Fn::GetAtt:
                    - WaitConditionHandle
                    - CurlCli
    Outputs:
      Endpoint:
        Value:
          Fn::Sub:
            - http://${Address}:80
            - Address:
                Fn::Select:
                - 0
                - Fn::GetAtt:
                  - InstanceGroup
                  - PublicIps
    Metadata:
      ALIYUN::ROS::Interface:
        ParameterGroups:
          - Parameters:
              - PayType
              - PayPeriodUnit
              - PayPeriod
            Label:
              default: billing method configuration
          - Parameters:
              - EcsInstanceType
              - InstancePassword
            Label:
              default: resource configuration
    
          - Parameters:
              - AdminPassword
            Label:
              en: Software Configuration
              zh-cn: 软件配置
    
          - Parameters:
              - ZoneId
              - VpcId
              - VSwitchId
            Label:
              default: zone configuration
  5. Di bagian Deployment Package Association, temukan Set Container Image Association dan klik Select Deployment Package. Di kotak dialog Select Deployment Package (Container Image Association), pilih paket penyebaran dan versi yang telah Anda buat, lalu klik OK.

  6. Lengkapi parameter yang tersisa dan klik Create Service. Setelah layanan dibuat, uji layanan tersebut. Setelah layanan lolos pengujian, verifikasi bahwa layanan memenuhi kriteria tinjauan Compute Nest dan kirimkan untuk ditinjau. Lihat Review criteria.

  7. Di halaman detail layanan, buka tab Service Details. Di bagian Service Deployment, klik tab Associated Deployment Packages, lalu buka tab Associate Container Image untuk mengonfirmasi asosiasi paket penyebaran.

Langkah selanjutnya