Todos os produtos
Search
Central de documentação

Compute Nest:Container Image Deployment Package

Última atualização: Jun 28, 2026

Para implantações que utilizam imagens de contêiner Docker, recomendamos o uso de um pacote de implantação de imagem de contêiner. O Compute Nest fornece uma instância pública do Container Registry (ACR) para hospedar e armazenar imagens, na qual cada provedor de serviços recebe um namespace exclusivo para garantir o isolamento entre locatários. Este tópico descreve os casos de uso dos pacotes de implantação de imagem de contêiner, explica seu funcionamento e mostra como criá-los e utilizá-los.

Casos de uso

Em implantações privadas que baixam imagens de contêiner Docker da internet pública, utilize um pacote de implantação de imagem de contêiner com uma chave temporária.

Importante

Os pacotes de implantação de imagem de contêiner não oferecem suporte a Auto Scaling nem a downloads frequentes de imagens após a implantação inicial.

Quando não usar pacotes de implantação de imagem de contêiner

  • Serviços sem acesso à rede pública

    Caso seus serviços não tenham acesso à internet pública, crie um repositório autogerenciado do Container Registry (ACR). Configure o endpoint interno do repositório para baixar as imagens pela rede interna. Para mais informações, consulte Configurar controle de acesso à VPC.

  • Serviços que exigem download de imagens após a implantação

    Implantação privada: Forneça um repositório público autogerenciado do Container Registry (ACR) para manter o acesso de download.

    Serviço totalmente gerenciado: Crie um repositório privado do Container Registry (ACR) e utilize o componente aliyun-acr-credential-helper, fornecido por um cluster do Container Service for Kubernetes (ACK), para baixar as imagens.

    Para mais informações, consulte Usar o componente aliyun-acr-credential-helper para baixar imagens sem usar um secret.

  • Imagens de contêiner acessíveis publicamente

    Se as suas imagens de contêiner já forem acessíveis publicamente, não é necessário utilizar um pacote de implantação de imagem de contêiner. Implante-as diretamente usando a URL do repositório público de imagens de contêiner.

Como funciona

Para garantir o isolamento entre locatários, as imagens de contêiner de diferentes provedores de serviços são armazenadas em um repositório compartilhado, mas isoladas por namespace. Cada provedor de serviços é mapeado para um namespace exclusivo. Ao enviar ou baixar uma imagem, o sistema gera uma chave temporária para o namespace com base no AliUid do provedor de serviços. O controle de acesso é aplicado no nível do namespace.

Detalhes

  1. Enviar uma imagem de contêiner para o repositório ACR do Compute Nest

    1. O provedor de serviços solicita uma chave temporária ao Compute Nest. Em seguida, o Compute Nest obtém uma chave do Container Registry (ACR) para o namespace correspondente ao AliUid do provedor de serviços.

    2. O provedor de serviços utiliza essa chave temporária para enviar a imagem de contêiner local para o repositório ACR do Compute Nest. A imagem fica armazenada no namespace associado ao AliUid do provedor de serviços.

  2. Implantar uma imagem de contêiner em um cluster ACK

    1. O Compute Nest obtém a chave temporária da imagem de contêiner do provedor de serviços e a implanta como um Secret no cluster ACK.

    2. Durante a implantação, o Compute Nest substitui o espaço reservado do pacote de implantação de imagem de contêiner pela URL da imagem no repositório de imagens de contêiner do Compute Nest e especifica o Secret implantado como credencial de download.

    3. O cluster ACK utiliza então o Secret para baixar a imagem de contêiner e concluir a implantação.

Por que usar uma solução gerenciada para pacotes de implantação de imagem de contêiner?

As imagens de contêiner Docker podem ser armazenadas no Container Registry (ACR). Embora os provedores de serviços possam enviar imagens para seus próprios repositórios privados, o Compute Nest oferece um repositório ACR do Compute Nest público. Essa solução gerenciada reduz o custo de aquisição de instâncias do ACR, simplifica a varredura de segurança e evita a exclusão acidental de imagens, garantindo segurança e estabilidade.

