Dockerの基本操作（コマンド）について理解してみた

## はじめに
「イメージ操作系」「コンテナ操作系」に分類されるようなので、その観点で操作についてみていく（前段として、Docker Hubとは？とDockerイメージのTagとは？についても整理してみた）。

※以下の操作はDocker Hubのアカウントを持っている事を前提にしている。Docker Hubへの登録は https://hub.docker.com/signup からできる。

## [Docker Hub](https://hub.docker.com/)について
Dockerコンテナを作成する際に必要になるDockerイメージが保管されているクラウド上のストレージ。Dcokerをインストールした際には、デフォルトでDocker Hubからそのイメージを取得するように設定されている。

Dockerイメージは、通常は`ユーザ名/イメージ名`という名前でないと利用できないが、Docker公式イメージは以下の図のようにユーザ名が省略されたイメージ名のみで利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/2021d6b2-acd2-2979-34e6-0574ad318cb6.png)


## DockerイメージのTagsについて
各DockerイメージのDescriptionにTagと呼ばれるものが記載されているが、大抵の場合これは`version名-OS名`という構成で表記されている事が多い。例えば[node](https://hub.docker.com/_/node)であれば、以下のようにTagの一覧があるが、`17-alpine3.14`というのはNode.js17.xというversionでOSがalpine3.14という意味である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/78072bfc-59ef-b488-33eb-acb713a17667.png)

※`alpine`という聞きなれないOS名が出てきたが、これはDocker向けの軽量Linux。なんでDocker向けの軽量Linuxというものがあるのか？だが、Dockerではコンテナを作成する際に都度必要なイメージをダウンロードしてくるが、そのサイズが大きいと時間がかかるしディスク容量も圧迫してしまう。つまり、Dockerイメージが軽量（小さい）事が重要であり、そのためDocker向けの軽量Linuxというものがある。

そしてそのTagだが、サイトを見ると分かる通りリンクになっており、そのリンクをクリックすると大抵はGitHubに飛ぶ。
このGitHub上で見える以下のような[ファイル`Dockerfile`](https://github.com/nodejs/docker-node/blob/6256caf2c507e7aafdeb8e7f837bab51f46f99e0/17/alpine3.14/Dockerfile)は、Dockerイメージの構成を定義されたファイルであり、Dockerイメージ利用する際にどんな定義のイメージなのか？が見れないと困るという事で、TagのリンクをクリックするとこのDockerfileに飛ぶことが多い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/3bbb093f-395c-640c-96e2-31b376eae810.png)

## Dockerのイメージ操作系のコマンドを実行してみる
コマンド自体は以下の3つ（削除は使用していないイメージを全て削除する[`docker imagae prune`](https://docs.docker.com/engine/reference/commandline/image_prune/)もある）。

### Dockerイメージの取得 `docker image pull NAME[:TAG]`  
Dockerイメージをレジストリが取得してダウンロードする。NAMEはDockerイメージの名前を指定し、`:TAG`イメージのversionを指定するためのもので、Dcoker Hubであれば[DockerイメージのTagsについて](#dockerイメージのtagsについて)の章で取り上げたようなものを指定できる（`:TAG`未指定だとversionは`latest`になる）。

※コマンドの省略形：[`docker pull NAME[:TAG]36.`](https://docs.docker.com/engine/reference/commandline/pull/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/483942d5-d676-817c-c993-46d5bc18dbe4.png)

- 参考：[docker image pull](https://docs.docker.com/engine/reference/commandline/image_pull/)

### Dockerイメージの一覧表示 `docker image ls`  
ローカルにダウンロード済みのDockerイメージ一覧を表示する。

※コマンドの省略形：[`docker images`](https://docs.docker.com/engine/reference/commandline/images/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/32569a49-550f-6f68-426e-264bc703c398.png)

- 参考：[docker image ls](https://docs.docker.com/engine/reference/commandline/image_ls/)

### Dockerイメージの削除 `docker image rm IMAGE_ID`  
Dockerイメージをローカルから削除する。削除する際には、上記の`lsコマンド`で一覧を表示した際に出てくる`IMAGE ID`を指定する。

※コマンドの省略形：[`docker rmi IMAGE_ID`](https://docs.docker.com/engine/reference/commandline/rmi/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/a985e627-72bf-5460-c3d5-8d46f6f2b7f0.png)

- 参考：[docker image rm](https://docs.docker.com/engine/reference/commandline/image_rm/)

## Dockerのコンテナ操作系のコマンドを実行してみる
コマンド自体は以下の4つ。

- 参考：[コンテナで Hello world](http://docs.docker.jp/v1.11/engine/userguide/containers/dockerizing.html)

### Dockerコンテナの実行 `docker container run [OPTION] NAME[:TAG] [COMMAND]`  
指定のDockerイメージで、Dockerコンテナを実行する。
OPTIONの中でも覚えておくと便利なものとして以下の5つがある。

※コマンドの省略形：[`docker run [OPTION] NAME[:TAG] [COMMAND]`](https://docs.docker.com/engine/reference/commandline/run/)

| オプション | 説明 |
|:-:|---|
| --detach , -d | コンテナをバックグラウンドで実行する（＋コンテナIDを表示する）事ができるオプション |
| -it | Dockerコンテナを作成時にshellを実行したい場合、このオプションを設定する事でshellの実行ができる<br>正確にはDockerコンテナ実行時に以下のようにDockerコンテナのターミナルとホストが相互に接続し、ホスト側から指示（shellの実行やbashを起動）を実行できる。これにより、例えば以下の画像のようにLinuxのbashを起動するように指定すると、Dockerコンテナ内のターミナルが見れる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/38b6a3a8-174e-c97d-2d50-1c8c6a94fa52.png)<br><br>※実際には`-it`というオプションはないが、公式の[Option types](https://docs.docker.com/engine/reference/commandline/cli/#option-types)に書かれている通り、1文字のコマンドラインオプションは組み合わせることができるので、`docker run -i -t --name test busybox sh`は`docker run -it --name test busybox sh`とできる<br>ちなみに、`-t`は「新しいコンテナ内に疑似ターミナル (pseudo-tty)」というオプションで、`-i`は「コンテナの標準入力 (STDIN)を取得し、双方向に接続できるようにする」という意味で、これを組み合わせると、Dockerコンテナ内のターミナルに対しshellが実行できる（Dockerコンテナを起動するホストのターミナルから、Dockerコンテナ内のターミナルが双方につながるので） |
| --env , -e | `-e KEY=VALUE`のように指定する事で、Dockerコンテナ内の環境変数を設定できるオプション |
| --name | `--name NAME`のように指定する事で、Dockerコンテナ実行時のコンテナ名を指定できるオプション |
| --publish , -p | `-p CONTAINER_PORT:HOST_PORT`のように指定する事で、コンテナポートをホストのポートに公開（マッピング）できるオプション<br><br>※Dockerコンテナ内に起動しているサーバ（アプリ、Redis、MySQLなど）にホスト側からアクセスする際には、このオプション設定をしないとダメ |

- 参考：[docker container run](https://docs.docker.com/engine/reference/commandline/container_run/)

### Dockerコンテナの停止 `docker container stop CONTAINER`
実行中のコンテナを停止する。
複数指定すれば複数停止もできる。

※コマンドの省略形：[`docker stop CONTAINER`](https://docs.docker.com/engine/reference/commandline/stop/)

- 参考：[docker container stop](https://docs.docker.com/engine/reference/commandline/container_stop/)

### Dockerコンテナの一覧 `docker container ls [OPTION]`
コンテナの一覧を表示する。
オプション`-a`を付ける事で停止中のコンテナも表示できる。

※コマンドの省略形：[`docker ps`](https://docs.docker.com/engine/reference/commandline/ps/)

- 参考：[docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/)

### Dockerコンテナの削除 `docker container rm CONTAINER`
指定されたコンテナを削除する。

※コマンドの省略形：[`docker rm CONTAINER`](https://docs.docker.com/engine/reference/commandline/rm/)

- 参考：[docker container rm](https://docs.docker.com/engine/reference/commandline/container_rm/)

### 使用していない全てのDockerコンテナの削除 `docker container prune`
使用されていないコンテナを削除する。

- 参考：[docker container prune](https://docs.docker.com/engine/reference/commandline/container_prune/)

### （おまけ）`docker system prune`
使用されていないイメージとコンテナを全て削除する。

- 参考：[docker system prune](https://docs.docker.com/engine/reference/commandline/system_prune/)