Dockerコマンドいろいろメモ

だいぶ前にDockerを軽く触りましたが、一度会社PCが新しくなって環境がなくなってからは構築できず、そのまま遠ざかっていました。
この春、またPC入れ替えで新しくなったので、Dockerを構築してもう少し活用したいと思い、備忘録兼ねて構築に使わせてもらったサイトと基本的なコマンドをまとめておこうかと思います。

### まずは構築
以下の環境に構築しました。
エディション：Windows11 Pro
バージョン：23H2
OSビルド：22631.3593
CPU：Intel(R) Core(TM) i7
メモリ：16G

構築メモは以下の記事を参考にさせて頂きました。

https://dev.classmethod.jp/articles/how-to-setup-wsl2-for-windows11/

また、弊社サイトですが、以下の記事のおかげでネットワークつながらない問題が解決しました。（Windows10構築メモですが、ネットワーク部分は同じだったので助かりました）

https://developer.mamezou-tech.com/blogs/2023/09/09/docker_ubuntu_on_wsl2/

### よく使うコマンド
ちょっとしたオプション忘れがちなので、以下にメモ。
#### 今の状況を見る

今あるイメージはimagesコマンドで見ることができます。
```
ubuntu@MYPC:~$ docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
hello-world      latest    d2c94e258dcb   13 months ago    13.3kB
```

今実行中のコンテナはpsコマンドで見ることができます。
-a をつけると停止しているコンテナもすべて表示されます。
```
ubuntu@MYPC:~$ docker ps -a
CONTAINER_ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
761727eb5a76   hello-world   "/hello"   4 weeks ago   Exited (0) 4 weeks ago             cool_wozniak
```
#### イメージ作成
Dockerfileを使ってイメージを作成します。
適当なフォルダを作って、Dockerfileを作ります。
```
ubuntu@MYPC:~$ mkdir /docker_setting/ubuntu-python3
ubuntu@MYPC:~$ touch /docker_setting/ubuntu-python3/Dockerfile
```
一旦、Pythonが動く環境をベースにしたかったので、シンプルなものだけ作りました。
```Dockerfile:
FROM ubuntu:22.04

RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y git python3 python3-pip
```
以下のコマンドで実行するとイメージが作成されます。
```
ubuntu@MYPC:~$ cd /docker_setting/ubuntu-python3/
ubuntu@MYPC:~/docker_setting/ubuntu-python3$ docker build -t ubuntu-python3 .
[+] Building 80.0s (7/7) FINISHED                                                                            docker:default
 => [internal] load build definition from Dockerfile                                                                   0.0s
 => => transferring dockerfile: 145B                                                                                   0.0s
 => [internal] load metadata for docker.io/library/ubuntu:22.04                                                        2.8s
 => [internal] load .dockerignore                                                                                      0.0s
 => => transferring context: 2B                                                                                        0.0s
 => [1/3] FROM docker.io/library/ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761bbfb2  4.2s
 => => resolve docker.io/library/ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761bbfb2  0.0s
 => => sha256:52882761a72a60649edff9a2478835325d084fb640ea32a975e29e12a012025f 2.30kB / 2.30kB                         0.0s
 => => sha256:a8b1c5f80c2d2a757adc963e3fe2dad0b4d229f83df3349fbb70e4d12dd48822 29.53MB / 29.53MB                       3.0s
 => => sha256:a6d2b38300ce017add71440577d5b0a90460d0e57fd7aec21dd0d1b0761bbfb2 1.13kB / 1.13kB                         0.0s
 => => sha256:2af372c1e2645779643284c7dc38775e3dbbc417b2d784a27c5a9eb784014fb8 424B / 424B                             0.0s
 => => extracting sha256:a8b1c5f80c2d2a757adc963e3fe2dad0b4d229f83df3349fbb70e4d12dd48822                              1.0s
 => [2/3] RUN apt-get update && apt-get upgrade -y                                                                     7.5s
 => [3/3] RUN apt-get install -y git python3 python3-pip                                                              64.4s
 => exporting to image                                                                                                 1.0s
 => => exporting layers                                                                                                1.0s
 => => writing image sha256:6399f1dcc3f32eee54a25274708b87ec96cc60ea2a54cd4d86d9fb970f42fefa                           0.0s
 => => naming to docker.io/library/ubuntu-python3
 ```
