チュートリアル:カスタム イメージを作成し、プライベート レジストリから App Service 内で実行するTutorial: Build a custom image and run in App Service from a private registry

App Service は、PHP 7.3 や Node.js 10.14 などの特定のバージョンをサポートする組み込みの Docker イメージを Linux 上で提供します。App Service provides built-in Docker images on Linux with support for specific versions, such as PHP 7.3 and Node.js 10.14. App Service では、Docker コンテナー テクノロジを使用して、組み込みイメージとカスタム イメージの両方をサービスとしてのプラットフォームとしてホストします。App Service uses the Docker container technology to host both built-in images and custom images as a platform as a service. このチュートリアルでは、カスタム イメージを作成し、App Service 内で実行する方法について学習します。In this tutorial, you learn how to build a custom image and run it in App Service. このパターンは、組み込みイメージに選択した言語が含まれない場合や、アプリケーションで組み込みイメージで提供されない特定の構成が必要となる場合に便利です。This pattern is useful when the built-in images don't include your language of choice, or when your application requires a specific configuration that isn't provided within the built-in images.

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

  • カスタム イメージをプライベート コンテナー レジストリにデプロイするDeploy a custom image to a private container registry
  • 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 サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

このチュートリアルを完了するには、次のものが必要です。To complete this tutorial, you need:

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

ターミナル ウィンドウで、次のコマンドを実行して、サンプル アプリのリポジトリをローカル コンピューターに複製し、サンプル コードを含むディレクトリに移動します。In a terminal window, run the following command to clone the sample app repository to your local machine, then change to the directory that contains the sample code.

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

Docker ファイルからイメージを作成するBuild the image from the Docker file

Git リポジトリで、Dockerfile を確認してください。In the Git repository, take a look at Dockerfile. このファイルには、アプリケーションの実行に必要な Python 環境が記述されています。This file describes the Python environment that is required to run your application. さらに、イメージはコンテナーとホスト間のセキュアな通信用に SSH サーバーを設定します。Additionally, the image sets up an SSH server for secure communication between the container and the host.

FROM python:3.4

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
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"]

docker build コマンドを使用して Docker イメージをビルドします。Build the Docker image with the docker build command.

docker build --tag mydockerimage .

Docker コンテナーを実行して、ビルドの動作をテストします。Test that the build works by running the Docker container. docker run コマンドを発行し、イメージの名前とタグを渡します。Issue the docker run command and pass the name and tag of the image to it. 必ず -p 引数を使用してポートを指定してください。Be sure to specify the port using the -p argument.

docker run -p 8000:8000 mydockerimage

http://localhost:8000 を参照して、Web アプリとコンテナーが正しく機能していることを確認します。Verify the web app and container are functioning correctly by browsing to http://localhost:8000.

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

Azure Cloud Shell を使用するUse Azure Cloud Shell

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell では、bashPowerShell のいずれかを使用して Azure サービスを操作できます。Cloud Shell lets you use either bash or PowerShell to work with Azure services. ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell を起動するには:To launch Azure Cloud Shell:

オプションOption 例とリンクExample/Link
コード ブロックの右上隅にある [使ってみる] を選択します。Select Try It in the upper-right corner of a code block. [試してみる] を選択しても、コードは Cloud Shell に自動的にコピーされません。Selecting Try It doesn't automatically copy the code to Cloud Shell. Azure Cloud Shell の [使ってみる] の例
https://shell.azure.com に移動するか、 [Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. 新しいウィンドウで Cloud Shell を起動するLaunch Cloud Shell in a new window
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。Select the Cloud Shell button on the top-right menu bar in the Azure portal. Azure Portal の [Cloud Shell] ボタン

Azure Cloud Shell でこの記事のコードを実行するには:To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell を開きます。Open Cloud Shell.
  2. [コピー] ボタンを選択して、コード ブロックをコードにコピーします。Select the Copy button on a code block to copy the code.
  3. Windows と Linux では Ctrl + Shift + V キー、macOS では Cmd + Shift + V キーを使用して、コードを Cloud Shell セッションに貼り付けます。Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Enter キーを押して、コードを実行します。Press Enter to run the code.

アプリを Azure にデプロイするDeploy app to Azure

先ほど作成したイメージを使用するアプリを作成するには、Azure CLI コマンドを実行してリソース グループを作成し、そのイメージをプッシュし、それを実行する App Service プラン Web アプリを作成します。To create an app that uses the image you just created, you run Azure CLI commands that create a resource group, pushes the image, and then creates the App Service plan web app to run it.

