コンテナイメージデプロイメントパッケージを使用すると、非公開の Docker コンテナイメージを Compute Nest を介してサービス利用者に配布できます。これにより、イメージを公開する必要がなくなります。Compute Nest は、各サービスプロバイダーのイメージが隔離された名前空間に保存される公開 Container Registry (ACR) リポジトリを管理します。デプロイメント中、Compute Nest はテンプレート識別子を実際のイメージ URL と短期間有効なプルキーに置き換えるため、ACK クラスターは永続的な認証情報の漏洩なしにイメージを取得できます。
Compute Nest の公開 Container Registry リポジトリを使用することで、独自の Container Registry インスタンスを運用するオーバーヘッドがなくなります。インスタンス料金、手動のアクセスの制御ポリシー、誤ってイメージを削除するリスクもありません。Compute Nest はストレージ、セキュリティスキャン、アクセスを一元的に処理します。
制限事項
コンテナイメージデプロイメントパッケージは、すべてのシナリオに適しているわけではありません。次の場合には、このアプローチを避けてください。
サービスにオートスケーリングが必要な場合。
ワークロードが頻繁にイメージをプルする場合。
いずれかの制限事項が適用される場合は、以下の「代替案」をご参照ください。
代替案
| シナリオ | 代替案 |
|---|
| サービスがインターネットにアクセスできない | セルフマネージド型の Container Registry リポジトリを作成し、内部 URL を使用して内部ネットワーク経由でイメージをプルします。詳細については、「VPC ACL の設定」をご参照ください。 |
| デプロイメント後にイメージをプルする必要がある — プライベートサービス | セルフマネージド型のパブリック Container Registry リポジトリを作成し、イメージがプル時にアクセス可能な状態を維持するようにします。 |
| デプロイメント後にイメージをプルする必要がある — フルマネージドサービス | プライベート Container Registry リポジトリを作成し、パスワードなしのイメージプルを可能にするために、ご利用の Container Service for Kubernetes (ACK) クラスターで aliyun-acr-credential-helper コンポーネント を設定します。 |
| パブリックコンテナイメージ | デプロイメント中にパブリック URL から直接プルします。デプロイメントパッケージは不要です。 |
仕組み
すべてのサービスプロバイダーは、1 つの Compute Nest 公開 Container Registry リポジトリを共有します。Compute Nest は、各プロバイダーに Alibaba Cloud アカウント ID にちなんで名付けられた専用の名前空間を割り当て、テナント間でイメージを隔離します。
イメージのアップロード
Compute Nest API を呼び出して、一時的なアップロードキーを取得します。Compute Nest は Container Registry API を呼び出し、名前空間のスコープ付きキーを返します。
その一時キーを使用して、ローカルイメージを Container Registry リポジトリにプッシュします。イメージは名前空間に格納されます。
ACK クラスターへのデプロイ
Compute Nest は、名前空間にスコープされた一時的なプルキーを生成し、ターゲット ACK クラスターに Kubernetes Secret として保存します。
Compute Nest は、Resource Orchestration Service (ROS) テンプレート内の {{ computenest::acrimage::yourimage }} 識別子を実際の Container Registry イメージ URL に置き換え、Secret を imagePullSecret として設定します。
ACK クラスターはイメージをプルしてデプロイします。
ROS テンプレート識別子
ROS テンプレートで次の識別子を定義します。Compute Nest はデプロイ時にこれらを実際の値に置き換えます。
| 識別子 | 置換先 |
|---|
{{ computenest::acrimage::yourimage }} | 関連付けられたイメージの Container Registry URL (例: compute-nest-registry.cn-hangzhou.cr.aliyuncs.com/aliUid1/volcanosh/vc-controller-manager:1.0 |
{{ computenest::acr::dockerconfigjson }} | イメージをプルするために使用される一時的なキー |
次の例は、両方の識別子を使用する ALIYUN::CS::ClusterApplication リソースを示しています。プルキーは computenestrepo という名前の Secret に保存され、その後 Deployment の 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 }}
ports:
- containerPort: 80
imagePullSecrets:
- name: computenestrepo
コンテナイメージデプロイメントパッケージの作成
開始する前に、以下を確認してください。
Compute Nest コンソールにログインします。左側のナビゲーションウィンドウで、[サービスデプロイメントパッケージ]をクリックします。[デプロイメントパッケージ] セクションで、[デプロイメントパッケージの作成]をクリックします。
[デプロイメントパッケージ情報] セクションで、次のパラメーターを設定します。
| パラメーター | 説明 |
|---|
| デプロイメントパッケージ名 | デプロイメントパッケージの名前。3~128 文字で、文字、数字、アンダースコア (_) のみを使用できます。作成後は変更できません。 |
| バージョン名 | このバージョンの名前。3~50 文字で、文字、数字、アンダースコア (_) のみを使用できます。 |
| 説明 | デプロイメントパッケージの説明。10~500 文字。 |
| リソースグループ | デプロイメントパッケージを割り当てるリソースグループ。リソースグループを使用すると、使用量、権限、リージョン別にリソースを整理できます。「リソースグループの管理」をご参照ください。 |
| タグ設定 | デプロイメントパッケージにアタッチするタグ。タグキーと値を選択または入力します。デプロイメントパッケージごとに最大 20 個のタグ。カスタムタグを作成するには、「カスタムタグの追加」をご参照ください。 |
コンテナイメージを構成します。この例では、apache-php5 イメージを使用します。
[デプロイメントパッケージコンテンツ] セクションで、[デプロイメントパッケージタイプ] を [コンテナイメージ] に設定します。
[アクセス認証情報の取得] をクリックして、Compute Nest Container Registry リポジトリのログインコマンドとイメージプッシュコマンドを取得します。
ターミナルを開き、ログインコマンドを実行してリポジトリで認証します。
ローカルイメージにタグを付けます。
タグ付けされたイメージを Compute Nest Container Registry リポジトリにプッシュします。
[製品の選択] パラメーターを設定し、[デプロイメントパッケージを公開] をクリックします。
「サービスデプロイメントパッケージ」ページに戻ります。[パッケージ] タブで、デプロイメントパッケージの ID をクリックします。[デプロイメントパッケージの詳細] ページで、状態が [利用可能] であることを確認します。
コンテナイメージデプロイメントパッケージの使用
この例では、プライベートサービスを作成して、コンテナイメージデプロイメントパッケージを参照する方法を示します。
Compute Nest コンソールにログインします。
左側のナビゲーションウィンドウで、[マイサービス] をクリックします。[作成済みサービス] タブで、[サービスの作成] をクリックします。
[サービスの作成]ページで、[サービス作成方法の選択]を[カスタム起動]に、[サービスタイプの選択]を[プライベートサービス]に設定し、[次へ: 設定の構成]をクリックします。

