カスタム コンテナーを使用してカスタム ソフトウェアを Azure App Service に移行するMigrate custom software to Azure App Service using a custom container

Azure App Service は、IIS 上で稼働する ASP.NET や IIS 上で稼働する Node.js など、Windows 上の定義済みのアプリケーション スタックを提供します。Azure App Service provides pre-defined application stacks on Windows like ASP.NET or Node.js, running on IIS. Windows 環境があらかじめ構成されていることで、オペレーティング システムは、管理アクセスやソフトウェアのインストール、グローバル アセンブリ キャッシュへの変更などができないようにロックされます (「Azure App Service におけるオペレーティング システムの機能」を参照)。The preconfigured Windows environment locks down the operating system from administrative access, software installations, changes to the global assembly cache, and so on (see Operating system functionality on Azure App Service). ただし、App Service でカスタム Windows コンテナーを使用するとアプリで必要な OS の変更を行うことができるので、カスタム OS とソフトウェアの構成が必要なオンプレミスのアプリを簡単に移行できます。However, using a custom Windows container in App Service lets you make OS changes that your app needs, so it's easy to migrate on-premises app that requires custom OS and software configuration. このチュートリアルでは、Windows フォント ライブラリにインストールされているカスタム フォントを使用する ASP.NET アプリを App Service に移行する方法を示します。This tutorial demonstrates how to migrate to App Service an ASP.NET app that uses custom fonts installed in the Windows font library. Visual Studio からカスタム構成の Windows イメージを Azure Container Registry に展開した後、App Service でそれを実行します。You deploy a custom-configured Windows image from Visual Studio to Azure Container Registry, and then run it in App Service.

Windows コンテナーで実行中の Web アプリを示します。

前提条件Prerequisites

このチュートリアルを完了するには、以下が必要です。To complete this tutorial:

アプリをローカルでセットアップするSet up the app locally

サンプルのダウンロードDownload the sample

この手順では、ローカルな .NET プロジェクトを設定します。In this step, you set up the local .NET project.

サンプル プロジェクトには、Windows フォント ライブラリにインストールされているカスタム フォントを使用する簡単な ASP.NET アプリケーションが含まれています。The sample project contains a simple ASP.NET application that uses a custom font that is installed into the Windows font library. フォントをインストールする必要はありませんが、基になる OS と統合されているアプリの一例です。It's not necessary to install fonts, but it's an example of an app that is integrated with the underlying OS. このようなアプリを App Service に移行するには、統合を削除するようにコードを再設計するか、またはカスタム Windows コンテナーにそのまま移行します。To migrate such an app to App Service, you either rearchitect your code to remove the integration, or migrate it as-is in a custom Windows container.

フォントをインストールするInstall the font

エクスプローラーで custom-font-win-container-master/CustomFontSample に移動し、FrederickatheGreat-Regular.ttf を右クリックして、 [インストール] を選択します。In Windows Explorer, navigate to custom-font-win-container-master/CustomFontSample, right-click FrederickatheGreat-Regular.ttf, and select Install.

このフォントは、Google Fonts で一般公開されています。This font is publicly available from Google Fonts.

アプリを実行するRun the app

custom-font-win-container/CustomFontSample.sln ファイルを Visual Studio で開きます。Open the custom-font-win-container/CustomFontSample.sln file in Visual Studio.

デバッグせずにアプリを実行するには、Ctrl+F5 キーを押します。Type Ctrl+F5 to run the app without debugging. アプリが既定のブラウザーに表示されます。The app is displayed in your default browser.

既定のブラウザーに表示されているアプリを示すスクリーンショット。

アプリはインストールされているフォントを使用するため、App Service サンド ボックスでは実行できません。Because it uses an installed font, the app can't run in the App Service sandbox. ただし、Windows コンテナーにフォントをインストールできるので、代わりに Windows コンテナーを使用して展開することができます。However, you can deploy it using a Windows container instead, because you can install the font in the Windows container.

Windows コンテナーを構成するConfigure Windows container

ソリューション エクスプローラーで CustomFontSample を右クリックし、 [追加] > [Container Orchestration Support](コンテナー オーケストレーションのサポート) を選択します。In Solution Explorer, right-click the CustomFontSample project and select Add > Container Orchestration Support.

CustomFontSample プロジェクトを示す [ソリューション エクスプローラー] ウィンドウのスクリーンショット。[追加] および [コンテナー オーケストレーター サポート] メニュー項目が選択されている。

[Docker Compose] > [OK] を選択します。Select Docker Compose > OK.

プロジェクトが Windows コンテナーで実行するように設定されます。Your project is now set up to run in a Windows container. DockerfileCustomFontSample プロジェクトに追加され、docker-compose プロジェクトがソリューションに追加されます。A Dockerfile is added to the CustomFontSample project, and a docker-compose project is added to the solution.

ソリューション エクスプローラーで Dockerfile を開きます。From the Solution Explorer, open Dockerfile.

サポートされている親イメージを使用する必要があります。You need to use a supported parent image. FROM 行を次のコードに置き換えることで、親イメージを変更します。Change the parent image by replacing the FROM line with the following code:

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-windowsservercore-ltsc2019

