Dockerの基礎をまとめてみた ~ 第四章：Dockerコマンド - container編

# 第四章 : Dockerコマンド - container編
本章では、Dockerコマンドの `container` について記載します。

## コンテナ操作
コンテナの操作は、 `docker container` コマンドを使います。 `docker container` で利用できるコマンドは以下の通りです。

**おすすめ** の ★️ の数は、数が多いほどよく使うコマンドです(筆者の独断と偏見)。なので、ざっくりと読みたい方は ★️ が多いコマンドを見てもらうといいと思います。

|おすすめ|コマンド|概要|
|:--:|:--:|:--|
|★️★️★️|attach |実行中のコンテナの標準入出力に接続する|
|★️★️★️|commit |コンテナーでの変更を含めたイメージを作成する|
|★️★️★️|cp     |ホストとコンテナ間でファイル/ディレクトリのコピーをする|
|★️★️★️|create |新しいコンテナを作成する|
|★️★️★️|exec   |実行中のコンテナでコマンドを実行する|
|★️★️★️|logs   |コンテナのログを取得する|
|★️★️★️|ls     |コンテナの一覧を表示する|
|★️★️★️|rm     |コンテナを削除する|
|★️★️★️|run    |Run a command in a new container|
|★️★️★️|start  |停止中のコンテナを開始する|
|★️★️★️|stats  |コンテナのリソースをリアルタイムで表示する|
|★️★️★️|stop   |実行中のコンテナを停止する|
|★️★️|diff   |コンテナ内のファイル・ディレクトリの変更を検査する|
|★️★️|kill   |実行中のコンテナを停止する|
|★️★️|pause  |コンテナの全てのプロセスを中断する|
|★️★️️|restart|コンテナを再起動する|
|★️★️️|top    |実行中のコンテナのプロセスIDを表示する|
|★️★️️|unpause|コンテナの一時停止を解除する|
|★️★️️|update |コンテナの設定を更新する|
|★️|export |コンテナのファイルシステムをtarアーカイブとして出力する|
|★️|inspect|コンテナの詳細情報を表示する|
|★️|port   |コンテナに割り当てられているポートを出力する|
|★️|prune  |停止中のコンテナを全て削除する|
|★️|rename |コンテナの名前をリネームする|
|★️️|wait   |コンテナの停止を阻止し、コンテナが終了するときに終了コードを表示する|

### [おすすめ度:★️★️★️] attach コマンド
コマンド例は、 `docker container attach [OPTIONS] CONTAINER` です。OPTIONSは、 `docker container attach --help` で見ることができます。

`attach` コマンドは、実行中のコンテナの **PID=1(プロセス)** の標準入出力(stdin/stdout)に接続します。

`docker container attach` で接続し、 `ps -ef` コマンドで見ると PID=1 以外動いておらず、 `ps -ef` のPPIDが **1** になっていることから、 PID=1 に接続していることがわかります。

```bash
~ $ docker container attach 136fb1ae1ac6
root@136fb1ae1ac6:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 16:59 pts/0    00:00:00 /bin/bash
root        11     1  0 17:00 pts/0    00:00:00 ps -ef
```

この状態で `exit` をすると コンテナが終了します。

Dockerの公式ドキュメントに明言はされていませんが、initプロセス(全ての親のプロセス)にあたるものを終了させたらコンテナとして稼働し続けることができないため、コンテナが終了すると解釈しています。

