Docker--Nginxコンテナで見るコンテナのライフサイクル

## はじめに
東京理科大学2年のyosukeです。
この記事は[東京理科大学AdventCalendar17日目の記事] (https://qiita.com/advent-calendar/2018/tokyo_university_of_science)です。
大変遅れてしまって申し訳ありません！！！！！！！！
学期末ということもあってレポートが大量に出ていたという理由で許してください。。。

普段は機械学習などをメインで勉強していますが、流行りものなので他にも書かれる方がたくさんいらっしゃるだろうと思ったので、今回は自分が最近(本当に最近)勉強しはじめたdockerについて書いていきたいと思います。特に、最初にイメージしづらかったコンテナのライフサイクルについて書いてきたいと思います。せっかくnginxコンテナを使っているので最後にちょろっとおまけをつけています。
めっちゃ初心者向けの記事になると思いますのでどうか温かい目で見守ってください。
## 環境
macOS Mojave version 10.14
Docker version 18.06.0-ce

## Dockerとは
割愛
## nginxコンテナの実行
[nginx](https://hub.docker.com/_/nginx/)の実行についてはExposing external portを参照してください。(今回はrunコマンドは使いませんが例として一応載せておきます)

```
$docker run --name <コンテナ名> -d -p <ホスト側のポート番号>:<コンテナ側のポート番号> <イメージ名>
```
## コンテナのライフサイクル

### 概略
![docker_life-cycle.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/189118/5088ca04-bd1f-5384-0f81-939a8a89f8b6.jpeg)　　　　
ライフサイクルのイメージを図にしてみました。便宜上、imageとdeletedという状態を置いています。
ここで紹介するライフサイクルに関するコマンドのオプションなどについては[Dockerドキュメントのコマンドラインリファレンス](http://docs.docker.jp/engine/reference/commandline/toc.html)を参考にしてください。


コンテナのstatusを見たいので今回はrunコマンドは使わずにはじめます。あとで起動したnginxコンテナを使ってhtmlファイルを公開してみたいので`$-v /some/content:/usr/share/nginx/html:ro`のオプションコマンドをつけておきます。

`
/some/content　コンテナにマウントするホスト側のディレクトリ
/usr/share/nginx/html　マウント先のコンテナのディレクトリnginxコンテナじょうでこのディレクトリが公開対象のドキュメントルート
ro　リードオンリー　読み取り専用
`

### Createdステータス
```
$docker create --name status-nginx  -v /Users/yosuke/git/imagebuild/html:/usr/share/nginx/html:ro -p 8080:80 nginx
```


現在実行中のコマンドは`$docker ps`で表示可能だけど、今はcreateしただけで動いていないので用事されない。動いてないものも全て表示するには以下の通り。

```
$docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                     PORTS                          NAMES
e07fb245e575        nginx                "nginx -g 'daemon of…"   13 seconds ago      Created                                                   status-nginx                                    
```
ここで`STATUS:Created`となっています。
Createdステータスはコンテナが作成されてスタートされるまでのもので`create`コマンドで作成されます。

### runningステータス
created状態のものをスタートするとrunnigになります。runコマンドはcreateとstartが同時に実行されていました。

```
$docker start status-nginx
status-nginx
$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e07fb245e575        nginx               "nginx -g 'daemon of…"   6 minutes ago       Up 6 seconds        0.0.0.0:8080->80/tcp     status-nginx
```
ここでは`STATUS:Up 6 seconds`と表示されコンテナスタート後の経過時間が表示されています。
inspectコマンドで確認すればしっかりSTATUSが"running"となっています。

```
$docker inspect status-nginx
[
    {
        "Id": "e07fb245e57530b5ee0f1b065ccda51787af0c0f2ba3acb365c257df167041fe",
        "Created": "2018-12-21T07:27:34.7446116Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
```

### pausedステータス
コンテナが一時停止している状態を表します。この状態ではコンテナにリクエストを投げても応答しません。`unpause`コマンドでpauseの状態を解除することができます。

```
$docker pause status-nginx
status-nginx
$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                    NAMES
e07fb245e575        nginx               "nginx -g 'daemon of…"   About an hour ago   Up 42 minutes (Paused)   0.0.0.0:8080->80/tcp     status-nginx
```
STATUSの部分がカッコ書きで(paused)となっています。inspectでみてみると"Status": "paused"となっています。

```
docker inspect status-nginx
[
    {
        "Id": "e07fb245e57530b5ee0f1b065ccda51787af0c0f2ba3acb365c257df167041fe",
        "Created": "2018-12-21T07:27:34.7446116Z",
        "Path": "nginx",
        "Args": [
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "paused",
            "Running": true,
            "Paused": true,
            "Restarting": false,
            "OOMKilled": false,
```

`unpause`コマンドでpaused状態の解除

```
$docker unpause status-nginx
status-nginx
$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e07fb245e575        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     status-nginx
```

### restartingステータス
`docker restart`コマンドで再起動した時などにこのステータスになります。再起動はすぐに終了することが多いのでこのステータスをみることはあまりないと思います。

### exsitedステータス
終了したコンテナが残り続けている状態。`docker stop`コマンドで停止したコンテナもこのステータスになる。

```
$docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                      PORTS                          NAMES
e07fb245e575        nginx                "nginx -g 'daemon of…"   About an hour ago   Exited (0) 18 seconds ago                                  status-nginx
```

`docker start`で再びrunning状態にできます。

```
$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e07fb245e575        nginx               "nginx -g 'daemon of…"   About an hour ago   Up 7 seconds        0.0.0.0:8080->80/tcp     status-nginx
```

### removingステータス
削除中のコンテナのステータスを表します。これも先ほどのrestartingと同じように削除もさほど時間がかからないことが多いのでこのステータスをみることもあまりないかもしれません。ちなみに停止中のコンテナは`docker rm`コマンドで削除できますが起動中のコンテナは削除する前に停止させるか`-f`オプションをつける必要があります。

### deadステータス
正常に終了できずに残ってしまっているコンテナ状態を表します。どうやら消すしかないようです。

## おまけ
さてここまでで、コンテナのライフサイクルを見てきましたが、せっかくなのでここで起動させていたコンテナを使ってみましょう。上にも書きましたが、実はcreateを実行する際にオプションでバインドマウントとポートマッピングの設定を行っていたのでバウンドするディレクトリ内にindex.htmlが作成してあればlocalhost:8080で確認することができます。