ファイルの末尾に次の行を追加し、ファイルを保存します。At the end of the file, add the following line and save the file:

RUN ${source:-obj/Docker/publish/InstallFont.ps1}

CustomFontSample プロジェクトには InstallFont.ps1 があります。You can find InstallFont.ps1 in the CustomFontSample project. これはフォントをインストールする簡単なスクリプトです。It's a simple script that installs the font. さらに複雑なバージョンのスクリプトがスクリプト センターにあります。You can find a more complex version of the script in the Script Center.

注意

Windows コンテナーをローカルでテストするには、ローカル コンピューターで Docker が起動していることを確認します。To test the Windows container locally, make sure that Docker is started on your local machine.

Azure Container Registry に発行するPublish to Azure Container Registry

Azure Container Registry では、コンテナーの展開用にイメージを格納することができます。Azure Container Registry can store your images for container deployments. Azure Container Registry でホストされているイメージを使用するように App Service を構成できます。You can configure App Service to use images hosted in Azure Container Registry.

発行ウィザードを開くOpen publish wizard

ソリューション エクスプローラーで CustomFontSample プロジェクトを右クリックし、 [発行] を選択します。In the Solution Explorer, right-click the CustomFontSample project and select Publish.

CustomFontSample プロジェクトを示し、[発行] が選択されているソリューション エクスプローラーのスクリーンショット。

レジストリを作成して発行するCreate registry and publish

発行ウィザードで [コンテナー レジストリ] > [新しい Azure コンテナー レジストリを作成する] > [発行] を選択します。In the publish wizard, select Container Registry > Create New Azure Container Registry > Publish.

[コンテナー レジストリ]、[新しい Azure コンテナー レジストリを作成する]、[発行] ボタンの順に選択されているところを示す発行ウィザードのスクリーンショット。

Azure アカウントでサインインするSign in with Azure account

[新しい Azure コンテナー レジストリを作成する] ダイアログ ボックスで、 [アカウントの追加] をクリックし、Azure サブスクリプションにサインインします。In the Create a new Azure Container Registry dialog, select Add an account, and sign in to your Azure subscription. 既にサインインしている場合は、目的のサブスクリプションを含んだアカウントをドロップダウンから選択します。If you're already signed in, select the account containing the desired subscription from the dropdown.

Azure へのサインイン

レジストリを構成するConfigure the registry

次の表の推奨値に基づいて新しいコンテナー レジストリを構成します。Configure the new container registry based on the suggested values in the following table. 完了したら、 [作成] をクリックします。When finished, click Create.

設定Setting 推奨値Suggested value 詳細情報For more information
DNS プレフィックスDNS Prefix 生成されたレジストリ名をそのまま使用するか、または別の一意名に変更します。Keep the generated registry name, or change it to another unique name.
リソース グループResource Group [新規] をクリックし、「myResourceGroup」と入力して、 [OK] をクリックします。Click New, type myResourceGroup, and click OK.
SKUSKU BasicBasic 価格レベルPricing tiers
レジストリの場所Registry Location 西ヨーロッパWest Europe

Azure コンテナー レジストリを構成する

ターミナル ウィンドウが開き、イメージの展開の進行状況が表示されます。A terminal window is opened and displays the image deployment progress. デプロイが完了するまで待ちます。Wait for the deployment to complete.

Azure へのサインインSign in to Azure

