【Docker】コンテナ状態と関連コマンド

# はじめに
Dockerコンテナの状態についてまとめてみました。
間違いなどがあればコメントいただけますと幸いです。

# コンテナの状態
`docker container ls (docker ps)`の`--filter`オプションでフィルタリングできるコンテナ状態としてドキュメントに明記されています。
https://docs.docker.com/reference/cli/docker/container/ls/

| 状態        | 説明                                                                 |
|-------------|----------------------------------------------------------------------|
| created     | 一度も起動されていないが作成された状態                                   |
| running     | `docker start`や`docker run`などで開始された状態                         |
| paused      | プロセスが一時停止された状態、再開することができる                  |
| exited      | コンテナ内部のプロセスが完了した、または`docker stop`によって停止された状態 |
| restarting  | 停止状態から再起動している状態                                       |
| removing    | `docker rm`によって削除されている状態                                 |
| dead        | 何かしらの原因で機能しなくなった状態<br>再起動はできず、削除するしかない                                   |

# コマンドと状態遷移
コンテナの状態を操作するコマンドの紹介です。
以下の図中のコマンドはすべてエイリアスとなっています。
例えば、`docker create`は`docker container create`の別表記です。
他のコマンドについても`container`を省略した書き方ですが、どちらでも正常に動作します。

```mermaid
sequenceDiagram
    未作成->>+created: docker create
    created->>+running: docker start
    未作成->>+running: docker run
    running->>+paused: docker pause
    paused->>+running: docker unpause
    paused->>+exited: docker stop
    running->>+exited: docker stop
    exited->>+running: docker restart
    exited->>+削除済: docker rm
```

# 実践
### create
`STATUS`が`Created`となっています。
作成されて、起動は一度もされていない状態です。
```
$ docker create nginx

$ docker ps -f status=created
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS    PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   About a minute ago   Created             loving_bassi
```
### start
コンテナを起動します。
`STATUS`は`Up`となっています。
```
$ docker start 44306d5a9d2f

$ docker ps -f status=running
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 37 seconds   80/tcp    loving_bassi
```
### pause / unpause
コンテナを一時停止します。
`STATUS`は`Up`の後に`(Paused)`と表示されています。
```
$ docker pause 44306d5a9d2f

$ docker ps -f status=paused
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                       PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   3 minutes ago   Up About a minute (Paused)   80/tcp    loving_bassi
```
一時停止を終了します。
`running`状態に戻りました。
```
$ docker unpause 44306d5a9d2f

$ docker ps -f status=running
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS              PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   3 minutes ago   Up About a minute   80/tcp    loving_bassi
```
### stop / restart
停止された時の`STATUS`は`Exited`です。
```
$ docker stop 44306d5a9d2f

$ docker ps -f status=exited
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                       PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   3 minutes ago   Exited (0) 6 seconds ago               loving_bassi
```
```
$ docker restart 44306d5a9d2f

$ docker ps -f status=running
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   4 minutes ago   Up 2 seconds   80/tcp    loving_bassi

```
### rm
```
$ docker stop 44306d5a9d2f
$ docker rm 44306d5a9d2f
```
### エラーになるパターン
#### 停止中コンテナの一時停止を試みる
`pause`は`running`状態以外のコンテナに対しては使用できません。
```
$ docker ps -f status=exited
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                       PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   5 minutes ago   Exited (0) 6 seconds ago               loving_bassi

$ docker pause 44306d5a9d2f
Error response from daemon: container 44306d5a9d2fb50cc6d767661761134f3ed6c8ea790aa4c69ef2923c0647ad0f is not running
```
#### 起動中コンテナの削除を試みる
基本的にはコンテナを停止してから削除します。
起動中や一時停止中のコンテナを削除しようとするとエラーが発生します。
`-f`オプションをつけて強制的に削除する方法もありますが、誤操作防止のためにおすすめはしません。
```
$ docker ps -f status=running
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS     NAMES
44306d5a9d2f   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 40 seconds   80/tcp    loving_bassi

$ docker rm 44306d5a9d2f
Error response from daemon: cannot remove container "/loving_bassi": container is running: stop the container before removing or force remove
```

# おわりに
最後までご覧いただきありがとうございました。
参考になったという方はアクションをいただけますと励みになります！