#### コンテナ実行
作業用フォルダを作って、そこをマウントしつつ実行します。
以下は、ubuntu イメージを使って新しいコンテナを起動し、その中でシェル (/bin/bash) を実行するコマンド
```
ubuntu@MYPC:~$ docker run -it --name analyse-env ubuntu-python3 /bin/bash
root@d0bf907b8533:/#
```
オプションのiやtは標準入力や疑似ターミナルに関するコマンド、--nameはコンテナ名をつけるオプションになってます（今回は「analyse-env」という名前でコンテナを作成）

#### コンテナ削除
```
使うコマンド：docker rm <コンテナID>
```

まず、削除するコンテナのCONTAINER_IDを以下のコマンドで、探します
-aは停止しているコンテナも表示してくれます
```
ubuntu@MYPC:~$ docker ps -a
CONTAINER_ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
761727eb5a76   hello-world   "/hello"   4 weeks ago   Exited (0) 4 weeks ago             cool_wozniak
```
今回は、構築時に作ったhello-worldコンテナを削除したいので、「761727eb5a76」というIDのコンテナを削除します。
削除するIDが分かったら以下のコマンドでサクッと削除できます。
```
ubuntu@MYPC:~$ docker rm 761727eb5a76
```

#### イメージ削除
```
使うコマンド：docker rm <イメージID>
```

イメージを削除する際は、それに紐づいているコンテナから削除する必要があります。
まずは、先ほどのコンテナ削除の際にIDを見るコマンドでIMAGE列に削除したいイメージが書かれているコンテナを削除します。

そのあと、削除するIMAGE_IDを以下のコマンドで探します
```
ubuntu@MYPC:~$ docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
ubuntu-python3   latest    6399f1dcc3f3   18 minutes ago   498MB
hello-world      latest    d2c94e258dcb   13 months ago    13.3kB
```
hello-worldイメージのIMAGE_IDが分かったら、以下のコマンドで削除します
```
docker image rm d2c94e258dcb
```
再度コマンドをたたくと、削除されていることが分かります。
```
ubuntu@PMR666N:~$ docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
ubuntu-python3   latest    6399f1dcc3f3   22 minutes ago   498MB
```

### その他
#### 容量を節約したい！
##### 使い終わったコンテナを自動で削除するオプションをつける（--rm）
それほど節約にはならないかもしれませんが、あれこれ試しにコンテナ作ってごみがたまるのを防ぐことはできるかと。
```
ubuntu@MYPC:~$ docker run -it --rm --name analyse-env ubuntu-python3 /bin/bash
root@d0bf907b8533:/#
```

#### ファイルのI/Oが遅いのはつらい
「作ったファイルはWindows上に置いておきたい」、「Windows上で調整したファイルをコンテナで連携したい」との思いで、ファイル連携を試行錯誤していましたが、今回の環境作りで改めて調べなおしたら、

* WSL2上にファイルを置く（\\\\wsl2$\home\<ユーザ名>でWindows上からファイルがおける）
* コンテナがWSL2のフォルダをマウントするように実行する 

と良さそうということが分かりました。
マウントする際は、コンテナ起動時にオプションを追加します。
試しにWSL2の~/work/docker_shareというフォルダをコンテナの/shareにマウントしたときのコマンドを以下にメモしておきます。

```
ubuntu@MYPC:~/work/docker_share$ ls
test.txt
ubuntu@MYPC:~/work/docker_share$ docker run -it --rm -v $PWD:/share --name analyse-env ubuntu-python3 /bin/bash
root@3da02ec3cabb:/# cd /share
root@3da02ec3cabb:/share# ls
test.txt ←マウントするフォルダに入れておいたテキストファイルが見えている
root@3da02ec3cabb:/share#
```
「$PWD:/share」はWSL2でコマンドをたたく時のカレントディレクトリを示しています。
コマンドとしては
-v <ホスト側のディレクトリ>:<コンテナ側のディレクトリ>
として記載します。