演習 - Docker コンテナーを Azure にデプロイする

完了

プロジェクトには、ソリューション内のプロジェクトをビルドし、Web アプリをその App Service にデプロイするリリース パイプラインが付属しています。 ここでは、代わりにプロジェクトをコンテナーとしてビルドしてデプロイするように、パイプラインを更新しましょう。

このユニットでは、次のことを行います。

  • いくつかのパイプライン変数を定義して、ビルド パイプラインを保守しやすくします。
  • 既存のビルド タスクを、Docker コンテナーをビルドしてプッシュする統合タスクに置き換えます。
  • 既存のデプロイ タスクを、新しいコンテナー イメージを使用して App Service Web アプリを更新するタスクに置き換えます。
  • パイプラインを保存してビルドとリリースをトリガーする。

パイプライン内で共有する変数を定義する

ここでは、azure-pipelines.yml で定義されている既存の YAML パイプラインに新しいパイプライン変数を追加します。

  1. Azure DevOps から、[パイプライン] に移動します。

  2. パイプラインを選択します。

  3. [編集] を選択します。 ドロップダウン メニューから選んで、ブランチを main に設定しておきます。 これにより、azure-pipelines.yml ファイルが表示されます。

  4. 以下の強調表示されている行を追加して、webRepositorytag という名前のパイプライン変数を追加します。 これらは、参照されているコンテナーの特定のバージョンを一意に識別するために、複数のタスクで使用されます。 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:latestpython: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)

パイプラインを保存してビルドとリリースをトリガーする

  1. ページの右上隅で、[保存] を選びます。 コミット メッセージを入力し、次に [保存] を選んで確定します。

  2. [実行] を選択し、ブランチが main に設定されていることを確認します。 終了したら、[実行] を選択します。

  3. パイプラインを選択してログを表示します。 ビルドが成功したら、AzureWebAppContainer タスクを選択し、次に [App Service Application URL] を選択して、デプロイされた Web アプリを表示します。

    Screenshot of Azure Pipelines showing the location of the website URL.

  4. Web アプリが App Service 上で実行されていることを確認する必要があります。

    Screenshot of the Space Game website.

Andy: これはすばらしい結果になりました! コンテナーを採用することは、私たちのチームにとって大きなメリットになると思います。