Azure Portal ( https://portal.azure.com ) にサインインします。Sign in to the Azure portal at https://portal.azure.com.

Web アプリを作成するCreate a web app

左側のメニューから [リソースの作成] > [Web] > [Web App for Containers] を選択します。From the left menu, select Create a resource > Web > Web App for Containers.

アプリの基本情報を構成するConfigure app basics

基本 タブで、次の表に従って設定を構成し、Next: Docker(次へ: Docker をクリックします。In the Basics tab, configure the settings according to the following table, then click Next: Docker.

設定Setting 推奨値Suggested value 詳細情報For more information
サブスクリプションSubscription 正しいサブスクリプションが選択されていることを確認します。Make sure the correct subscription is selected.
リソース グループResource Group [新規作成] を選択し、「myResourceGroup」と入力して、 [OK] をクリックします。Select Create new, type myResourceGroup, and click OK.
名前Name 一意の名前を入力します。Type a unique name. Web アプリの URL は http://<app-name>.azurewebsites.net です。<app-name> には自分のアプリの名前を指定します。The URL of the web app is http://<app-name>.azurewebsites.net, where <app-name> is your app name.
発行Publish Docker コンテナーDocker container
オペレーティング システムOperating System WindowsWindows
リージョンRegion 西ヨーロッパWest Europe
Windows プランWindows Plan [新規作成] を選択し、「myAppServicePlan」と入力して、 [OK] をクリックします。Select Create new, type myAppServicePlan, and click OK.

[基本] タブは、次のように表示されます。Your Basics tab should look like this:

Web アプリの構成に使用する [基本] タブを示します。

Windows コンテナーを構成するConfigure Windows container

[Docker] タブで、次の表に示したようにカスタム Windows コンテナーを構成し、 [確認および作成] を選択します。In the Docker tab, configure your custom Windows container as shown in the following table, and select Review + create.

設定Setting 推奨値Suggested value
イメージのソースImage Source Azure Container RegisterAzure Container Register
レジストリRegistry 以前に作成したレジストリを選択します。Select the registry you created earlier.
ImageImage customfontsamplecustomfontsample
TagTag latestlatest

アプリの作成を完了するComplete app creation

[作成] をクリックして、必要なリソースが Azure によって作成されるのを待ちます。Click Create and wait for Azure to create the required resources.

Web アプリを参照するBrowse to the web app

Azure の処理が完了すると、通知ボックスが表示されます。When the Azure operation is complete, a notification box is displayed.

Azure の処理が完了したことを示します。

  1. [リソースに移動] をクリックします。Click Go to resource.

  2. アプリ ページで、 [URL] の下にあるリンクをクリックします。In the app page, click the link under URL.

新しいブラウザー ページが開いて次のページが表示されます。A new browser page is opened to the following page:

Web アプリの新しいブラウザー ページを示します。

期待した美しいフォントでホーム ページが表示されるまで、数分待ってからもう一度試します。Wait a few minutes and try again, until you get the homepage with the beautiful font you expect:

構成したフォントでホームページを表示します。

お疲れさまでした。Congratulations! Windows コンテナーで Azure App Service に ASP.NET アプリケーションを移行しました。You've migrated an ASP.NET application to Azure App Service in a Windows container.

コンテナーの起動ログの表示See container start-up logs

Windows コンテナーが読み込まれるまでにしばらく時間がかかる場合があります。It may take some time for the Windows container to load. 進行状況を確認するには、 <app-name> をアプリの名前に置き換えて次の URL に移動します。To see the progress, navigate to the following URL by replacing <app-name> with the name of your app.

https://<app-name>.scm.azurewebsites.net/api/logstream

次のようなログがストリーム配信されます。The streamed logs looks like this:

14/09/2018 23:16:19.889 INFO - Site: fonts-win-container - Creating container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest.
14/09/2018 23:16:19.928 INFO - Site: fonts-win-container - Create container for image: customfontsample20180914115836.azurecr.io/customfontsample:latest succeeded. Container Id 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:23.405 INFO - Site: fonts-win-container - Start container succeeded. Container: 329ecfedbe370f1d99857da7352a7633366b878607994ff1334461e44e6f5418
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:17:28.637 INFO - Site: fonts-win-container - Configuring container
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container ready
14/09/2018 23:18:03.823 INFO - Site: fonts-win-container - Container start-up and configuration completed successfully

Azure App Service では、組み込みイメージとカスタム イメージのどちらも、Docker コンテナー テクノロジを使用してホストされます。Azure App Service uses the Docker container technology to host both built-in images and custom images. 組み込みイメージを一覧表示するには、Azure CLI コマンド "az webapp list-runtimes --linux" を実行します。To see a list of built-in images, run the Azure CLI command, 'az webapp list-runtimes --linux'. それらのイメージでニーズが満たせない場合は、カスタム イメージを作成してデプロイすることができます。If those images don't satisfy your needs, you can build and deploy a custom image.

このチュートリアルでは、以下の内容を学習します。In this tutorial, you learn how to:

  • ニーズを満たす組み込みイメージがない場合にカスタム イメージを作成するBuild a custom image if no built-in image satisfies your needs
  • Azure 上のプライベート コンテナー レジストリにカスタム イメージをプッシュするPush the custom image to a private container registry on Azure
  • App Service 内でカスタム イメージを実行するRun the custom image in App Service
  • 環境変数を構成するConfigure environment variables
  • イメージを更新して再デプロイするUpdate and redeploy the image
  • 診断ログにアクセスするAccess diagnostic logs
  • SSH を使用してコンテナーに接続するConnect to the container using SSH

このチュートリアルが完了すると、わずかですがコンテナー レジストリの料金がお使いの Azure アカウントに発生します。また、そのコンテナーをホストする期間が 1 か月を超えると、さらにコストが発生します。Completing this tutorial incurs a small charge in your Azure account for the container registry and can incur additional costs for hosting the container for longer than a month.

初期環境を設定するSet up your initial environment

  • アクティブなサブスクリプションが含まれる Azure アカウントを用意します。Have an Azure account with an active subscription. 無料でアカウントを作成できますCreate an account for free.
  • Docker をインストールします。これを Docker イメージの作成に使用します。Install Docker, which you use to build Docker images. Docker をインストールするには、コンピューターの再起動が必要になる場合があります。Installing Docker may require a computer restart.
  • Azure Cloud Shell で Bash 環境を使用します。Use the Bash environment in Azure Cloud Shell.

    新しいウィンドウで Cloud Shell を起動するLaunch Cloud Shell in a new window

  • 必要に応じて、Azure CLI をインストールして、CLI リファレンス コマンドを実行します。If you prefer, install the Azure CLI to run CLI reference commands.

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。If you're using a local installation, sign in to the Azure CLI by using the az login command. 認証プロセスを完了するには、ターミナルに表示される手順に従います。To finish the authentication process, follow the steps displayed in your terminal. その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。For additional sign-in options, see Sign in with the Azure CLI.

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。When you're prompted, install Azure CLI extensions on first use. 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。For more information about extensions, see Use extensions with the Azure CLI.

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。Run az version to find the version and dependent libraries that are installed. 最新バージョンにアップグレードするには、az upgrade を実行します。To upgrade to the latest version, run az upgrade.

  • このチュートリアルには、Azure CLI のバージョン 2.0.80 以降が必要です。This tutorial requires version 2.0.80 or later of the Azure CLI. Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。If using Azure Cloud Shell, the latest version is already installed.

Docker をインストールした後、または Azure Cloud Shell を実行した後、ターミナル ウィンドウを開いて、Docker がインストールされていることを確認します。After installing Docker or running Azure Cloud Shell, open a terminal window and verify that docker is installed:

docker --version

サンプル アプリをクローンまたはダウンロードするClone or download the sample app

このチュートリアルのサンプルは、Git Clone またはダウンロードによって入手できます。You can obtain the sample for this tutorial via git clone or download.

Git でのクローンClone with git

サンプル リポジトリをクローンします。Clone the sample repository:

git clone https://github.com/Azure-Samples/docker-django-webapp-linux.git --config core.autocrlf=input

Linux コンテナー内で使用される適切な行末がファイルに使用されるよう、必ず --config core.autocrlf=input 引数を追加してください。Be sure to include the --config core.autocrlf=input argument to guarantee proper line endings in files that are used inside the Linux container:

次に、そのフォルダーに移動します。Then go into that folder:

cd docker-django-webapp-linux

GitHub からのダウンロードDownload from GitHub

Git Clone を使用する代わりに、https://github.com/Azure-Samples/docker-django-webapp-linux にアクセスして [Clone](クローン) を選択し、 [Download ZIP](ZIP のダウンロード) を選択してもかまいません。Instead of using git clone, you can visit https://github.com/Azure-Samples/docker-django-webapp-linux, select Clone, and then select Download ZIP.

その ZIP ファイルを、docker-django-webapp-linux という名前のフォルダーに展開します。Unpack the ZIP file into a folder named docker-django-webapp-linux.

次に、その docker-django-webapp-linux フォルダーからターミナル ウィンドウを開きます。Then open a terminal window in that docker-django-webapp-linux folder.

(省略可) Docker ファイルを調べる(Optional) Examine the Docker file

サンプル内の Dockerfile という名前のファイルには、Docker イメージが記述されているほか、構成に関する命令が含まれています。The file in the sample named Dockerfile that describes the docker image and contains configuration instructions:

FROM tiangolo/uwsgi-nginx-flask:python3.6

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir
ADD . /code/

# ssh
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
    && apt-get install -y --no-install-recommends openssh-server \
    && echo "$SSH_PASSWD" | chpasswd 

COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/

RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000 2222

#CMD ["python", "/code/manage.py", "runserver", "0.0.0.0:8000"]
ENTRYPOINT ["init.sh"]
  • 1 つ目のコマンド グループは、アプリの要件を環境にインストールするものです。The first group of commands installs the app's requirements in the environment.
  • 2 つ目のコマンド グループで、コンテナーとホストとの間で安全に通信を行うための SSH サーバーが作成されます。The second group of commands create an SSH server for secure communication between the container and the host.
  • 最後の行 (ENTRYPOINT ["init.sh"]) は、init.sh を呼び出して SSH サービスと Python サーバーを起動しています。The last line, ENTRYPOINT ["init.sh"], invokes init.sh to start the SSH service and Python server.

イメージをローカルで作成してテストするBuild and test the image locally

注意

Docker Hub には、無料ユーザーごとに、IP あたりの匿名プル数と、認証済みプル数にクォータがあります (「データ転送」を参照してください)Docker Hub has quotas on the number of anonymous pulls per IP and the number of authenticated pulls per free user (see Data transfer). まだログインしておらず、Docker Hub からのプルが制限されていることに気付いた場合は docker login を試してください。If you notice your pulls from Docker Hub are being limited, try docker login if you're not already logged in.

  1. 次のコマンドを実行して、イメージをビルドします。Run the following command to build the image:

    docker build --tag appsvc-tutorial-custom-image .
    
  2. Docker コンテナーをローカルで実行して、ビルドの動作をテストします。Test that the build works by running the Docker container locally:

    docker run -p 8000:8000 appsvc-tutorial-custom-image
    

    この docker run コマンドに -p 引数でポートを指定し、続けてイメージの名前を指定します。This docker run command specifies the port with the -p argument followed by the name of the image.

    ヒント

    Windows を実行していて "standard_init_linux.go:211: exec user process caused "no such file or directory" (standard_init_linux.go:211: exec ユーザー プロセスが原因で "ファイルまたはディレクトリの欠落" が発生しました) " というエラーが表示された場合、LF であるはずの init.sh ファイルの行末が CR-LF になっています。If you are running on Windows and see the error, standard_init_linux.go:211: exec user process caused "no such file or directory", the init.sh file contains CR-LF line endings instead of the expected LF endings. このエラーは、Git を使用してサンプル リポジトリをクローンした際、--config core.autocrlf=input パラメーターを省略した場合に発生します。This error happens if you used git to clone the sample repository but omitted the --config core.autocrlf=input parameter. その場合は、`--config`` 引数を使用して、再度リポジトリをクローンしてください。In this case, clone the repository again with the `--config`` argument. init.sh を編集し、行末に CRLF を使用して保存した場合にも、このエラーが表示される可能性があります。You might also see the error if you edited init.sh and saved it with CRLF endings. この場合は、行末を LF のみにして再度ファイルを保存してください。In this case, save the file again with LF endings only.

  3. ブラウザーで http://localhost:8000 にアクセスして、Web アプリとコンテナーが正しく機能していることを確認します。Browse to http://localhost:8000 to verify the web app and container are functioning correctly.

    ローカルでの Web アプリのテスト

リソース グループを作成するCreate a resource group

このセクション以降では、イメージをプッシュして Azure App Service にコンテナーをデプロイするためのリソースを Azure にプロビジョニングします。In this section and those that follow, you provision resources in Azure to which you push the image and then deploy a container to Azure App Service. 最初に、これらすべてのリソースを集約するリソース グループを作成します。You start by creating a resource group in which to collect all these resources.

az group create コマンドを実行してリソース グループを作成します。Run the az group create command to create a resource group:

az group create --name AppSvc-DockerTutorial-rg --location westus2

--location の値を変更することで最寄りのリージョンを指定できます。You can change the --location value to specify a region near you.

Azure Container Registry にイメージをプッシュするPush the image to Azure Container Registry

このセクションでは、Azure Container Registry にイメージをプッシュします。App Service は、そこからイメージをデプロイすることができます。In this section, you push the image to Azure Container Registry from which App Service can deploy it.

  1. az acr create コマンドを実行して Azure Container Registry を作成します。Run the az acr create command to create an Azure Container Registry:

    az acr create --name <registry-name> --resource-group AppSvc-DockerTutorial-rg --sku Basic --admin-enabled true
    

    <registry-name> は、適切なレジストリ名に置き換えてください。Replace <registry-name> with a suitable name for your registry. この名前は Azure 全体で一意である必要があり、使用できるのはアルファベットと数字のみです。The name must contain only letters and numbers and must be unique across all of Azure.

  2. az acr show コマンドを実行して、レジストリの資格情報を取得します。Run the az acr show command to retrieve credentials for the registry:

    az acr credential show --resource-group AppSvc-DockerTutorial-rg --name <registry-name>
    

    このコマンドの JSON 出力からは、レジストリのユーザー名と共に 2 つのパスワードが得られます。The JSON output of this command provides two passwords along with the registry's user name.

  3. docker login コマンドを使用して、コンテナー レジストリにサインインします。Use the docker login command to sign in to the container registry:

    docker login <registry-name>.azurecr.io --username <registry-username>
    

    <registry-name><registry-username> は、前の手順で得られた値に置き換えてください。Replace <registry-name> and <registry-username> with values from the previous steps. 入力を求められたら、前の手順のいずれかのパスワードを入力します。When prompted, type in one of the passwords from the previous step.

    このセクションでは、以降すべての手順で同じレジストリ名を使用します。You use the same registry name in all the remaining steps of this section.

  4. ログインに成功したら、レジストリのローカル Docker イメージにタグを付けます。Once the login succeeds, tag your local Docker image for the registry:

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  5. docker push コマンドを使用してレジストリにイメージをプッシュします。Use the docker push command to push the image to the registry:

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    イメージの初回アップロードには、基本イメージが含まれるため、数分かかる場合があります。Uploading the image the first time might take a few minutes because it includes the base image. 通常、それ以降のアップロードはもっと短時間で済みます。Subsequent uploads are typically faster.

    待っている間、次のセクションの手順を実行して、レジストリからデプロイするための構成を App Service に対して行うことができます。While you're waiting, you can complete the steps in the next section to configure App Service to deploy from the registry.

  6. az acr repository list コマンドを使用してプッシュが成功したことを確認します。Use the az acr repository list command to verify that the push was successful:

    az acr repository list -n <registry-name>
    

    自分のイメージの名前が出力に表示されます。The output should show the name of your image.

レジストリからイメージをデプロイするように App Service を構成するConfigure App Service to deploy the image from the registry

Azure App Service にコンテナーをデプロイするには、まず App Service に Web アプリを作成した後、その Web アプリをコンテナー レジストリに接続します。To deploy a container to Azure App Service, you first create a web app on App Service, then connect the web app to the container registry. Web アプリが起動すると、App Service によって自動的にレジストリからイメージがプルされます。When the web app starts, App Service automatically pulls the image from the registry.

  1. az appservice plan create コマンドを使用して App Service プランを作成します。Create an App Service plan using the az appservice plan create command:

    az appservice plan create --name AppSvc-DockerTutorial-plan --resource-group AppSvc-DockerTutorial-rg --is-linux
    

    App Service プランは、Web アプリのホストとなる仮想マシンに相当します。An App Service plan corresponds to the virtual machine that hosts the web app. 前のコマンドでは、最初の月は無料で利用できる低コストの B1 価格レベルが既定で使用されます。By default, the previous command uses an inexpensive B1 pricing tier that is free for the first month. レベルは、--sku パラメーターで制御できます。You can control the tier with the --sku parameter.

  2. az webpp create コマンドを使用して Web アプリを作成します。Create the web app with the az webpp create command:

    az webapp create --resource-group AppSvc-DockerTutorial-rg --plan AppSvc-DockerTutorial-plan --name <app-name> --deployment-container-image-name <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    <app-name> は Web アプリの名前に置き換えてください。この名前は Azure 全体で一意である必要があります。Replace <app-name> with a name for the web app, which must be unique across all of Azure. また、<registry-name> は、前のセクションで指定したレジストリの名前に置き換えます。Also replace <registry-name> with the name of your registry from the previous section.

  3. az webapp config appsettings set を使用して、アプリのコードで想定されている値に WEBSITES_PORT 環境変数を設定します。Use az webapp config appsettings set to set the WEBSITES_PORT environment variable as expected by the app code:

    az webapp config appsettings set --resource-group AppSvc-DockerTutorial-rg --name <app-name> --settings WEBSITES_PORT=8000
    

    <app-name> は、前のステップで使用した名前に置き換えてください。Replace <app-name> with the name you used in the previous step.

    この環境変数の詳細については、サンプルの GitHub リポジトリにある Readme を参照してください。For more information on this environment variable, see the readme in the sample's GitHub repository.

  4. az webapp identity assign コマンドを使用して、Web アプリのマネージド ID を有効にします。Enable managed identity for the web app by using the az webapp identity assign command:

    az webapp identity assign --resource-group AppSvc-DockerTutorial-rg --name <app-name> --query principalId --output tsv
    

    <app-name> は、前のステップで使用した名前に置き換えてください。Replace <app-name> with the name you used in the previous step. コマンドからは、--query 引数と --output 引数のフィルターを通じて、割り当てられた ID のサービス プリンシパルが出力されます。このサービス プリンシパルは、この後すぐに使用します。The output of the command (filtered by the --query and --output arguments) is the service principal of the assigned identity, which you use shortly.

    マネージド ID を利用すれば、特定の資格情報なしに、他の Azure リソースへのアクセス許可を Web アプリに与えることができます。Managed identity allows you to grant permissions to the web app to access other Azure resources without needing any specific credentials.

  5. az account show コマンドを使用してサブスクリプション ID を取得します。次の手順でサブスクリプション ID が必要になります。Retrieve your subscription ID with the az account show command, which you need in the next step:

    az account show --query id --output tsv
    
  6. コンテナー レジストリへのアクセス許可を Web アプリに与えます。Grant the web app permission to access the container registry:

    az role assignment create --assignee <principal-id> --scope /subscriptions/<subscription-id>/resourceGroups/AppSvc-DockerTutorial-rg/providers/Microsoft.ContainerRegistry/registries/<registry-name> --role "AcrPull"
    

    次の値を置き換えます。Replace the following values:

    • <principal-id> を、az webapp identity assign コマンドで得たサービス プリンシパル ID に置き換えます。<principal-id> with the service principal ID from the az webapp identity assign command
    • <registry-name> を、コンテナー レジストリの名前に置き換えます。<registry-name> with the name of your container registry
    • <subscription-id> を、az account show コマンドから取得したサブスクリプション ID に置き換えます。<subscription-id> with the subscription ID retrieved from the az account show command

これらのアクセス許可については、「Azure ロールベースのアクセス制御とは」を参照してください。For more information about these permissions, see What is Azure role-based access control and

イメージをデプロイしてアプリをテストするDeploy the image and test the app

これらの手順は、イメージがコンテナー レジストリにプッシュされ、App Service が完全にプロビジョニングされてから実行してください。You can complete these steps once the image is pushed to the container registry and the App Service is fully provisioned.

  1. az webapp config container set コマンドを使用して、コンテナー レジストリと Web アプリ用にデプロイするイメージを指定します。Use the az webapp config container set command to specify the container registry and the image to deploy for the web app:

    az webapp config container set --name <app-name> --resource-group AppSvc-DockerTutorial-rg --docker-custom-image-name <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest --docker-registry-server-url https://<registry-name>.azurecr.io
    

    <app_name> を自分の Web アプリの名前に、また 2 か所ある <registry-name> を実際のレジストリの名前に置き換えてください。Replace <app_name> with the name of your web app and replace <registry-name> in two places with the name of your registry.

    • この例のように Docker Hub 以外のレジストリを使用する場合、--docker-registry-server-url は、https:// の後にレジストリの完全修飾ドメイン名が続く形式にする必要があります。When using a registry other than Docker Hub (as this example shows), --docker-registry-server-url must be formatted as https:// followed by the fully qualified domain name of the registry.
    • "No credential was provided to access Azure Container Registry. Trying to look up... (Azure Container Registry にアクセスするための資格情報が指定されませんでした。...を検索しています)" というメッセージは、Azure がコンテナー レジストリに対する認証で、ユーザー名とパスワードを求めるのではなく、アプリのマネージド ID を使用していることを表します。The message, "No credential was provided to access Azure Container Registry. Trying to look up..." tells you that Azure is using the app's managed identity to authenticate with the container registry rather than asking for a username and password.
    • "AttributeError: 'NoneType' object has no attribute 'reserved' (AttributeError: 'NoneType' オブジェクトには 'reserved' という属性はありません)" というエラーが発生した場合は、指定した <app-name> が正しいことを確認してください。If you encounter the error, "AttributeError: 'NoneType' object has no attribute 'reserved'", make sure your <app-name> is correct.

    ヒント

    Web アプリのコンテナー設定は、az webapp config container show --name <app-name> --resource-group AppSvc-DockerTutorial-rg というコマンドを使用していつでも取得できます。You can retrieve the web app's container settings at any time with the command az webapp config container show --name <app-name> --resource-group AppSvc-DockerTutorial-rg. イメージは、DOCKER_CUSTOM_IMAGE_NAME プロパティで指定されます。The image is specified in the property DOCKER_CUSTOM_IMAGE_NAME. Web アプリが Azure DevOps または Azure Resource Manager テンプレートを使用してデプロイされる場合、イメージが、LinuxFxVersion という名前のプロパティにも反映されることがあります。When the web app is deployed through Azure DevOps or Azure Resource Manager templates, the image can also appear in a property named LinuxFxVersion. どちらのプロパティも目的は同じです。Both properties serve the same purpose. その両方が Web アプリの構成に存在する場合、LinuxFxVersion が優先されます。If both are present in the web app's configuration, LinuxFxVersion takes precedence.

  2. az webapp config container set コマンドが完了すると、App Service 上のコンテナーで Web アプリが実行されているはずです。Once the az webapp config container set command completes, the web app should be running in the container on App Service.

    アプリをテストするために、ブラウザーで http://<app-name>.azurewebsites.net にアクセスします。<app-name> は、実際の Web アプリの名前に置き換えてください。To test the app, browse to http://<app-name>.azurewebsites.net, replacing <app-name> with the name of your web app. 初回アクセス時は、App Service がイメージ全体をレジストリからプルする必要があるため、アプリが応答するまでに時間がかかる場合があります。On first access, it may take some time for the app to respond because App Service must pull the entire image from the registry. ブラウザーがタイムアウトした場合は、単にページを更新します。If the browser times out, just refresh the page. 最初のイメージがプルされた後、それ以降のテストははるかに高速に実行されます。Once the initial image is pulled, subsequent tests will run much faster.

    Azure での Web アプリのテストが成功

アプリのコードを変更して再デプロイするModify the app code and redeploy

このセクションでは、Web アプリのコードに変更を加えてコンテナーをリビルドした後、そのコンテナーをレジストリにプッシュします。In this section, you make a change to the web app code, rebuild the container, and then push the container to the registry. すると、更新されたイメージを App Service が自動的にレジストリからプルして、実行中の Web アプリを更新します。App Service then automatically pulls the updated image from the registry to update the running web app.

  1. ローカル docker-django-webapp-linux フォルダーにあるファイル app/templates/app/index.html を開きます。In your local docker-django-webapp-linux folder, open the file app/templates/app/index.html.

  2. 最初の HTML 要素を次のコードに一致するように変更します。Change the first HTML element to match the following code.

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="#">Azure App Service - Updated Here!</a>
        </div>
      </div>
    </nav>
    
  3. 変更を保存します。Save your changes.

  4. docker-django-webapp-linux フォルダーに移動してイメージをリビルドします。Change to the docker-django-webapp-linux folder and rebuild the image:

    docker build --tag appsvc-tutorial-custom-image .
    
  5. イメージのタグにあるバージョン番号を v1.0.1 に更新します。Update the version number in the image's tag to v1.0.1:

    docker tag appsvc-tutorial-custom-image <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    

    <registry-name> をレジストリの名前に置き換えます。Replace <registry-name> with the name of your registry.

  6. イメージをレジストリにプッシュします。Push the image to the registry:

    docker push <registry-name>.azurecr.io/appsvc-tutorial-custom-image:latest
    
  7. Web アプリを再起動します。Restart the web app:

    az webapp restart --name <app_name> --resource-group AppSvc-DockerTutorial-rg
    

    <app_name> は、実際の Web アプリの名前に置き換えてください。Replace <app_name> with the name of your web app. 再起動すると、更新したイメージが App Service によってコンテナー レジストリからプルされます。Upon restart, App Service pulls the updated image from the container registry.

  8. ブラウザーで http://<app-name>.azurewebsites.net にアクセスして、更新がデプロイされていることを確認します。Verify that the update has been deployed by browsing to http://<app-name>.azurewebsites.net.

診断ログにアクセスするAccess diagnostic logs

  1. コンテナーのログをオンにします。Turn on container logging:

    az webapp log config --name <app-name> --resource-group AppSvc-DockerTutorial-rg --docker-container-logging filesystem
    
  2. ログのストリームを有効にします。Enable the log stream:

    az webapp log tail --name <app-name> --resource-group AppSvc-DockerTutorial-rg
    

    コンソール ログがすぐに表示されない場合は、30 秒以内にもう一度確認します。If you don't see console logs immediately, check again in 30 seconds.

    https://<app-name>.scm.azurewebsites.net/api/logs/docker で、ブラウザーからログ ファイルを検査することもできます。You can also inspect the log files from the browser at https://<app-name>.scm.azurewebsites.net/api/logs/docker.

  3. 任意のタイミングでログのストリーミングを停止するには、Ctrl+C キーを押します。To stop log streaming at any time, type Ctrl+C.

SSH を使用してコンテナーに接続するConnect to the container using SSH

SSH では、コンテナーとクライアント間の通信をセキュリティで保護できます。SSH enables secure communication between a container and a client. コンテナーへの SSH 接続を有効にするには、それに合わせてカスタム イメージを構成する必要があります。To enable SSH connection to your container, your custom image must be configured for it. コンテナーが実行状態になったら、SSH 接続を開くことができます。Once the container is running, you can open an SSH connection.

SSH のコンテナーを構成するConfigure the container for SSH

このチュートリアルで使用しているサンプル アプリには、あらかじめ必要な構成が Dockerfile に存在し、その構成によって SSH サーバーがインストールされ、またログイン資格情報も設定されます。The sample app used in this tutorial already has the necessary configuration in the Dockerfile, which installs the SSH server and also sets the login credentials. このセクションは情報提供のみを目的としています。This section is informational only. コンテナーに接続するには、次のセクションに進んでください。To connect to the container, skip to the next section

ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
  && apt-get install -y --no-install-recommends openssh-server \
  && echo "$SSH_PASSWD" | chpasswd 

注意

この構成は、コンテナーへの外部接続を許可しません。This configuration doesn't allow external connections to the container. SSH は Kudu/SCM サイトを通してのみ利用できます。SSH is available only through the Kudu/SCM Site. Kudu/SCM サイトは Azure アカウントにより認証されます。The Kudu/SCM site is authenticated with your Azure account.

また、この Dockerfilesshd_config ファイルを /etc/ssh/ フォルダーにコピーし、コンテナーのポート 2222 を公開します。The Dockerfile also copies the sshd_config file to the /etc/ssh/ folder and exposes port 2222 on the container:

COPY sshd_config /etc/ssh/

# ...

EXPOSE 8000 2222

ポート 2222 はプライベート仮想ネットワークのブリッジ ネットワーク内でコンテナーのみがアクセスできる内部ポートです。Port 2222 is an internal port accessible only by containers within the bridge network of a private virtual network.

最後に、エントリ スクリプト init.sh によって SSH サーバーが起動されます。Finally, the entry script, init.sh, starts the SSH server.

#!/bin/bash
service ssh start

コンテナーへの SSH 接続 を開くOpen SSH connection to container

  1. ブラウザーで https://<app-name>.scm.azurewebsites.net/webssh/host にアクセスし、Azure アカウントでサインインします。Browse to https://<app-name>.scm.azurewebsites.net/webssh/host and sign in with your Azure account. <app-name> は、実際の Web アプリの名前に置き換えてください。Replace <app-name> with the name of your web app.

  2. サインインすると、Web アプリの情報ページにリダイレクトされます。Once signed in, you're redirected to an informational page for the web app. シェルを開いてコマンドを使用するには、ページの上部にある [SSH] を選択します。Select SSH at the top of the page to open the shell and use commands.

    たとえば、そこで実行されているプロセスを観察するには、top コマンドを使用します。For example, you can examine the processes running within it using the top command.

リソースをクリーンアップするClean up resources

この記事で作成したリソースによって、継続してコストが発生する可能性があります。The resources you created in this article may incur ongoing costs. リソース グループを削除すれば、そこに含まれているリソースはクリーンアップされます。to clean up the resources, you need only delete the resource group that contains them:

az group delete --name AppSvc-DockerTutorial-rg

次のステップNext steps

ここで学習した内容は次のとおりです。What you learned:

  • カスタム イメージをプライベート コンテナー レジストリにデプロイするDeploy a custom image to a private container registry
  • App Service にカスタム イメージをデプロイするDeploy and the custom image in App Service
  • イメージを更新して再デプロイするUpdate and redeploy the image
  • 診断ログにアクセスするAccess diagnostic logs
  • SSH を使用してコンテナーに接続するConnect to the container using SSH

次のチュートリアルで、カスタム DNS 名をアプリにマップする方法を確認してください。In the next tutorial, you learn how to map a custom DNS name to your app.

または、他のリソースを参照してください。Or, check out other resources: