すべてのプロダクト
Search
ドキュメントセンター

Compute Nest:コンテナイメージデプロイメントパッケージ

最終更新日:Jun 08, 2025

Docker コンテナイメージを使用するシナリオでは、コンテナイメージデプロイメントパッケージを使用してサービスをデプロイすることをお勧めします。 Compute Nest は、コンテナイメージを管理および保存するためのパブリック Container Registry リポジトリを提供します。 各サービスプロバイダーは、マルチテナントデータ分離を実装するための名前空間に対応しています。 このトピックでは、コンテナイメージデプロイメントパッケージのシナリオ、コンテナイメージデプロイメントパッケージの仕組み、およびコンテナイメージデプロイメントパッケージの作成方法と使用方法について説明します。

シナリオ

インターネット経由でプルされた Docker コンテナイメージを使用してサービスをデプロイする場合に、コンテナイメージを公開したくない場合は、一時キーを使用してプルされるコンテナイメージデプロイメントパッケージを使用できます。

重要

コンテナイメージデプロイメントパッケージは、自動スケーリングが必要なシナリオや、イメージを頻繁にプルする必要があるシナリオには適用できません。

コンテナイメージデプロイメントパッケージがシナリオに適用できない場合のソリューション

  • サービスがインターネットにアクセスできないシナリオ

    サービスがインターネットにアクセスできない場合は、セルフマネージド Container Registry リポジトリを作成し、内部 URL を使用して内部ネットワーク経由でイメージをプルします。 詳細については、「VPC ACL を構成する」をご参照ください。

  • サービスのデプロイ後にイメージをプルするシナリオ

    プライベートサービス: セルフマネージドパブリック Container Registry リポジトリを作成して、イメージをプルできるようにします。

    フルマネージドサービス: プライベート Container Registry リポジトリを作成し、Container Service for Kubernetes(ACK)クラスタによって提供されるパスワードなしイメージプルプラグインを使用してイメージをプルします。

    詳細については、「aliyun-acr-credential-helper コンポーネントを使用して、シークレットを使用せずにイメージをプルする」をご参照ください。

  • パブリックコンテナイメージが使用されるシナリオ

    パブリックコンテナイメージが使用される場合は、パブリック URL を使用して、サービスのデプロイ中にイメージをプルします。 コンテナイメージデプロイメントパッケージを使用する必要はありません。

実装

複数のサービスプロバイダーのコンテナイメージは、同じイメージリポジトリに保存されます。 マルチテナントデータ分離を実装するために、Compute Nest は各サービスプロバイダーを個別の名前空間に割り当てます。 サービスプロバイダーのコンテナイメージは、対応する名前空間に保存されます。 イメージのアップロードとプルのための一時キーは、対応するサービスプロバイダーの Alibaba Cloud アカウント ID に基づいて名前空間に対して生成されます。 このようにして、名前空間ベースでアクセス制御が実装されます。

詳細

  1. Compute Nest の Container Registry リポジトリにコンテナイメージをアップロードする

    1. サービスプロバイダーは、Compute Nest の操作を呼び出して一時キーを取得します。 Compute Nest は Container Registry の操作を呼び出して、名前がサービスプロバイダーの Alibaba Cloud アカウント ID である名前空間の一時キーを取得します。

    2. サービスプロバイダーは、取得した一時キーを使用して、ローカルコンテナイメージを Compute Nest の Container Registry リポジトリにアップロードします。 コンテナイメージは、名前がサービスプロバイダーの Alibaba Cloud アカウント ID である名前空間に保存されます。

  2. ACK クラスタにコンテナイメージをデプロイする

    1. Compute Nest は、サービスプロバイダーのコンテナイメージをプルするための一時キーを取得し、一時キーは ACK クラスタの Secret に保存されます。

    2. Compute Nest は、コンテナイメージデプロイメントパッケージを Compute Nest の Container Registry リポジトリ内のコンテナイメージの URL に置き換え、ACK クラスタに保存されている Secret をコンテナイメージをプルするためのキーとして指定します。

    3. ACK クラスタは、コンテナイメージをプルしてデプロイします。

Compute Nest がコンテナイメージデプロイメントパッケージのマネージドソリューションを使用するのはなぜですか?

Docker コンテナイメージは、Alibaba Cloud Container Registry に保存できます。 サービスプロバイダーは、自分のプライベートリポジトリにイメージをアップロードし、自分でイメージを管理できます。 ただし、Container Registry インスタンスの購入コストを削減し、セキュリティスキャンを容易にし、サービスプロバイダーが誤ってイメージを削除するのを防ぐために、Compute Nest は パブリック Container Registry リポジトリ を提供します。 このリポジトリは、サービスプロバイダーのコンテナイメージを保存および維持するためにのみ使用されます。 これにより、セキュリティと安定性が確保されます。

使用上の注意

