演習 - Docker コンテナーを Azure にデプロイする
プロジェクトには、ソリューション内のプロジェクトをビルドし、Web アプリをその App Service にデプロイするリリース パイプラインが付属しています。 ここでは、代わりにプロジェクトをコンテナーとしてビルドしてデプロイするように、パイプラインを更新しましょう。
このユニットでは、次のことを行います。
- いくつかのパイプライン変数を定義して、ビルド パイプラインを保守しやすくします。
- 既存のビルド タスクを、Docker コンテナーをビルドしてプッシュする統合タスクに置き換えます。
- 既存のデプロイ タスクを、新しいコンテナー イメージを使用して App Service Web アプリを更新するタスクに置き換えます。
- パイプラインを保存してビルドとリリースをトリガーする。
パイプライン内で共有する変数を定義する
ここでは、azure-pipelines.yml で定義されている既存の YAML パイプラインに新しいパイプライン変数を追加します。
Azure DevOps から、[パイプライン] に移動します。
パイプラインを選択します。
[編集] を選択します。 ドロップダウン メニューから選んで、ブランチを main に設定しておきます。 これにより、azure-pipelines.yml ファイルが表示されます。
以下の強調表示されている行を追加して、
webRepository
とtag
という名前のパイプライン変数を追加します。 これらは、参照されているコンテナーの特定のバージョンを一意に識別するために、複数のタスクで使用されます。buildConfiguration
変数を削除することもできます。もう必要ありません。trigger: - '*' variables: buildConfiguration: 'Release' webRepository: 'web' tag: '$(Build.BuildId)'
ビルド ステージのタスクを置き換える
Andy:プロジェクト フォルダー内の Dockerfile で必要なビルドがすでに定義されているため、これらのビルド タスクはもう必要ないと思います。 しかし、Dockerfile を使用してイメージをビルドするために、何を使用できるか確かめる機会がありませんでした。 何かいい考えはありますか?
Mara: ちょうどそれを調べていました。 コンテナーをビルドし、1 つのタスクでリポジトリにプッシュすることもできるはずです。 これからそれを追加してみましょう。
Docker タスク
Docker タスクを使って、Docker イメージをビルドおよびデプロイできます。 [ビルド] ステージ全体を、次の YAML スニペットで置き換えます。
- command:実行する Docker コマンドを指定します。
- buildContext:ビルド コンテキストへのパスを指定します。
- repository:リポジトリの名前を指定します。
- dockerfile:Dockerfile へのパスを指定します。
- containerRegistry:Docker レジストリ サービス接続の名前を指定します。
- tags: 別の行でタグの一覧を指定します。 これらのタグは、build、push、buildAndPush の各コマンドで使われます。
- stage: 'Build'
displayName: 'Build and push'
jobs:
- job: 'Build'
displayName: 'Build job'
pool:
vmImage: 'ubuntu-20.04'
steps:
- task: Docker@2
displayName: 'Build and push the image to container registry'
inputs:
command: buildAndPush
buildContext: $(Build.Repository.LocalPath)
repository: $(webRepository)
dockerfile: '$(Build.SourcesDirectory)/Tailspin.SpaceGame.Web/Dockerfile'
containerRegistry: 'Container Registry Connection'
tags: |
$(tag)
デプロイ ステージのタスクを置き換える
Andy:とてもわかりやすいように見えますね。 これで、あと見つける必要があるのは、新しくプッシュしたバージョンのコンテナー イメージを使うように App Service に指示するタスクだけです。
Mara: 既に取り組んでいます。 Azure Pipelines にビルドをデプロイする場合とは少し異なりますが、十分直接的で、1 つのタスクでジョブを完了することができます。 これからそれを追加してみましょう。
Azure Web App for Container タスク
Azure Web App for Container タスクは、Docker コンテナーを Azure App Service にデプロイするために設計されています。 [デプロイ] ステージ全体を、次の YAML スニペットで置き換えます。
- appName:既存の Azure App Service の名前を指定します。
- azureSubscription:デプロイ用の Azure Resource Manager サブスクリプションの名前を指定します。
- imageName:完全修飾コンテナー イメージ名を指定します。たとえば、
myregistry.azurecr.io/nginx:latest
やpython:3.7.2-alpine/
などです。
- stage: 'Deploy'
displayName: 'Deploy the container'
dependsOn: Build
jobs:
- job: 'Deploy'
displayName: 'Deploy job'
pool:
vmImage: 'ubuntu-20.04'
variables:
- group: Release
steps:
- task: AzureWebAppContainer@1
inputs:
appName: $(WebAppName)
azureSubscription: 'Resource Manager - Tailspin - Space Game'
imageName: $(RegistryName)/$(webRepository):$(build.buildId)
パイプラインを保存してビルドとリリースをトリガーする
ページの右上隅で、[保存] を選びます。 コミット メッセージを入力し、次に [保存] を選んで確定します。
[実行] を選択し、ブランチが main に設定されていることを確認します。 終了したら、[実行] を選択します。
パイプラインを選択してログを表示します。 ビルドが成功したら、AzureWebAppContainer タスクを選択し、次に [App Service Application URL] を選択して、デプロイされた Web アプリを表示します。
Web アプリが App Service 上で実行されていることを確認する必要があります。
Andy: これはすばらしい結果になりました! コンテナーを採用することは、私たちのチームにとって大きなメリットになると思います。