Implementação

Defina os dois espaços reservados a seguir no modelo do Resource Orchestration Service (ROS) do seu serviço. Esses espaços reservados são substituídos pelos valores reais durante a implantação.

  • {{ computenest::acrimage::yourimage }}: Espaço reservado para o pacote de implantação de imagem de contêiner. Durante a implantação, o Compute Nest substitui este campo pela URL da imagem de contêiner associada, como compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0.

  • {{ computenest::acr::dockerconfigjson }}: Espaço reservado para a credencial de download da imagem. Durante a implantação, este campo é substituído por uma chave temporária usada para baixar a imagem de contêiner privada.

O exemplo YAML a seguir demonstra como utilizar um pacote de implantação de imagem de contêiner. O espaço reservado da credencial de download {{ computenest::acr::dockerconfigjson }} é implantado como um Secret chamado computenestrepo. Esse Secret é então utilizado como imagePullSecret para baixar a imagem de contêiner após a substituição do espaço reservado da imagem.

Código de exemplo

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

Criar e usar

Pré-requisitos

É necessário ter o Docker instalado e uma imagem Docker criada. Caso contrário, consulte Instalar e usar o Docker.

Criar um pacote de implantação

  1. Configure as informações básicas do pacote de implantação.

    1. Faça login no console do Compute Nest. No painel de navegação à esquerda, escolha Service Deployment Package. Na aba Packages, clique em Create Deployment Package.

    2. Na seção Basic Information, configure os parâmetros a seguir.

      Parâmetro

      Descrição

      Deployment Package Name

      O nome pode conter caracteres chineses, letras, dígitos e sublinhados (_). Deve ter entre 3 e 128 caracteres, considerando que cada caractere chinês conta como dois. Não é possível alterar o nome do pacote de implantação após a criação.

      Version Name

      O nome pode conter caracteres chineses, letras, dígitos e sublinhados (_). Deve ter entre 3 e 50 caracteres, considerando que cada caractere chinês conta como dois.

      Description

      A descrição deve ter entre 10 e 500 caracteres. Cada caractere chinês conta como dois.

      Resource Group

      Selecione o grupo de recursos ao qual o pacote de implantação pertence.

      Os grupos de recursos permitem agrupar seus recursos de nuvem por uso, permissões ou propriedade, possibilitando o gerenciamento hierárquico de recursos para múltiplos usuários e projetos dentro de uma organização. Para mais informações, consulte grupos de recursos.

      Tag Settings

      Selecione ou insira uma chave de tag e um valor de tag completos para adicionar uma tag ao pacote de implantação. É possível vincular até 20 tags a um recurso. Se não houver chaves ou valores disponíveis, crie uma tag personalizada. Para mais informações, consulte Criar e vincular uma tag personalizada.

  2. Configure o pacote de implantação de imagem de contêiner.

    Esta seção utiliza o envio de uma imagem apache-php5 como exemplo.

    1. Na seção Deployment Package Content, defina Deployment Package Type como Container Image.

    2. Clique em Obtain Access Credential para obter os comandos necessários para enviar sua imagem de contêiner ao repositório do Compute Nest.

      Após obter a credencial, a página exibirá os comandos necessários. Primeiro, faça login no repositório de imagens do Compute Nest com o comando docker login. Em seguida, após inserir o Image Name e a Tag (por exemplo, latest), aplique a tag à sua imagem local usando o comando docker tag. Por fim, envie a imagem com tag para o repositório com o comando docker push.

      1. Acesse sua ferramenta de linha de comando e execute o comando de login para acessar o repositório de imagens do Compute Nest.

        docker login compute-nest-registry.cn-hangzhou.cr.aliyuncs.com --username=cr_temp_user --password=<temporary_token>
      2. Aplique a tag à sua imagem de contêiner para o repositório de imagens do Compute Nest.

        docker tag registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/lxepoo/apache-php5:latest
      3. Envie a imagem de contêiner com tag.

        docker push compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/156345785543852/registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5:latest
        The push refers to repository [compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/156345785543852/registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5]
        6bb81559e239: Pushed
        cea911103474: Pushed
        cc523d99ead5: Pushed
        b00b1ec7b8ef: Pushed
        7715ecdbe18e: Pushed
        5e755f0e0b5c: Pushed
        2a1ce34e52b6: Pushed
        28dc854edc91: Pushed
        24fc817b31ed: Pushed
        7cd75a52f72c: Pushed
        05b156d2bc54: Pushed
        8cc36998586f: Pushed
        ab73fa68e475: Pushed
        dbf739521f53: Pushed
        3e019add9ad9: Pushed
        18e3751aa1ef: Pushed
        4eb95f543324: Pushed
        a594229cce80: Pushed
        69a54e38f06b: Pushed
        d2808f8124fd: Pushed
        fe4c16cbf7a4: Pushed
        latest: digest: sha256:2afcd2b89f317e0570325817f4e8d9c93f12ac781779e365e456ae37aa297f7a size: 4700
    3. Após o envio bem-sucedido, na seção Container Image, escolha a imagem enviada e clique em Publish Deployment Package.

  3. Visualize o pacote de implantação.

    1. Retorne à página Service Deployment Package. Clique no nome do pacote de implantação para acessar a página Deployment Package Details e visualizar seu status.

    2. Quando o status mudar para Available, o pacote estará criado.