リソース グループの作成Create a resource group

リソース グループとは、Web アプリ、データベース、ストレージ アカウントなどの Azure リソースのデプロイと管理に使用する論理コンテナーです。A resource group is a logical container into which Azure resources like web apps, databases, and storage accounts are deployed and managed. たとえば、後から簡単な手順で一度にリソース グループ全体を削除することもできます。For example, you can choose to delete the entire resource group in one simple step later.

Cloud Shell で az group create コマンドを使用して、リソース グループを作成します。In the Cloud Shell, create a resource group with the az group create command. 次の例では、myResourceGroup という名前のリソース グループを "西ヨーロッパ" の場所に作成します。The following example creates a resource group named myResourceGroup in the West Europe location. Basic レベルの Linux 上の App Service がサポートされているすべての場所を表示するには、az appservice list-locations --sku B1 --linux-workers-enabled コマンドを実行します。To see all supported locations for App Service on Linux in Basic tier, run the az appservice list-locations --sku B1 --linux-workers-enabled command.

az group create --name myResourceGroup --location "West Europe"

通常は、現在地付近の地域にリソース グループおよびリソースを作成します。You generally create your resource group and the resources in a region near you.

コマンドが完了すると、リソース グループのプロパティが JSON 出力に表示されます。When the command finishes, a JSON output shows you the resource group properties.

Azure Container Registry を作成するCreate an Azure Container Registry

Cloud Shell で、az acr create コマンドを使用して Azure Container Registry を作成します。In the Cloud Shell, use the az acr create command to create an Azure Container Registry.

az acr create --name <azure-container-registry-name> --resource-group myResourceGroup --sku Basic --admin-enabled true

Azure Container Registry にサインインするSign in to Azure Container Registry

イメージをレジストリにプッシュするには、プライベート レジストリで認証する必要があります。To push an image to the registry, you need to authenticate with the private registry. Cloud Shell で、az acr show コマンドを使用して、作成したレジストリから資格情報を取得します。In the Cloud Shell, use the az acr show command to retrieve the credentials from the registry you created.

az acr credential show --name <azure-container-registry-name>

出力には、2 つのパスワードがユーザー名と共に含まれています。The output reveals two passwords along with the user name.

<
  "passwords": [
    {
      "name": "password",
      "value": "{password}"
    },
    {
      "name": "password2",
      "value": "{password}"
    }
  ],
  "username": "<registry-username>"
}

ローカルのターミナル ウィンドウから、次の例に示すように docker login コマンドを使用して Azure Container Registry にサインインします。From your local terminal window, sign in to the Azure Container Registry using the docker login command, as shown in the following example. <azure-container-registry-name><registry-username> を、自分のレジストリの値に置き換えます。Replace <azure-container-registry-name> and <registry-username> with values for your registry. 入力を求められたら、前の手順のいずれかのパスワードを入力します。When prompted, type in one of the passwords from the previous step.

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

ログインが成功したことを確認します。Confirm that the login succeeds.

Azure Container Registry へのイメージのプッシュPush image to Azure Container Registry

Azure Container Registry のコンテナー イメージをタグ付けします。Tag your local image for the Azure Container Registry. 例:For example:

docker tag mydockerimage <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

コマンド docker push を使用してイメージをプッシュします。Push the image by using the docker push command. レジストリの名前、イメージの名前、およびタグでイメージをタグ付けします。Tag the image with the name of the registry, followed by your image name and tag.

docker push <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

Cloud Shell に戻り、プッシュが成功したことを確認します。Back in the Cloud Shell, verify that the push is successful.

az acr repository list -n <azure-container-registry-name>

次の出力が表示されます。You should get the following output.

[
  "mydockerimage"
]

Create App Service planCreate App Service plan

Cloud Shell で az appservice plan create コマンドを使用して、リソース グループに App Service プランを作成します。In the Cloud Shell, create an App Service plan in the resource group with the az appservice plan create command.