[基本情報] セクションを入力します。[サービスデプロイメント] セクションで、テンプレートの入力タイプを [カスタムテンプレート] に設定し、[手動でテンプレートをインポート] を選択し、[デプロイメント方法] を ROS に設定して、テンプレートの内容を入力します。ALIYUN::CS::ClusterApplication リソースに、両方の識別子を含めます:
サンプルテンプレート
説明 次のサンプルテンプレートはテストのみを目的としています。
ROSTemplateFormatVersion: '2015-09-01'
Description:
en: Docker によってデプロイされたアプリケーション
zh-cn: Docker を使用して単一アプリケーションをデプロイする
Parameters:
PayType:
Type: String
Label:
en: ECS インスタンスの課金タイプ
zh-cn: 課金タイプ
Default: PostPaid
AllowedValues:
- PostPaid
- PrePaid
AssociationProperty: ChargeType
AssociationPropertyMetadata:
LocaleKey: InstanceChargeType
PayPeriodUnit:
Type: String
Label:
en: 支払い期間単位
zh-cn: リソース購入期間
Default: Month
AllowedValues:
- Month
- Year
AssociationProperty: PayPeriodUnit
AssociationPropertyMetadata:
Visible:
Condition:
Fn::Not:
Fn::Equals:
- ${PayType}
- PostPaid
PayPeriod:
Type: Number
Label:
en: 期間
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: インスタンスタイプ
zh-cn: インスタンスタイプ
AssociationProperty: ALIYUN::ECS::Instance::InstanceType
AssociationPropertyMetadata:
InstanceChargeType: ${PayType}
AllowedValues:
- ecs.g8i.large
- ecs.g6.large
InstancePassword:
NoEcho: true
Type: String
Description:
en: サーバーログインパスワード。長さは 8~30 文字で、3 種類 (大文字、小文字、数字、()\`~!@#$%^&*_-+=|{}[]:;'<>,.?/ の特殊記号) を含める必要があります。
zh-cn: サーバーログインパスワード。長さは 8~30 文字で、3 種類 (大文字、小文字、数字、()\`~!@#$%^&*_-+=|{}[]:;'<>,.?/ の特殊記号) を含める必要があります。
AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
Label:
en: インスタンスパスワード
zh-cn: インスタンスパスワード
ConstraintDescription:
en: 長さは 8~30 文字で、3 種類 (大文字、小文字、数字、()\`~!@#$%^&*_-+=|{}[]:;'<>,.?/ の特殊記号) を含める必要があります。
zh-cn: 長さは 8~30 文字で、3 種類 (大文字、小文字、数字、()\`~!@#$%^&*_-+=|{}[]:;'<>,.?/ の特殊記号) を含める必要があります。
MinLength: 8
MaxLength: 30
AssociationProperty: ALIYUN::ECS::Instance::Password
ZoneId:
Type: String
Label:
en: ゾーン ID
zh-cn: アベイラビリティーゾーン ID
AssociationProperty: ALIYUN::ECS::Instance::ZoneId
VpcId:
Type: String
Label:
en: VPC ID
zh-cn: 仮想プライベートクラウド (VPC) インスタンス ID
Description:
en: >-
コンソール - 仮想プライベートクラウドから (vpc-xxx) で始まる ID を検索してください。
zh-cn: 既存の仮想プライベートクラウドのインスタンス ID
AssociationProperty: 'ALIYUN::ECS::VPC::VPCId'
VSwitchId:
Type: String
Label:
en: vSwitch ID
zh-cn: vSwitch インスタンス ID
Description:
en: >-
既存のビジネスネットワーク vSwitch のインスタンス ID。コンソール - 仮想プライベートクラウド - vSwitch でクエリしてください。
zh-cn: 既存のビジネスネットワーク vSwitch のインスタンス ID
Default: ''
AssociationProperty: 'ALIYUN::ECS::VSwitch::VSwitchId'
AssociationPropertyMetadata:
VpcId: VpcId
ZoneId: ZoneId
AdminPassword:
Type: String
AssociationProperty: ALIYUN::ECS::Instance::Password
Label: 管理者パスワード
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:
# 課金方法。
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 ファイル内のパラメーターを参照できます。
# NGINX サービスインスタンス。
services:
# サービス名。
nginx:
# Docker イメージ。
image: {{computenest::acrimage::nginx}}
# ポートマッピング。
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 の起動前に実行されるコードスニペット。コマンド内のパラメーターを参照できます。
echo "before docker compose starts"
mkdir -p /home/admin/application/nginx/logs
systemctl start docker-compose-app
sleep 10
# Docker Compose の起動後に実行されるコードスニペット。コマンド内のパラメーターを参照できます。
echo "after docker compose starts"
echo ${AdminPassword}
# スクリプトが正常に実行されるとコールバックが呼び出され、WaitCondition はシグナル送信を待つ必要がなくなります。
${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: 課金方法の構成
- Parameters:
- EcsInstanceType
- InstancePassword
Label:
default: リソース構成
- Parameters:
- AdminPassword
Label:
en: ソフトウェア構成
zh-cn: ソフトウェア構成
- Parameters:
- ZoneId
- VpcId
- VSwitchId
Label:
default: ゾーン構成
[デプロイメントパッケージの関連付け] セクションで、[コンテナイメージの関連付けを設定] を見つけ、[デプロイメントパッケージの選択] をクリックします。 [デプロイメントパッケージの選択 (コンテナイメージの関連付け)] ダイアログボックスで、作成したデプロイメントパッケージとバージョンを選択し、[OK] をクリックします。
残りのパラメーターを設定し、[サービスの作成] をクリックします。サービスが作成された後、テストを実行します。テストに合格した後、Compute Nest のレビュー基準を満たしていることを確認し、レビューのために提出します。詳細については、「レビュー基準」をご参照ください。
サービス詳細ページで、[サービス詳細] タブに移動します。[サービスデプロイメント] セクションで、[関連付けられたデプロイメントパッケージ] タブをクリックし、次に [コンテナイメージの関連付け] タブを開いてデプロイメントパッケージの関連付けを確認します。
次のステップ
サービスの作成 — Compute Nest でのサービス作成ワークフロー全体を学習します。
デプロイメントパッケージの削除 — 不要になったデプロイメントパッケージまたはバージョンを削除します。
バージョンの作成 — イメージが変更されたときに、既存のデプロイメントパッケージの新しいバージョンを公開します。
サービス更新設定の構成 — デプロイメントパッケージの更新が実行中のサービスにどのように適用されるかを制御します。