Usar o pacote de implantação

Esta seção explica como utilizar um pacote de implantação de imagem de contêiner ao criar um serviço de implantação privada.

  1. Faça login no console do Compute Nest.

  2. No painel de navegação à esquerda, clique em My Services. Na aba Created Services da página My Services, clique em Create Service.

  3. Na página Create New Service, selecione Custom launch como método de criação, escolha Private Service como tipo de serviço e clique em Next: Configure Settings.

  4. Insira as informações básicas do serviço e forneça o modelo ROS conforme necessário.

    No modelo ROS, defina o espaço reservado {{ computenest::acr::dockerconfigjson }} para a credencial de acesso e o espaço reservado {{ computenest::acrimage::yourimage }} para a imagem de contêiner dentro do recurso ALIYUN::CS::ClusterApplication.

    Modelo de exemplo

    Nota

    Este modelo de exemplo destina-se apenas a testes.

    ROSTemplateFormatVersion: '2015-09-01'
    Description:
      en: Application deployed by using 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: The password of the server. The password must be 8 to 30 characters in length and contain at least three of the following character types: uppercase letters, lowercase letters, digits, and special characters ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/
          zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)
        AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
        Label:
          en: Instance Password
          zh-cn: 实例密码
        ConstraintDescription:
          en: The password must be 8 to 30 characters in length and contain at least three of the following character types: uppercase letters, lowercase letters, digits, and special characters ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/.
          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: The ID of the existing VPC.
          zh-cn: 现有虚拟专有网络的实例ID
        AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
      VSwitchId:
        Type: String
        Label:
          en: VSwitch ID
          zh-cn: 交换机实例ID
        Description:
          en: The ID of the existing VSwitch.
          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:
          # 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 single nginx service instance.
                services:
                  # Service name
                  nginx:
                    # Docker image
                    image: {{computenest::acrimage::nginx}}
                    # 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
                # This command snippet runs 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
                # This command snippet runs 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 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 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. Na seção Deployment Package Association, Set Container Image Association. Clique em Select Deployment Package. Na caixa de diálogo exibida, selecione o pacote de implantação e a versão e clique em OK para associar o pacote de implantação de imagem de contêiner.

  6. Após criar e testar o serviço, realize uma verificação automática em relação aos critérios de lançamento do serviço e envie-o para revisão. Para mais informações, consulte Critérios de revisão.

  7. Depois que o serviço for criado, visualize a associação do pacote de implantação na página de detalhes do serviço.

    Na página de detalhes do serviço, clique na aba Deployment Package Association e, em seguida, na aba Container Image Association para visualizar a associação entre o espaço reservado (como {{ computenest::acrimage::nginx }}) e as informações correspondentes do pacote de implantação.

Documentos relacionados