AKS を使いこなす : チュートリアルの深堀り - アプリケーションの準備

今回は [チュートリアル:Azure Kubernetes Service (AKS) 用のアプリケーションの準備](https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-prepare-app) の深堀をしていきます。

# 手順通りアプリの取得と実行

まずはドキュメント通りにアプリを取得して実行してみます。

1\. git clone でソースコードを取得。

```shell
git clone https://github.com/Azure-Samples/azure-voting-app-redis.git
cd azure-voting-app-redis
```

2\. docker-compose でイメージの実行。

```shell
docker-compose up -d
```

3\. ブラウザで http://localhost:8080 にアクセス。投票アプリが起動することを確認。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/38e15985-7dab-e3c0-541f-788fbd27b1a9.png"/>

4\. 確認が完了したらコンテナを終了。

```shell
docker-compose down
```

# 詳細の確認

今回は、今後作成する AKS に展開するためのアプリケーションをまずローカルにダウンロードして動かしてみるところまでの手順となっています。早速詳細を見ていきましょう。

## アプリケーションの中身

ダウンロードした投票アプリは、Web フロントエンドとなる Python アプリとバックエンドとなる Redis で構成されています。

### docker-compose

複数のコンテナからなるアプリケーションのビルドや実行に docker-compose が使えます。手順 2 で指定している[ファイルの中身](https://raw.githubusercontent.com/Azure-Samples/azure-voting-app-redis/master/docker-compose.yaml)を見てみましょう。

- services: 起動するコンテナ。ここでは 2 つのイメージを指定。
- azure-vote-back: image として redis を指定しポート 6379 (Redis の既定) を開放。
- azure-vote-front: build で azure-vote フォルダを指定しているため、azure-vote をビルドした結果をイメージとして利用。ポートはローカルの 8080 をコンテナの 80 にマップして開放し、REDIS 環境変数として azure-vote-back を指定

```yaml
version: '3'
services:
  azure-vote-back:
    image: redis
    container_name: azure-vote-back
    ports:
        - "6379:6379"

  azure-vote-front:
    build: ./azure-vote
    image: azure-vote-front
    container_name: azure-vote-front
    environment:
      REDIS: azure-vote-back
    ports:
        - "8080:80"
```

また ```docker-compose up``` の引数である ```-d``` はコンテナをバックグラウンド実行するパラメーターです。

### azure-vote

azure-vote フォルダの [Dockerfile](https://raw.githubusercontent.com/Azure-Samples/azure-voting-app-redis/master/azure-vote/Dockerfile
) は以下の通り。

- ベースイメージとして python 3.6 の uwsgi-nginx-flast を指定
- pip install でイメージに redis をインストール
- azure-vote フォルダをイメージの app フォルダに追加

```dockerfile
FROM tiangolo/uwsgi-nginx-flask:python3.6
RUN pip install redis
ADD /azure-vote /app
```

azure-vote フォルダ内は、以下の構成。

- static フォルダ: CSS ファイルを保持
- templates フォルダ: 画面となる index.html を保持
- config_file.cfg: ボタンの名前やタイトルなど変数を保持
- main.py: メインの python ファイル

アプリの動作については main.py を参照。基本的にはクリックしたボタンに応じて Redis の値を増加させているだけです。

## 実行状態の確認

docker の各種コマンドを使って、現在の状況が確認可能です。docker においてイメージはダウンロードしたファイルであり、コンテナはイメージをインスタンス化したものであり、実行中のアプリケーションとなります。

1\. 現在ローカルにあるイメージの確認。

- docker images は docker image list のショートカットでイメージの一覧を表示
- 結果から redis と、azure-vote-front、および azure-vote-front のベースとなっている tiangolo/uwsgi-nginx-flask を確認。

```shell
docker images
```
```shell
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
azure-vote-front             latest              f1056b864e11        2 hours ago         965MB
redis                        latest              63130206b0fa        10 days ago         98.2MB
tiangolo/uwsgi-nginx-flask   python3.6           b3b62e990e26        6 weeks ago         964MB
```

2\. 現在実行中のコンテナの確認。

- docker ps は docker container list のショートカットでコンテナの一覧を表示
- 結果より azure-vote-front と redis が起動しているこを確認。

```shell
docker ps
```
```shell
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
e1db9be575b9        redis               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:6379->6379/tcp          azure-vote-back
5eb8632668ae        azure-vote-front    "/entrypoint.sh /sta…"   2 hours ago         Up 2 hours          443/tcp, 0.0.0.0:8080->80/tcp   azure-vote-front
```

3\. azure-vote-front の起動のコマンドを "Entrypoint" より確認。azure-vote の Dockerfile では Entrypoint は指定していないので、実際はベースイメージのものと同様。

- docker inspect: イメージの詳細を確認可能 

```shell
docker inspect azure-vote-front
```
```shell
"Entrypoint": [
    "/entrypoint.sh"
],
```

4\. entrypoint.sh の中身を確認。

- docker exec でコンテナにアタッチして bash を実行
- cat でファイルの中身を表示
- nginx が起動されるスクリプトであることを確認

```shell
docker exec -it 5eb8632668ae "/bin/bash"
root@5eb8632668ae:/app# cat /entrypoint.sh
```

# まとめ

今回はチュートリアルで使うダウンロードしたアプリの中身を見ていきました。次回はコンテナレジストリについてみていきます。

[次の記事へ](https://qiita.com/kenakamu/items/bb876f17e4f6ecaf370b)
[目次に戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)

# 参照

[Docker](https://www.docker.com/)
[Getting Started with Docker Desktop for Windows](https://www.docker.com/docker-desktop/getting-started-for-windows)