サービスの Resource Orchestration Service(ROS)テンプレートで、次の識別子を定義する必要があります。 識別子は、サービスのデプロイ中に実際の値に置き換えられます。

  • {{ computenest::acrimage::yourimage }}: コンテナイメージデプロイメントパッケージの識別子。 サービステンプレートをデプロイすると、Compute Nest は識別子を関連付けられたコンテナイメージデプロイメントパッケージの URL(compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0 など)に置き換えます。

  • {{ computenest::acr::dockerconfigjson }}: コンテナイメージをプルするために使用されるキーの識別子。 サービステンプレートをデプロイすると、Compute Nest は識別子をコンテナイメージをプルするために使用される一時キーに置き換えます。

次の YAML ファイルの例は、コンテナイメージデプロイメントパッケージを使用してサービスをデプロイする方法を示しています。 コンテナイメージをプルするために使用される {{ computenest::acr::dockerconfigjson }} キーは、computenestrepo Secret に保存されます。 デプロイパッケージ識別子がコンテナイメージデプロイメントパッケージの URL に置き換えられた後、Secret は imagePullSecret として使用されてコンテナイメージをプルします。

サンプルコード

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 }}  # コンテナイメージのURL
                  ports:
                  - containerPort: 80
                imagePullSecrets:
                - name: computenestrepo

コンテナイメージデプロイメントパッケージを作成して使用する

前提条件

Docker がインストールされており、Docker イメージが作成されていること。 詳細については、「Docker をインストールして使用する」をご参照ください。

コンテナイメージデプロイメントパッケージを作成する

  1. デプロイメントパッケージの基本情報を構成します。

    1. Compute Nest コンソール にログインします。 左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ] をクリックします。 サービスデプロイメントパッケージページの [デプロイメントパッケージ] セクションで、[デプロイメントパッケージの作成] をクリックします。

    2. [デプロイメントパッケージ情報] セクションで、次の表に示すパラメータを構成します。

      パラメータ

      説明

      デプロイメントパッケージ名

      デプロイメントパッケージの名前。 名前は 3 ~ 128 文字で、文字、数字、およびアンダースコア(_)を含めることができます。 デプロイメントパッケージの作成後、名前を変更することはできません。

      バージョン名

      デプロイパッケージバージョンの名前。 名前は 3 ~ 50 文字で、文字、数字、およびアンダースコア(_)を含めることができます。

      説明

      デプロイメントパッケージの説明。 説明は 10 ~ 500 文字でなければなりません。

      リソースグループ

      デプロイメントパッケージが属するリソースグループの名前。

      リソースグループは、使用状況、権限、およびリージョン別にリソースをグループ化するために使用されます。 リソースグループを使用して、リソースを階層的に編成し、ユーザーとプロジェクトに基づいてリソースをグループ化できます。 詳細については、「リソースグループを管理する」をご参照ください。

      タグ設定

      デプロイメントパッケージに追加するタグ。 完全なタグキーとタグ値を選択または入力します。 デプロイメントパッケージには最大 20 個のタグを追加できます。 使用可能なタグキーまたはタグ値がない場合は、カスタムタグを作成できます。 詳細については、「カスタムタグを追加する」をご参照ください。

  2. コンテナイメージデプロイメントパッケージを構成します。

    この例では、apache-php5 イメージがアップロードされます。

    1. [デプロイメントパッケージの内容] セクションで、[デプロイメントパッケージの種類] パラメーターを [コンテナーイメージ] に設定します。

    2. [アクセス認証情報の取得] をクリックして、Compute Nest の Container Registry リポジトリにログインし、Compute Nest の Container Registry リポジトリにコンテナーイメージをアップロードするために使用されるコマンドを取得します。

      image

      1. CLI にログインし、取得したコマンドを実行して Compute Nest の Container Registry リポジトリにログインします。

        image

      2. コンテナーイメージにタグを付けます。

        image

      3. タグ付けされたコンテナーイメージを Compute Nest の Container Registry リポジトリにプッシュします。

        image

    3. [製品の選択] パラメーターを設定し、[デプロイメントパッケージの公開] をクリックします。

  3. 重要: このチュートリアルでは、基本的な知識があることを前提としています。 JavaScript と REST API について理解している必要があります。

    1. [サービスデプロイメントパッケージ] ページに戻ります。「パッケージ」タブで、デプロイメントパッケージを見つけ、その ID をクリックします。 [デプロイメントパッケージの詳細] ページで、デプロイメントの進捗状況を確認します。

    2. デプロイメント パッケージが [利用可能] 状態の場合、デプロイメント パッケージは作成されています。

コンテナイメージデプロイメントパッケージの使用

