Azure Web Apps on Linux から for Container に変換する step-by-step

#はじめに：
Azure Web Apps on Linux は、"Blessed Image" と呼ばれる、アプリケーションスタックによって何種類かある作成済みのコンテナを使用しています。このコンテナはアプリケーションレベルでのカスタマイズは可能ですが、それ以上のカスタマイズとなるとカスタムコンテナを作成して、Web Apps for Container でホストすることになります。

「でもいきなりカスタムコンテナなんて怖い！」という方のために、まずは出来合いの Web Apps for Linux のコンテナをパクって Web Apps for Container でホストする手順を書いてみました。

#前提事項：
以下 Windows 環境で実施する場合です。必要なものは以下の通り。

- Azure の Subscription
- Azure CLI のインストール（または Cloud Shell の使用）
- Docker for Windows のインストール
- Git for Windows のインストール
- オプション：Kitematic をダウンロードして適切なフォルダに解凍

#手順：
- 適当なフォルダを作ってコマンドプロンプトで開きます

- Github から Web Apps on Linux の blessed イメージのソースを clone します。以下は node.js のコンテナです。

```CMD
git clone https://github.com/Azure-App-Service/node.git --config core.autocrlf.false
```

- 適当な docker イメージのフォルダへ移動します

```CMD
cd node/10.10.0
```

- docker イメージをビルドします。なお、DOCKER ファイル等をいじる場合はこの前に行います

```CMD
docker build -t mynode:latest .
...
Successfully built ef9dda6f3a07
Successfully tagged mynode:latest
```

- ビルドした docker イメージを実行してみます（以下必要最低限の docker run のため、適宜調整してください）

```CMD
docker run --rm mynode:latest
```

- localhost:2222 にブラウザでアクセスして hostingstart.html が表示される事を確認します。Ctrl+C でコンソールを抜けるとイメージが動き続けるので、Kitematic で止めてください。中身書き換えて永続化したければ docker commit してください

- Azure Container Registry（ACR）を作っておきます。ポータルでも CLI でもお好きに

- ACR に push するために、まずパスワードを取得します。以下 Azure CLI ですが、Cloud Shell で実行しても構いません

```CLI
az login
az acr credential show --name <ACR名>
...
{
    "passwords": [
        {
            "name": "password",
            "value": "xxxx"
        },
        {
            "name": "password2",
            "value": "xxxx"
        }
    ],
    "username": "nnnn"
}
```

- docker から ACR にログインします

```CMD
docker login <ACR名>.azurecr.io -u <上記 username> -p <上記 password>
```

- push する前に docker イメージの ID を確認しておきます

```CMD
docker images
...
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mynode                  latest              ef9dda6f3a07        15 minutes ago      145MB
```

- ローカルイメージにタグ付けします

```CMD
docker tag <IMAGE ID> <ACR名>.azurecr.io/mynode:latest
```

- タグ付けできたことを確認しておきます

```CMD
docker images
...
REPOSITORY                  TAG             IMAGE ID            CREATED             SIZE
<ACR名>.azurecr.io/mynode   latest          ef9dda6f3a07        21 minutes ago      145MB
```

- ACR に push します

```CMD
docker push <ACR名>.azurecr.io/mynode:latest
```

- あとは Web Apps for Containers を ACR を参照するように作成します。コンテナログは [コンテナーの設定] ブレードから見ることが出来ます。以下、例。

```CMD
2018_11_28_..._docker.log:
2018-11-28 08:14:22.127 INFO  - Starting container for site
2018-11-28 08:14:22.127 INFO  - docker run -d -p 48559:8080 --name <Web Apps 名>_0 -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=<Web Apps 名> -e WEBSITE_AUTH_ENABLED=False -e PORT=8080 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=... <ACR 名>.azurecr.io/mynode:latest
2018-11-28 08:14:22.127 INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.`
```

# もろもろ
※ ローカルでコンテナ上がらないとかはだいたい CRLF のせい。clone したファイルが LF になってるか確認し、もしなってなかったら VSCode とかで変換します

※ コンテナのビルドや起動の時間はコンテナサイズに依存します。今のところ node の blessed イメージが一番軽いです。php は node の6倍近くあります。node < ruby < php

また見直して更新します。