#### 参考
- [Man page of EXIT](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/exit.3.html)
- [(公式)docker attach](https://docs.docker.com/engine/reference/commandline/attach/)

### [おすすめ度:★️★️★️] commit コマンド
コマンド例は、 `docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]` です。OPTIONSは、 `docker container commit --help` で見ることができます。

`commit` コマンドは、コンテナ内の変更をイメージとして書き出すことができます。コンテナ内の変更分は、元のイメージからの差分として書き込まれます。

nginxのイメージからコンテナを起動します(nginxのレイヤーは3層( `docker image inspect nginx` で確認))。

```bash
~ $ docker image inspect nginx
// 省略
"Type": "layers",
"Layers": [
    "sha256:237472299760d6726d376385edd9e79c310fe91d794bc9870d038417d448c2d5",
    "sha256:bc5b41ec0cfa1171299c2b433f23caf3ca07ee275dfd187858882caad6723dd9",
    "sha256:86df2a1b653b072715d7e0f712ef3204341a241258cf33960f650df2b904dd44"
]
// 省略
~ $ docker run -it -d --rm -p 8000:80 nginx
20df82d1b7e4c8eac0ab057528a1cf03a560c4f895c5f204f73621dc73d45a06
~ $ docker ps # 起動しているコンテナを確認
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
20df82d1b7e4        nginx               "nginx -g 'daemon of…"   31 seconds ago      Up 30 seconds       0.0.0.0:8000->80/tcp   heuristic_dubinsky
~ $ docker container exec -it 20df82d1b7e4 /bin/sh # コンテナ内に侵入
# pwd
/
# touch /usr/share/nginx/html/404.html # 404.htmlを作成
# exit # コンテナから抜ける
```

この状態で `commit` をします。

```bash
~ $ docker container commit 20df82d1b7e4 added-404-nginx:latest
sha256:21a3dcb9d5f1a48e2aa66f73f37e1769f16b941206087e065784c2dd31503b65
~ $ docker image ls # イメージが作成できたか確認
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
added-404-nginx             latest              21a3dcb9d5f1        35 seconds ago      109MB
nginx                       latest              dbfc48660aeb        11 days ago         109MB
~ $ docker image inspect added-404-nginx # 作成されたイメージを確認
"Type": "layers",
"Layers": [
    "sha256:237472299760d6726d376385edd9e79c310fe91d794bc9870d038417d448c2d5",
    "sha256:bc5b41ec0cfa1171299c2b433f23caf3ca07ee275dfd187858882caad6723dd9",
    "sha256:86df2a1b653b072715d7e0f712ef3204341a241258cf33960f650df2b904dd44",
    "sha256:3bbd497c23c5a4a5560b23aa3f1c2949626c610e59f9b46e65ba954d328170ee" # ←追加されたイメージ
]
```

`commit` はコンテナに変更した内容をイメージとして作成できるので、デフォルトのイメージにちょっとした変更をしたいものをチームに共有したりする時に便利です。

### [おすすめ度:★️★️★️] cp コマンド
コマンド例は、 `docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-` または `docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH` です。OPTIONSは、 `docker container cp --help` で見ることができます。

`cp` コマンドで、ホストとコンテナー間でファイルのやりとりができます。このコマンドは、コンテナの状態に関わらず、ファイル/ディレクトリのコピーができます。コピー時にパーミッションは、 `cp -a` のオプションと同じような挙動となります。

また、コピーをする場合はパスに対して若干注意が必要です。

- ホストのパスは、 作業ディレクトリからの **相対パス** となります
- コンテナのパスは、 ルートからの **絶対パス** となります。

#### 参考
- [(公式)docker cp](https://docs.docker.com/engine/reference/commandline/cp/#options)

### [おすすめ度:★️★️★️] create コマンド
コマンド例は、 `docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]` です。OPTIONSは、 `docker container create --help` で見ることができます。

`create` コマンドはイメージからコンテナを作る時に利用します。

nginxのコンテナを作る時は以下のようになります。

```bash
~ $ docker container create --rm --name demo-server1 nginx
3a25ac6a45c37ab28ee50f02600117300657effffb88e0b8ba81b94756389025
```

#### 参考
- [(公式)docker create](https://docs.docker.com/engine/reference/commandline/create/)

### [おすすめ度:★️★️★️] exec コマンド
コマンド例は、 `docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]` です。OPTIONSは、 `docker container exec --help` で見ることができます。

`exec` コマンドは、実行中のコンテナでコマンドを実行することができます。

```bash
~ $ docker run -it -d --rm --name ubuntu_bash ubuntu
865f00275d7c2e4020d4dd8a12d75fbe2821f9ea4b1e69c814ea58287ebc8e68
~ $ docker container exec ubuntu_bash date # dateコマンドの実行
Sat Oct 27 14:45:12 UTC 2018
```

コンテナに接続する場合は、 `-it` オプションを利用します。

- `-i` : 標準入力をオープンにしておく
- `-t` : 擬似端末を割り当てる

```bash
~ $ docker container exec -it ubuntu_bash /bin/bash
root@865f00275d7c:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:44 pts/0    00:00:00 /bin/bash
root        44     0  1 15:02 pts/1    00:00:00 /bin/bash
root        54    44  0 15:02 pts/1    00:00:00 ps -ef
```

上記だと、 **PID=44** が割り当てられた端末であることがわかります。

### [おすすめ度:★️★️★️] logs コマンド
コマンド例は、 `docker container logs [OPTIONS] CONTAINER` です。OPTIONSは、 `docker container logs --help` で見ることができます。

`logs` コマンドは、コンテナのログを取得するコマンドです。logsコマンドの取得対象は、 **標準出力** または **標準エラー** です。

実際にnginxが実行されているコンテナのログを取得する場合は、以下の通りです。

```bash
04 $ docker ps // コンテナの起動確認
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44dec39e04b6        nginx               "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes       0.0.0.0:80->80/tcp   dazzling_sammet
04 $ docker container logs 44dec39e04b6
172.17.0.1 - - [06/Nov/2018:13:48:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" "-"
2018/11/06 13:48:28 [error] 6#6: *2 open() "/usr/share/nginx/html/robots.txt" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /robots.txt HTTP/1.1", host: "localhost"
172.17.0.1 - - [06/Nov/2018:13:48:28 +0000] "GET /robots.txt HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" "-"
```

また、ログをtailコマンドのように出力を追い続けたい場合は、 `-f` オプションを利用します。

`docker container logs -f <コンテナ>`

### [おすすめ度:★️★️★️] ls コマンド
コマンド例は、 `docker container ls [OPTIONS]` です。OPTIONSは、 `docker container ls --help` で見ることができます。

`ls` コマンドは、コンテナの一覧を表示します。オプションを指定しない場合は、実行中のコンテナを表示します。全てのコンテナを表示したい場合は、 `-a | --all` オプションを指定します。

```bash
04 $ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44dec39e04b6        nginx               "nginx -g 'daemon of…"   30 minutes ago      Up 30 minutes       0.0.0.0:80->80/tcp   dazzling_sammet
```

### [おすすめ度:★★★] rm コマンド
コマンド例は、 `docker container rm [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container rm --help` で見ることができます。

`rm` コマンドは、コンテナを削除します。 `-v` を指定すると、コンテナに関連づけられている **volume** との関連を削除します。

```bash
04 $ docker run --name ubuntu01 -d -it ubuntu /bin/bash
6b01c6f33880f1427e5f2da70ff25fff303670aeafca4cbd75ec7516f410c45f
04 $ docker container stop ubuntu01
ubuntu01
04 $ docker container ls --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
6b01c6f33880        ubuntu              "/bin/bash"              15 seconds ago      Exited (0) 9 seconds ago                       ubuntu01
04 $ docker container rm ubuntu01
ubuntu01
04 $ docker container ls --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS               NAMES
ef5fea93
```

### [おすすめ度:★★★] run コマンド
コマンド例は、 `docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]` です。OPTIONSは、 `docker container run --help` で見ることができます。

`run` コマンドは、新しいコンテナを作成、実行します。

筆者がよく使うオプションは、以下の通りです

- `-d` : コンテナをバックグランドで実行する
- `-p` : パブリッシュするポートを指定する
- `--name` : コンテナにコンテナ名を指定する(指定しない場合は適当な名前がつけられる)
- `-i` : 標準入力をオープンする(標準入力にアタッチしていなくてもOK)
- `-t` : 擬似端末を割り当てる
- `--rm` : コンテナ終了時にコンテナを削除する
- `--mount or -v` : ファイルシステムをコンテナにマウントする
  - 上記オプションについては [こちらの記事](https://qiita.com/supaiku2452/items/5d6e78d10094f64d269f)を参照してください

```bash
04 $ docker run -d --name nginx-demo01 --rm -p 80:80 nginx
d1ee68331236c7ac29818aefe250af098067cd852c2ca41c0c44b16bff49ce01
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d1ee68331236        nginx               "nginx -g 'daemon of…"   9 seconds ago       Up 8 seconds        0.0.0.0:80->80/tcp   nginx-demo01
```

### [おすすめ度:★★★] start コマンド
コマンド例は、 `docker container start [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container start --help` で見ることができます。

`start` コマンドは、停止中のコンテナを開始します。

起動時に標準出力と標準エラーにアタッチしたい場合は、 `-a` `--attach` オプションを指定します。

```bash
04 $ docker container ls --all
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
04 $ docker container create --name ubuntu01 -it ubuntu /bin/bash // コンテナを作成
2397c733db5c848d28b6be16194819705ba0ee86ca5c0e00ef4177379ab7c801
04 $ docker container ls --all // コンテナの作成を確認
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2397c733db5c        ubuntu              "/bin/bash"         5 seconds ago       Created                                 ubuntu01
04 $ docker container start ubuntu01 // コンテナの開始
ubuntu01
04 $ docker ps // コンテナの起動を確認
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2397c733db5c        ubuntu              "/bin/bash"         16 seconds ago      Up 5 seconds                            ubuntu01
```

また、起動時に標準入力にアタッチしたい場合は、 `-i` オプションを指定します。標準入力にアタッチするときは、PID=1にアタッチします。
また、コンテナから `exit` で抜けるとPID=1にアクセスしているので、コンテナは停止します。

```bash
04 $ docker container start -i ubuntu01
root@2397c733db5c:/# pwd
/
root@2397c733db5c:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:41 pts/0    00:00:00 /bin/bash
root        10     1  0 13:41 pts/0    00:00:00 ps -ef
```

### [おすすめ度:★★★] stats コマンド
コマンド例は、 `docker container stats [OPTIONS] [CONTAINER...]` です。OPTIONSは、 `docker container stats --help` で見ることができます。

`stats` コマンドは、コンテナのリソース状況をリアルタイムで表示します。

```bash
04 $ docker container start ubuntu01
ubuntu01
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
2397c733db5c        ubuntu01            0.00%               760KiB / 1.952GiB   0.04%               758B / 0B           0B / 0B             1
```

リソース状況は `stats` で確認してもいいですが、他にも見る方法がありますので、お好みでいいと思います。

### [おすすめ度:★★★] stop コマンド
コマンド例は、 `docker container stop [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container stop --help` で見ることができます。

`stop` コマンドは、実行中のコンテナを停止させるコマンドです。

```bash
04 $ docker run -d --name nginx-demo01 --rm -p 80:80 nginx
f095b7d9328a9b5e4f60abe03eeceb3fcc59955c4def304d2c35cb0792abd7de
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
f095b7d9328a        nginx               "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   nginx-demo01
04 $ docker container stop nginx-demo01
nginx-demo01
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

### [おすすめ度:★️★️]  diff コマンド
コマンド例は、 `docker container diff CONTAINER` です。OPTIONSは、 `docker container diff --help` で見ることができます。

`diff` コマンドは、コンテナを作成・起動してから、コンテナ内であった差分を出力するコマンドです。

以下は、ubuntuのコンテナを起動し、rootユーザのホームディレクトリにファイルを作成した場合の差分です。

```bash
~ $ docker run -it ubuntu # ubuntu起動
root@e91fff55445f:/# cd ~ # rootへ移動
root@e91fff55445f:~# echo "hello ubuntu" > hello.txt # 適当なファイルを書き出す
root@e91fff55445f:~# exit # 抜ける
exit
~ $ docker container diff e91fff55445f # 差分を見る
C /root
A /root/.bash_history
A /root/hello.txt
```

ファイル作成した様子と、コマンドの履歴が差分として表示されていることがわかります。
各シンボルの内容は以下の通りです。

|シンボル|説明|
|:--|:--|
|A|追加|
|C|変更|
|D|削除|

### [おすすめ度:★️☆️] kill コマンド
コマンド例は、 `docker container kill [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container kill --help` で見ることができます。

`kill` コマンドは、実行中のコンテナを停止することができます。killコマンドのデフォルトは **SIG_KILL** です。

killコマンドは停止対象のコンテナを停止したにも関わらず、止まらない場合に使用するのがいいでしょう。また、stopより正常に停止したコンテナのリExitコードは0となりますが、killコマンドで停止した場合、Exitコードは128+ `シグナルの番号` となります。

たとえば、nginxをSIG_KILL(9)で停止した場合は、 **137** が終了コードとなります。

```bash
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
04 $ docker run -d nginx // コンテナ起動
dbcfe3a093120bfa0ce41bd8f74cd4d0dbc1e774f7ea4cb9d8036e447bfe97e6
04 $ docker ps // 実行中のコンテナ確認
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
dbcfe3a09312        nginx               "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        80/tcp              wizardly_shockley
04 $ docker container kill dbcfe3a09312 // 有効なコンテナをkillする
dbcfe3a09312
04 $ docker container ls --all
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                        PORTS                            NAMES
dbcfe3a09312        nginx                       "nginx -g 'daemon of…"   25 seconds ago      Exited (137) 8 seconds ago                                     wizardly_shockley // Exitコードが **137** になっている。
```

### [おすすめ度:★️★️] pause コマンド
コマンド例は、 `docker container pause CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container pause --help` で見ることができます。

`ls` コマンドは、実行中のコンテナのプロセスを一時停止します。また、一時停止の解除には、 `unpause` コマンドを利用します。

```bash
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44dec39e04b6        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp   dazzling_sammet
04 $ docker container pause 44dec39e04b6
44dec39e04b6
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                NAMES
44dec39e04b6        nginx               "nginx -g 'daemon of…"   About an hour ago   Up About an hour (Paused)   0.0.0.0:80->80/tcp   dazzling_sammet
```

pauseをすると、STATUS欄がPausedとなり、一時停止中であることがわかります。

### [おすすめ度:★️★️] restart コマンド
コマンド例は、 `docker container restart [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container restart --help` で見ることができます。

`restart` コマンドは、コンテナを再起動します。オプションである通り、コマンド実行から再起動が行われるまでの時間は、デフォルト **10秒** です。
また、コンテナに `--rm` オプションを指定していても問題なく再起動します(削除されたら困りますね...)。

```bash
~ $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
b958ce10803d        nginx               "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes            80/tcp                   webserver
~ $ docker container restart -t 0 b958ce10803d
b958ce10803d
~ $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
b958ce10803d        nginx               "nginx -g 'daemon of…"   7 minutes ago       Up 4 seconds            80/tcp                   webserver
```

psコマンドの結果のSTATUSを見ると、再起動されていることがわかります。

### [おすすめ度:★★] top コマンド
コマンド例は、 `docker container top CONTAINER [ps OPTIONS]` です。OPTIONSは、 `docker container top --help` で見ることができます。

`top` コマンドは、実行中のコンテナのプロセスIDを表示します。

```bash
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
893ae1e197a9        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours         0.0.0.0:80->80/tcp   nginx-demo01
04 $ docker container top nginx-demo01
PID                 USER                TIME                COMMAND
2387                root                0:00                nginx: master process nginx -g daemon off;
2424                101                 0:00                nginx: worker process
```

### [おすすめ度:★★] unpause コマンド
コマンド例は、 `docker container unpause CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container unpause --help` で見ることができます。

`unpause` コマンドは、コンテナの一時停止を解除するコマンドです。

```bash
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
893ae1e197a9        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours         0.0.0.0:80->80/tcp   nginx-demo01
04 $ docker container pause nginx-demo01
nginx-demo01
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                 PORTS                NAMES
893ae1e197a9        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours (Paused)   0.0.0.0:80->80/tcp   nginx-demo01
04 $ docker container unpause nginx-demo01
nginx-demo01
04 $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
893ae1e197a9        nginx               "nginx -g 'daemon of…"   19 hours ago        Up 19 hours         0.0.0.0:80->80/tcp   nginx-demo01
```

### [おすすめ度:★★] update コマンド
コマンド例は、 `docker container update [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container update --help` で見ることができます。

`update` コマンドは、コンテナの設定を更新するコマンドです。

### [おすすめ度:★️] export コマンド
コマンド例は、 `docker container export [OPTIONS] CONTAINER` です。OPTIONSは、 `docker container export --help` で見ることができます。

`export` コマンドは、コンテナのファイルシステムをtarアーカイブとして出力することができます。説明では、tarアーカイブを出力すると書いていますが、実際は、標準出力になります。また、exportコマンドで出力したアーカイブは、 `import` コマンドで読み込むことができます。 importコマンドは後ほど説明しますが、tarアーカイブから新しいコンテナを作成することができます。

実際にコンテナを出力する場合は以下のようになります。

```bash
export $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1048ff9c19a0        nginx               "/bin/sh"           2 minutes ago       Up 2 minutes        80/tcp              demo-export
export $ docker container export -o nginx_container.tar 1048ff9c19a0 // -o でファイルパスを指定
export $ l
total 243072
-rw-------  1 ozawa  staff  111121408 11  4 21:57 nginx_container.tar // ファイルが生成されていることがわかる
```

`tar tf nginx_container.tar` でコンテナの中身を見ることができるので、気になる方は確認してみましょう。

### [おすすめ度:★️] inspect コマンド
コマンド例は、 `docker container inspect [OPTIONS] CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container inspect --help` で見ることができます。

`inspect` コマンドは、実行中のコンテナの詳細を見ることができます。

inspectコマンドはそんなに多用するイメージがないので、おすすめ度は★️にしています。

### [おすすめ度:★️] port コマンド
コマンド例は、 `docker container port CONTAINER [PRIVATE_PORT[/PROTO]]` です。OPTIONSは、 `docker container port --help` で見ることができます。

`port` コマンドは、コンテナが割り当てているポートを出力します。

```bash
~ $ docker run -d --rm -p 80:80 nginx
13b4eca3336b54881d19dc5bfad6006b0b9d52c67ad05fd318a6725de5529a23
~ $ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                    NAMES
13b4eca3336b        nginx               "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds            0.0.0.0:80->80/tcp       silly_hawking
~ $ docker container port 13b4eca3336b
80/tcp -> 0.0.0.0:80
```

ポートについては、 `ls` コマンドで代用が聞くのでそんなに利用頻度は高くないと感じています。

### [おすすめ度:★️] prune コマンド
コマンド例は、 `docker container prune [OPTIONS]` です。OPTIONSは、 `docker container prune --help` で見ることができます。

`prune` コマンドは、停止中のコンテナを削除します。

```bash
~ $ docker container ls --all
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                      PORTS                    NAMES
13b4eca3336b        nginx                       "nginx -g 'daemon of…"   33 minutes ago      Up 33 minutes               0.0.0.0:80->80/tcp       silly_hawking
44dec39e04b6        nginx                       "nginx -g 'daemon of…"   4 days ago          Exited (255) 3 days ago     0.0.0.0:80->80/tcp       dazzling_sammet
// 省略 ...
~ $ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
44dec39e04b634c6e1b8e283671d8c0e0d7968449fa2723531add48e0ab79ac6
b3c890612036931092e7e08617f0b30f6a4a6741903b97a2460288c018b0f93a
dbcfe3a093120bfa0ce41bd8f74cd4d0dbc1e774f7ea4cb9d8036e447bfe97e6
5931bb3e918db6c38431991283923e66639a4460c6072650168ada7111bca681
0879ef2b0f1e8af8501866bab26c34c3f4c068b7167cb8d0a1b9935701f9952d
059244238ecf9f4e8a5d4580abd9843b219a6170f503165960486d746a92e0b7
daf42f9d8f7bc2ba382b422e8d3739c96d9e732a282b3759c7685187ad386723
68991edbb3cbb197ef7b5a95d9478d7f3ee8a4b54df44ee719fdf6ebc1382b18
da6f69666bf23694f708289059eb7fee78abf3e24885f3f8e33120f3a620422c
921b103d49720d9a5ef0cfb3983b117948186ebac50730d934721c3f93af70ee
e91fff55445f91ca372946b2c799c47e559d5b9d0981d741e57229e379ef4c92
fb95fdb3c3542e27a5c99b2b3a80a92a65dafe4480a96d5bb582da3215627b31
c50e63316663492dc812c7f6f7b45bf3a1cde354d63ca3eda49fb1f3a224a94d
415183f9ed4215f73576615b1b209fa833e8bda851b9fae9ca80fabb23413bc6
e905fa6605313ada518ab75e3fde29a1b7a7cedd22a80abba00c161a1e9c2b5b
45a43179c11df1c99c4f93fb880ddcd5cdf7dcad9388c3186df5a569360e2612
aff698495ab9532d9c9a1c7face1101ad8fffd05f378131c0b430321221a44e1
256ae14ca2fb3b8583d1d6063df107b325ef617363f9d5a432d47862793c7059

Total reclaimed space: 640.5MB
~ $
```

pruneコマンドは上記の通り、停止中のコンテナを削除するため、必ず実行前に確認のメッセージが表示されます。

> WARNING! This will remove all stopped containers.
> Are you sure you want to continue? [y/N] y

削除するときは、かならず確認してから実行しましょう。

### [おすすめ度:★️] rename コマンド
コマンド例は、 `docker container rename CONTAINER NEW_NAME` です。OPTIONSは、 `docker container rename --help` で見ることができます。

`rename` コマンドは、コンテナの名前をリネームします。リネームは、コンテナが起動中でも実行できます。

### [おすすめ度:★] wait コマンド
コマンド例は、 `docker container wait CONTAINER [CONTAINER...]` です。OPTIONSは、 `docker container wait --help` で見ることができます。

`wait` コマンドは、コンテナの停止を阻止し、コンテナが終了するときに終了コードを表示する。

```bash
04 $ docker run -d --name nginx-demo01 --rm -p 80:80 nginx
97a9e94ae935d230137b317413590320c70c6b69b7f4960bc7375c6b9649cc72
04 $ docker container wait nginx-demo01

```

`wait` コマンドを実行すると今開いているターミナルからの入力ができなくなるので、別のターミナルから以下のコマンドを実行します。

```bash
~ $ docker container stop nginx-demo01
nginx-demo01
```

もともと開いていた端末では以下のように表示されます。

```bash
04 $ docker container wait nginx-demo01
0 # ここに終了コードが表示される
```

一通りのコマンドを列挙してみましたが、結構なボリュームがあり、書いている途中でしんどくなってしまい、ところどころ内容が薄くなってしまいました。また、 `run` コマンドはオプションが多く、Dockerを扱う中でもかなり重要なコマンドだと感じているので別途まとめようかと思います。

## まとめ一覧
[Dockerの基礎をまとめてみた ~ 第一章：コンテナ？Dockerとは？](https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92)
[Dockerの基礎をまとめてみた ~ 第二章：Dockerの基本操作](https://qiita.com/supaiku2452/items/eefdb8ebf106ac579bfa)
[Dockerの基礎をまとめてみた ~ 第三章：Dockerコマンド - image編](https://qiita.com/supaiku2452/items/cd3d4e2ccd5215f3b6d9)
Dockerの基礎をまとめてみた ~ 第四章：Dockerコマンド - container編