この例では、コンテナイメージデプロイメントパッケージの使用方法を説明するためにプライベートサービスが作成されます。

  1. Compute Nest コンソール にログインします。

  2. 左側のナビゲーションウィンドウで、[マイサービス] をクリックします。 [マイサービス] ページの [作成済みサービス] タブで、[サービスの作成] をクリックします。

  3. [サービスの作成] ページで、[サービス作成方法の選択][カスタム起動] に設定し、[サービスの種類の選択][プライベートサービス] に設定して、[次へ: 設定の構成] をクリックします。

    image

  4. [サービスの作成] ページで、[基本情報] セクションのパラメーターを指示に従って構成します。 [サービスデプロイメント] セクションで、nst.vendor.create.tplInputType.label パラメーターを [カスタムテンプレート] に設定し、[テンプレートを手動でインポート] を選択し、[デプロイ方法] パラメーターを ROS に設定して、テンプレートコンテンツを入力します。

    ROS テンプレートの ALIYUN::CS::ClusterApplication リソースで、アクセス認証情報を指定する {{ computenest::acr::dockerconfigjson }} 識別子と、コンテナイメージデプロイメントパッケージを指定する {{ computenest::acrimage::yourimage }} 識別子を定義します。

    サンプルテンプレート

    説明

    このサンプルテンプレートはテスト専用です。

    ROSTemplateFormatVersion: '2015-09-01'
    Description:
      en: Application deployed by docker
      zh-cn: 使用docker部署单机应用  // 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,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号) // サーバーログインパスワード、長さ8〜30、3つの項目(大文字、小文字、数字、() `〜!@#$%^&* _- + = | {} []:;'< >、。?/の特殊記号)を含める必要があります
        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,必须包含三项(大文字、小文字、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中の特殊記号)// 長さ8〜30、3つの項目(大文字、小文字、数字、() `〜!@#$%^&* _- + = | {} []:;'< >、。?/の特殊記号)を含める必要があります
        MinLength: 8
        MaxLength: 30
        AssociationProperty: ALIYUN::ECS::Instance::Password
      ZoneId:
        Type: String
        Label:
          en: Zone ID
          zh-cn: 可用区ID // アベイラビリティーゾーン ID
        AssociationProperty: ALIYUN::ECS::Instance::ZoneId
      VpcId:
        Type: String
        Label:
          en: VPC ID
          zh-cn: 专有网络VPC实例ID // 専用ネットワーク VPC インスタンス ID
        Description:
          en: >-
            Please search the ID starting with (vpc-xxx) from console-Virtual
            Private Cloud
          zh-cn: 现有虚拟专有网络的实例ID // 既存の仮想プライベートクラウドのインスタンスID
        AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
      VSwitchId:
        Type: String
        Label:
          en: VSwitch ID
          zh-cn: 交换机实例ID // スイッチインスタンス ID
        Description:
          en: >-
            Instance ID of existing business network switches, console-Virtual
            Private Cloud-VSwitches under query
          zh-cn: 现有业务网络交换机的实例ID // 既存のビジネスネットワークスイッチのインスタンスID、コンソール - 仮想プライベートクラウド - クエリのVSwitches
        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
                # docker-compose.yaml ファイルでパラメーターを参照できます。 // You can reference parameters in the docker-compose.yaml file.
                # NGINX サービスインスタンス。 // A NGINX service instance.
                services:
                  # サービス名。 // The service name.
                  nginx:
                    # Docker イメージ。 // 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
    
                # Docker Compose が起動する前に実行されるコードスニペット。コマンドでパラメーターを参照できます。 // 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
                # Docker Compose が起動した後に実行されるコードスニペット。コマンドでパラメーターを参照できます。 // The code snippet that is run after Docker Compose starts. You can reference parameters in the command.
                echo "after docker compose starts"
                echo ${AdminPassword}
                
                # スクリプトが正常に実行されるとコールバックが呼び出され、WaitCondition はシグナルの送信を待つ必要がなくなります。 // 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. [デプロイメントパッケージの関連付け] セクションで、[コンテナイメージの関連付けの設定] を見つけて、[デプロイメントパッケージの選択] をクリックします。 [デプロイメントパッケージの選択 (コンテナイメージの関連付け)] ダイアログボックスで、デプロイメントパッケージとバージョンを選択し、[OK] をクリックします。

  6. その他のパラメーターを構成し、[サービスの作成] をクリックします。サービスが作成されたら、サービスをテストします。サービスがテストに合格したら、サービスが Compute Nest サービスのレビュー基準を満たしているかどうかを確認し、サービスをレビューに提出します。 詳細については、「レビュー基準」をご参照ください。

  7. サービスが作成されたら、サービスの詳細ページに移動します。 [サービスの詳細] タブで、[サービスデプロイメント] セクションを見つけ、[関連付けられたデプロイメントパッケージ] タブをクリックします。 [コンテナイメージの関連付け] タブで、デプロイメントパッケージとの関連付けを表示します。

参考資料

  • Compute Nest でサービスを作成する方法の詳細については、「サービスを作成する」をご参照ください。

  • デプロイパッケージまたはデプロイパッケージバージョンが不要になった場合は、削除できます。詳細については、「デプロイパッケージを削除する」をご参照ください。

  • コンテンツなど、デプロイパッケージを変更する必要がある場合は、新しいバージョンを作成できます。詳細については、「バージョンを作成する」をご参照ください。

  • デプロイパッケージの更新設定を構成する方法の詳細については、「サービスの更新設定を構成する」をご参照ください。