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

App Service は、PHP 7.0 や Node.js 4.5 などの特定のバージョンをサポートする組み込みの Docker イメージを Linux 上で提供します。App Service provides built-in Docker images on Linux with support for specific versions, such as PHP 7.0 and Node.js 4.5. 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.


このチュートリアルを完了するには、次のものが必要です。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
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", ""]
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 を開くOpen Azure Cloud Shell

Azure Cloud Shell は、Azure でホストされる対話型のシェル環境で、ブラウザーを介して使用されます。Azure Cloud Shell is an interactive shell environment hosted in Azure and used through your browse. Azure Cloud Shell では、bash または PowerShell のいずれかのシェルを使用して、Azure サービスで動作するさまざまなツールを実行できます。Azure Cloud Shell allows you to use either bash or PowerShell shells to run a variety of tools to work with Azure services. Azure Cloud Shell にはコマンドがプレインストールされており、ローカル環境に何もインストールしなくても、この記事の内容を実行できるようになっています。Azure Cloud Shell comes pre-installed with the commands to allow you to run the content of this article without having to install anything on your local environment.

この記事に含まれるコードを Azure Cloud Shell で実行するには、Cloud Shell セッションを開き、コード ブロック上の [コピー] ボタンを使ってコードをコピーし、Ctrl + Shift + V キー (Windows と Linux) または command + Shift + V キー (macOS) を押して Cloud Shell セッションに貼り付けます。To run any code contained in this article on Azure Cloud Shell, open a Cloud Shell session, use the Copy button on a code block to copy the code, and paste it into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS. テキストを貼り付けても自動的には実行されません。コードを実行するには、Enter キーを押します。Pasted text is not automatically executed, so press Enter to run code.

Azure Cloud Shell は次の方法で起動できます。You can launch Azure Cloud Shell with:

コード ブロックの右上隅にある [使ってみる] を選択します。Select Try It in the upper-right corner of a code block. テキストが自動的に Cloud Shell にコピーされるわけでは__ありません__。This doesn't automatically copy text to Cloud Shell. Azure Cloud Shell の [使ってみる] の例
ブラウザーで shell.azure.com を開きます。Open shell.azure.com in your browser. Azure Cloud Shell の起動ボタンLaunch Azure Cloud Shell button
Azure Portal の右上隅にあるメニューの [Cloud Shell] ボタンを選択します。Select the Cloud Shell button on the menu in the upper-right corner of the Azure portal. Azure Portal の [Cloud Shell] ボタン

アプリを 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.


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>

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](https://github.com/Azure-Samples/docker-django-webapp-linux/blob/master/sshd_config file in the repository) を /etc/ssh/ ディレクトリにコピーしています。The Dockerfile copies the [sshd_config](https://github.com/Azure-Samples/docker-django-webapp-linux/blob/master/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.

    service ssh start

Open SSH connection to container

SSH connection is available only through the Kudu site, which is accessible at https://<app-name>.scm.azurewebsites.net.

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. To inspect the container and verify running processes, issue the top command at the prompt.


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

 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: