【Docker】よく使いそうなコマンドの整理

Dockerは無知なところからなんとなくで感じだったので一度体系的に学習し直しました。
コマンドが結構多く混乱する印象でしたので、よく使いそうなコマンドを備忘録として書き残しておきたいと思います。
残しておきたいコマンドが出てきたら随時アップデートしていきたいと思います。


:::note info
紹介するコマンドは新体系(v1.13以降)のコマンドに統一しています
新旧比較の情報は「[docker container / image コマンド新旧比較](https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266)」を参考にさせていただきました。
:::

# image関連

`docker image pull {イメージ名:バージョン}`（旧：docker pull）
・イメージをDockerHubから取得

`docker image ls`（旧：docker images）
・ローカルのイメージ一覧を表示
・**-a** 付与で中間イメージを含め表示
・**-q** 付与でイメージIDのみ表示

`docker image rm {イメージ名}`（旧：docker rmi）
・ローカルのイメージを削除
・`docker image rm $(docker image ls -aq)`で全ローカルイメージを一括削除

:::note info
コンテナ起動中のイメージに対し削除するとエラーが発生します
Error response from daemon: conflict: unable to delete 43677... (must be forced) - image is being used by stopped container 5c181...
:::

# container関連

`docker container run {イメージ名}`（旧：docker run）
・指定したイメージからコンテナを作成し起動

`docker container exec {コンテナ名} {実行コマンド}`（旧：docker exec）
・Up状態のコンテナに任意のコマンドを実行させる

`docker container ls`（旧：docker ps）
・ローカルに存在するコンテナ一覧を表示
・**-a** 付与で未起動のコンテナも含めて表示

`docker container start`（旧：docker start）
・停止中のコンテナを停止

`docker container stop`（旧：docker stop）
・実行中のコンテナを停止

`docker container restart`（旧：docker restart）
・実行中のコンテナを再起動

`docker container rm {コンテナ名}`（旧：docker rm）
・コンテナを削除
・**-f** 付与で起動中のコンテナに対しても強制的に削除
・`docker container rm prune`でExitedステータスのコンテナを削除
・`docker container rm -f $(docker container ls -aq)`で全コンテナを一括削除

:::note info
起動中のコンテナに対し削除をするとエラーが発生します（コンテナを停止するか-fオプションで強制削除が必要）
Error response from daemon: You cannot remove a running container 256d77...37. Stop the container before attempting removal or force remove
:::

## docker container [ run | exec ] の詳細

#### docker container run

例：`docker container run ubuntu:20.04`
・Ubuntuイメージのデフォルトコマンドはbash
・上記コマンドの場合、**標準入力がCLOSEDの状態**でbashを実行することになる
・この場合bashは起動と同時に実行プロセスを終了するため、コンテナのSTATUSはExitedの状態になる
```docker
% docker container run ubuntu:20.04 
% docker container ls -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES
b238da560b2f   ubuntu:20.04   "/bin/bash"   12 seconds ago   Exited (0) 11 seconds ago             dreamy_lehmann
```

・そのためコンテナを起動状態にするためには **-i** が必要になる（-i = --interactive = 対話形式での入力を可能とする）
・**-t** 付与で擬似TTYを割り当て端末デバイスの名前を表示できる（なぜコマンドの実行結果なども綺麗になるのかよくわからなかった...）
・**-d** 付与でバックグラウンドでコンテナを実行する（起動時に中に入りたくない時使う）
・**-rm** 付与でコンテナ終了時に自動的に削除する

ちなみに、-tオプションのみで起動すると標準入力がCLOSEDの状態なのでコマンド入れても反応しませんでした。
```docker
% docker container run -t ubuntu:20.04
root@b75f2b49f00e:/# 

exit

ls

```

まとめると
「コンテナのSTATUSをUpの状態してバックグラウンドで起動したい。必要に応じて中に入りたい。停止したらコンテナは削除したい」
のような考えの場合、
`docker container run --rm -itd ubuntu:20.04`
というコマンドが出来上がる。

・`docker container run {イメージ名} [COMMAND] [ARG]`でコンテナ起動時のコマンドを指定することも可能
```docker
% docker container run -it ubuntu:20.04 pwd
/
% 
```
上の例では-itを指定しているがコマンドにpwdを指定しているため(デフォルトコマンドであるbashを実行しない)、rootディレクトリが表示されてExitedとなる。

#### docker container exec

例えばバックグラウンドで起動させたubuntuイメージのコンテナに入る場合はexecでコンテナ名(コンテナID)を指定し、bashコマンドを実行することで中に入ることができる。
もちろんこの時も **-it** を付与しなければ即Exitedとなり中に入ることはできない。

```docker
% docker container run -itd ubuntu:20.04   
9db853cdddc5f185cd34c8841ba8bad92ee97073d61057c8e96593b3c0dcdf49
% docker container ls
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
9db853cdddc5   ubuntu:20.04   "/bin/bash"   7 seconds ago   Up 5 seconds             boring_euclid
% docker container exec -it 9db853cdddc5 bash
root@9db853cdddc5:/#
```

# 参考
* https://www.udemy.com/share/109eIi3@7Cii6t4rdgEl9Zxo-uQXru_D2zJ2NMuPZOeyyJi1U00ODvTFowBLG5RwbiLrKvkdDg==/
* https://docs.docker.jp/index.html
* https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266
* https://zenn.dev/ryuu/scraps/a1efb79aaa1bb2