Amazon ECS を利用する前にローカルでコンテナを動かす

<img width="800" alt="ecs01.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/84a7fddc-19d7-daf8-d753-f63dcb5bc0b7.png">

# 全体の流れ

1. [ローカルでコンテナを動かす](https://qiita.com/NaokiIshimura/items/8d0698735d506e5790c9)　←今回の投稿
2. [ECSでコンテナを動かす](https://qiita.com/NaokiIshimura/items/45d2288b5a2fc4e4e4e4)
3. [ECSでコンテナをクラスタリングする](https://qiita.com/NaokiIshimura/items/a1a2a6182a1505950789)
4. [ECSのログをCloudWatchで収集する](https://qiita.com/NaokiIshimura/items/d1b8f54d863b8755c3d6)
5. [ドメインを取得する](https://qiita.com/NaokiIshimura/items/89e104dd2d8dd950780e)
6. [ドメインにALBを割り当てる](https://qiita.com/drafts/654f1f82adb039f1ad47/edit)
7. [HTTPS化する](https://qiita.com/NaokiIshimura/items/014a163c60feebec570b)


# もくじ

今回の投稿ではECSで動かすコンテナの動作確認をローカルで実施します。

1. Dockerfileの作成
2. イメージを作成
3. ローカルでコンテナを起動
4. ブラウザからアクセス確認
5. コンテナの起動・停止
6. コンテナ・イメージの削除

<img width="1023" alt="ecs05.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/ae68dab3-da64-8acb-3179-37e242e6dddc.png">

## 1. Dockerfileの作成

nginx公式イメージの解説を参考にしてDockerfileを用意します。

> 参考：
> https://hub.docker.com/_/nginx/

以下のDockerfileを利用するとローカルの`static-html-directory`配下にあるファイルが`/usr/share/nginx/html`に配置されたnginxイメージが作成できます。

```dockerfile:Dockerfile
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```

```html:static-html-directory/index.html
<h1>Test</h1>
```

<img width="828" alt="ecs02.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/53c5590a-9d0c-52af-004a-b1ea9e3e3fb9.png">

## 2. イメージを作成

`docker build`コマンドを実行してイメージをビルドします。

```shell-session
$ docker build -t my-image .

Sending build context to Docker daemon  4.608kB
Step 1/2 : FROM nginx
latest: Pulling from library/nginx
e7bb522d92ff: Pull complete
6edc05228666: Pull complete
cd866a17e81f: Pull complete
Digest: sha256:cf8d5726fc897486a4f628d3b93483e3f391a76ea4897de0500ef1f9abcd69a1
Status: Downloaded newer image for nginx:latest
 ---> 3f8a4339aadd
Step 2/2 : COPY static-html-directory /usr/share/nginx/html
 ---> 7c8dd0511046
Successfully built 7c8dd0511046
Successfully tagged my-image:latest
```
> 補足：-t オプション
> イメージ名に`my-image`を指定してビルドを実行

イメージが作成されてることを確認します。

```shell-session
$ docker images

REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
my-image                                   latest              7c8dd0511046        20 seconds ago      108MB
```

## 3. ローカルでコンテナを起動

`docker run`コマンドでイメージからコンテナを起動します。

```shell-session
$ docker run -p 8080:80 my-image
```

> 補足：-p オプション
> 下記の指定方法(`8080:80`)の場合、ローカルの8080ポートへのリクエストがコンテナの80ポートへ転送される

別のコンソールで`docker ps`コマンドを実行すると、`docker run`コマンドで起動したコンテナのスタータスが確認出来ます。

```shell-session
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
c001be823e70        my-image            "nginx -g 'daemon ..."   8 seconds ago       Up 7 seconds        0.0.0.0:8080->80/tcp   relaxed_jennings
```

## 4. ブラウザからアクセス確認

ブラウザで`http://localhost:8080`にアクセスして、`index.html`の内容が表示されることを確認します。

![ecs03.png](https://qiita-image-store.s3.amazonaws.com/0/141934/7b4217de-2b23-ff00-1954-20e90ae8a5ba.png)


`docker run`コマンドを実行したコンソールにはNginxのアクセスログが出力されます。

<img width="613" alt="ecs04.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/8374b340-4857-1767-5dc5-d2ca1ac620c6.png">

アクセス確認が完了したら`ctrl + c`コマンドで`docker run`コマンドを停止させます。

`docker ps`コマンドを実行すると、ステータスに表示されなくなったことがわかります。
停止されているコンテナのステータスは`docker ps -a`コマンドで確認することが出来ます。

```shell-session
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES


$ docker ps -a

CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS                      PORTS                  NAMES
c001be823e70        my-image                                   "nginx -g 'daemon ..."   5 seconds ago       Up 4 seconds                0.0.0.0:8080->80/tcp   relaxed_jennings
```

## 5. コンテナの起動・停止

イメージから作成したコンテナを再度起動する場合は、`docker start`コマンドを実行します。
`docker start`コマンドで起動されたコンテナはバックグラウンドで実行されるため、標準出力をコンソールに出力させた状態で起動させたい場合は`-a`オプションを付与して実行します。

```shell-session
# 作成済みのコンテナを確認
$ docker ps -a

# コンテナを起動
$ docker start -a <コンテナID or コンテナ名>
```

> 補足：コンテナID
> `docker ps -a`コマンドで**CONTAINER ID**列に表示される値
> 補足：コンテナ名
> `docker ps -a`コマンドで**NAMES**列に表示される値

`-a`オプションを付与しないで`docker start`コマンドを実行すると、コンテナがバックグラウンドで実行されるため、停止させるためには`docker stop`コマンドを実行します。

```shell-session
# 作成済みのコンテナを確認
$ docker ps -a

# コンテナを起動
$ docker start <コンテナID or コンテナ名>

# 実行中のコンテナを確認
$ docker ps

# コンテナを停止
$ docker stop <コンテナID or コンテナ名>
```

## 6. コンテナ・イメージの削除

コンテナを削除する場合は`docker rm`コマンドを実行します。

```shell-session
# 作成済みのコンテナを確認
$ docker ps -a

# コンテナを削除
$ docker rm <コンテナID or コンテナ名>
```

イメージを削除する場合は`docker rmi`コマンドを実行します。

```shell-session
# イメージ一覧を表示
$ docker images

# イメージを削除
$ docker rmi <レジストリ名 or イメージID>
```

> 補足：レジストリ名 
> `docker images`コマンドで**REPOSITORY**列に表示される値
> 補足：イメージID
> `docker images`コマンドで**IMAGE ID**列に表示される値