次の例では、Basic 価格レベル (--sku B1) の myAppServicePlan という名前の App Service プランを Linux コンテナー (--is-linux) に作成します。The following example creates an App Service plan named myAppServicePlan in the Basic pricing tier (--sku B1) and in a Linux container (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku B1 --is-linux

App Service プランが作成されると、Azure CLI によって、次の例のような情報が表示されます。When the App Service plan has been created, the Azure CLI shows information similar to the following example:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Web アプリの作成Create web app

Cloud Shell で az webapp create コマンドを使用して、myAppServicePlan App Service プランに Web アプリを作成します。In the Cloud Shell, create a web app in the myAppServicePlan App Service plan with the az webapp create command. <app-name> を一意のアプリ名に置き換え、 <azure-container-registry-name> を自分のレジストリ名に置き換えます。Replace <app-name> with a unique app name, and <azure-container-registry-name> with your registry name.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --deployment-container-image-name <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0

Web アプリが作成されると、Azure CLI によって次の例のような出力が表示されます。When the web app has been created, the Azure CLI shows output similar to the following example:

{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Web アプリにレジストリの資格情報を構成するConfigure registry credentials in web app

App Service でプライベート イメージをプルするには、レジストリとイメージに関する情報が必要です。For App Service to pull the private image, it needs information about your registry and image. Cloud Shell で、az webapp config container set コマンドを使用してそれらを提供します。In the Cloud Shell, provide them with the az webapp config container set command. <app-name><azure-container-registry-name><registry-username> 、および <password> を置き換えます。Replace <app-name>, <azure-container-registry-name>, <registry-username>, and <password>.

az webapp config container set --name <app-name> --resource-group myResourceGroup --docker-custom-image-name <azure-container-registry-name>.azurecr.io/mydockerimage:v1.0.0 --docker-registry-server-url https://<azure-container-registry-name>.azurecr.io --docker-registry-server-user <registry-username> --docker-registry-server-password <password>

注意

Docker Hub 以外のレジストリを使用する場合、--docker-registry-server-url は、https:// の後にレジストリの完全修飾ドメイン名が続く形式にする必要があります。When using a registry other than Docker Hub, --docker-registry-server-url must be formatted as https:// followed by the fully qualified domain name of the registry.

環境変数を構成するConfigure environment variables

ほとんどの Docker イメージは、80 以外のポートなどのカスタム環境変数を使用します。Most Docker images use custom environment variables, such as a port other than 80. イメージが使用するポートを App Service に指示するには、WEBSITES_PORT アプリケーション設定を使用します。You tell App Service about the port that your image uses by using the WEBSITES_PORT app setting. このチュートリアルに含まれる Python サンプルの GitHub ページは、WEBSITES_PORT8000 に設定する必要があることを示しています。The GitHub page for the Python sample in this tutorial shows that you need to set WEBSITES_PORT to 8000.

アプリ設定を設定するには、Cloud Shell で az webapp config appsettings set コマンドを使用します。To set app settings, use the az webapp config appsettings set command in the Cloud Shell. アプリケーション設定は、大文字と小文字を区別し、スペースで区切られます。App settings are case-sensitive and space-separated.

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

Web アプリをテストするTest the web app

Web アプリの動作を確認するには、これを参照します (http://<app-name>.azurewebsites.net)。Verify that the web app works by browsing to it (http://<app-name>.azurewebsites.net).

注意

初めてアプリにアクセスしたときは、App Service がイメージ全体をプルする必要があるため、時間がかかる場合があります。The first time you access the app, it may take some time because App Service needs to pull the entire image. ブラウザーがタイムアウトした場合は、単にページを更新します。If the browser times out, just refresh the page.

Web アプリ ポート構成をテストする

Web アプリを変更して再デプロイするChange web app and redeploy

ローカルの Git リポジトリで、app/templates/app/index.html を開きます。In your local Git repository, open app/templates/app/index.html. 最初の HTML 要素を見つけて、それを次のように変更します。Locate the first HTML element and change it to.

<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>

Python ファイルを変更し、保存した後で、新しい Docker イメージをリビルドし、プッシュする必要があります。Once you've modified the Python file and saved it, you must rebuild and push the new Docker image. 次に、変更を反映するために Web アプリを再起動します。Then restart the web app for the changes to take effect. このチュートリアルで前に使用したのと同じコマンドを使用します。Use the same commands that you have previously used in this tutorial. Docker ファイルからイメージを作成する」と「Azure Container Registry へのイメージのプッシュ」を参照してください。You can refer to Build the image from the Docker file and Push image to Azure Container Registry. Web アプリをテストする」の手順に従って、Web アプリをテストします。Test the web app by following the instructions in Test the web app.

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

コンテナー内から生成されたコンソール ログにアクセスできます。You can access the console logs generated from inside the container. まず、Cloud Shell で次のコマンドを実行して、コンテナーのログ記録をオンにします。First, turn on container logging by running the following command in the Cloud Shell:

az webapp log config --name <app-name> --resource-group myResourceGroup --docker-container-logging filesystem

コンテナーのログ記録がオンになったら、次のコマンドを実行して、ログのストリームを確認します。Once container logging is turned on, run the following command to see the log stream:

az webapp log tail --name <app-name> --resource-group myResourceGroup

コンソール ログがすぐに表示されない場合は、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.

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

SSH 接続を有効にするEnable SSH connections

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. 必要な構成が既にあるサンプル リポジトリを見てみましょう。Let's take a look at the sample repository that already has the necessary configuration.

  • この Dockerfile の次のコードでは、SSH サーバーをインストールし、さらにサインイン資格情報を設定しています。In the Dockerfile, the following code installs the SSH server and also sets the sign-in credentials.

    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 does not 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.

  • この Dockerfile では、リポジトリ内の sshd_config ファイルを /etc/ssh/ ディレクトリにコピーします。The Dockerfile copies the sshd_config file in the repository to the /etc/ssh/ directory.

    COPY sshd_config /etc/ssh/
    
  • この Dockerfile では、コンテナーでポート 2222 を公開しています。The Dockerfile exposes port 2222 in the container. それはプライベート仮想ネットワークのブリッジ ネットワーク内でコンテナーのみがアクセスできる内部ポートです。It is an internal port accessible only by containers within the bridge network of a private virtual network.

    EXPOSE 8000 2222
    
  • このエントリ スクリプトでは、SSH サーバーを起動しています。The entry script starts the SSH server.

    #!/bin/bash
    service ssh start
    

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

SSH 接続は Kudu サイトを通してのみ利用できます。Kudo サイトには https://<app-name>.scm.azurewebsites.net からアクセスできます。SSH connection is available only through the Kudu site, which is accessible at https://<app-name>.scm.azurewebsites.net.

接続するには、https://<app-name>.scm.azurewebsites.net/webssh/host に移動し、Azure アカウントでサインインします。To connect, browse to https://<app-name>.scm.azurewebsites.net/webssh/host and sign in with your Azure account.

その後、対話型コンソールを表示するページにリダイレクトされます。You are then redirected to a page displaying an interactive console.

特定のアプリケーションがコンテナーで実行されていることを確認できます。You may wish to verify that certain applications are running in the container. コンテナーを検査し、実行中のプロセスを確認するには、プロンプトで top コマンドを発行します。To inspect the container and verify running processes, issue the top command at the prompt.

top

top コマンドは、コンテナー内のすべての実行中のプロセスを公開します。The top command exposes all running processes in a container.

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1 root      20   0  945616  35372  15348 S  0.0  2.1   0:04.63 node
20 root      20   0   55180   2776   2516 S  0.0  0.2   0:00.00 sshd
42 root      20   0  944596  33340  15352 S  0.0  1.9   0:05.80 node /opt/s+
56 root      20   0   59812   5244   4512 S  0.0  0.3   0:00.93 sshd
58 root      20   0   20228   3128   2664 S  0.0  0.2   0:00.00 bash
62 root      20   0   21916   2272   1944 S  0.0  0.1   0:03.15 top
63 root      20   0   59812   5344   4612 S  0.0  0.3   0:00.03 sshd
65 root      20   0   20228   3140   2672 S  0.0  0.2   0:00.00 bash
71 root      20   0   59812   5380   4648 S  0.0  0.3   0:00.02 sshd
73 root      20   0   20228   3160   2696 S  0.0  0.2   0:00.00 bash
77 root      20   0   21920   2304   1972 R  0.0  0.1   0:00.00 top

お疲れさまでした。Congratulations! App Service でカスタムの Linux コンテナーを構成できました。You've configured a custom Linux container in App Service.

デプロイのクリーンアップClean up deployment

サンプル スクリプトの実行後は、次のコマンドを使用してリソース グループとすべての関連リソースを削除することができます。After the sample script has been run, the following command can be used to remove the resource group and all resources associated with it.

az group delete --name myResourceGroup

次の手順Next steps

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

  • カスタム イメージをプライベート コンテナー レジストリにデプロイするDeploy a custom image to a private container registry
  • 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

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

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