演習 - Docker コンテナーを Azure にデプロイする
プロジェクトには、ソリューション内のプロジェクトをビルドし、その App Service に Web アプリをデプロイするリリース パイプラインが付属しています。 次は、そのパイプライン ビルドを更新し、代わりにプロジェクトをコンテナーとしてデプロイします。
このユニットでは、次のことを行います。
- ビルド パイプラインの保守を容易にするために、いくつかのパイプライン変数を定義します。
- 既存の ビルド タスクを統合タスクに置き換えて、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)'
ビルド ステージ タスクを置き換える
アンディ: プロジェクト フォルダー内の Dockerfile によって必要なビルドが既に定義されているため、これらのビルド タスクはもう必要ないと思います。 しかし、Dockerfile を使用してイメージを構築するために何を使用できるかをまだ確認する機会がありませんでした。 アイデアはありますか?
マラ: 私はちょうどそれを調べていた。 コンテナーをビルドし、1 つのタスクでリポジトリにプッシュできる必要があるようです。 ここで追加しましょう。
Docker タスク
Docker タスクを使用して、Docker イメージをビルドしてデプロイできます。 ビルド ステージ全体を、以下の YAML スニペットに置き換えます。
- コマンド: 実行する Docker コマンドを指定します。
- buildContext: ビルド コンテキストへのパスを指定します。
- repository: リポジトリの名前を指定します。
- dockerfile: Dockerfile へのパスを指定します。
- containerRegistry: Docker レジストリ サービス接続の名前を指定します。
- tags: 別々の行のタグのリストを指定します。 これらのタグは、ビルド、プッシュ、および 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)
デプロイステージのタスクを置き換える
アンディ: まあ、それはかなり簡単に思えます。 ここで必要なのは、新しくプッシュされたバージョンのコンテナー イメージを使用するように App Service に指示するタスクを見つけることです。
マラ: 私はすでにそれに乗っています。 ビルドを Azure Pipelines にデプロイするのとは少し異なりますが、1 つのタスクでジョブを完了するのに十分なダイレクトです。 ここで追加しましょう。
Azure Web App for Container タスク
Azure Web App for Container タスクは、Docker コンテナーを Azure App Service にデプロイするように設計されています。 Deploy ステージ全体を、以下の 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 アプリケーション URL を 選択してデプロイされた Web アプリを表示します。
App Service で実行されている Web アプリが表示されます。
アンディ: これは素晴らしい結果を得た! コンテナーの採用は、チームにとって大きな勝利になると思います。