初心者向け、Dockerコマンドメモ

インターン先でdockerが必要となり、勉強し始めて2週間の学生が、dockerを扱う上で基本的なコマンドを、備忘録としてまとめました。

dockerについては説明していないので、dockerの基本は理解できているが、あのコマンドなんだっけ??となった時に、見れるようにしました。

間違いなどがある場合には、コメントでご指摘して下さると、ありがたいです🙇‍♂️

dockerについて全然知らないという方向けに、おすすめの教材のURLも貼っておきます。有料ですが、圧倒的に分かりやすく、非常にdockerの理解に役立ちました。基本的には上のudemy講座がおすすめですが、超初心者だと、まずは下の漫画からの方が入りやすいかなと思います。

 - [udemy 米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)

 - [マンガでわかるDocker](https://note.com/llminatoll/n/n4f419db0effc)

# 準備

### dockerhub にログインしたい

```py
docker login 
```

# imageを〇〇したい

### imageを、dockerhubからホストにpullしたい

```py
docker pull <image>
```

### imageの一覧(ホストにある)を表示したい

```py
docker images
```


### image名を変更したい

```py
docker tag <now image> <new image>
docker tag <username>/<repository>:<tag> <username>/<repository>:<tag>
```

 - 詳細は、`<hostname>:<port>/<username>/<repository>:<tag>` だが、指定しないとデフォルトでは、`<hostname>:<port>`はDockerhubのもの、`<username>`はlibrary、<tag>はlatestとなる。

### imageをdockerhubにpushしたい
```py
docker push <image>
```

### imageを削除したい
```py
docker rmi <image>
```

### imageを、コンテナから作成したい

```py
docker commit <container> <image>
docker commit <container> <repository:tag>
```

# コンテナを〇〇したい

### コンテナを作成 & プログラムを実行したい

```py
docker run -it <image>

# example1
docker run -it hello-world

# example2
docker run -it ubuntu bash

# detachedモード
# backgroundで動かす用
docker run -it -d ubuntu bash

# foregroundモード
# 使い捨て用
docker run -it --rm ubuntu bash
```
 - `<image>`がホスト上にない時は、dockerhubからimageをpullしてきてくれる。
 - `docker run` = `docker create`(コンテナを作成する。) + `docker start -a`(デフォルトのコマンドを実行する。)
 - `-it`: bash起動時等に必要なおまじない
 - bash: コンテナ起動時に実行するプログラム。ここではbashというプログラムを実行させている。
 - `--name <name>`: コンテナの名前を指定するためのオプション。


### コンテナの一覧を表示したい

```py
# Activeなコンテナの一覧を表示したい
docker ps

# 全てのコンテナの一覧を表示したい
docker ps -a
```

### コンテナを削除したい
```py
# 停止中のコンテナを削除
docker rm <container>

# 起動しているコンテナを削除
docker stop <container>
docker rm <container>

# 停止中のコンテナを全て削除
docker system prune
```

 - 起動中(statusがUp)のコンテナは削除するために、先に停止させる必要があります。

### コンテナに入りたい

```py
# statusがUpのコンテナに入る。
# 既に動いているプロセスが走る。
docker attach <container>

# statusがUpのコンテナに入る。
# 2個目のプロセスが走る。
docker exec -it <container> bash

# statusがExitedのコンテナに入る。
# 既に動いているプロセスが走る。
docker restart <container>
docker attach <container>

# statusがExitedのコンテナに入る。
# 2個目のプロセスが走る。
docker restart <container>
docker exec -it <container> bash
```
 - `docker exec -it <container> bash`を起動中のコンテナ(既に、1個目のプロセスが動いている)に対して行うと、2個目のプロセスが走ることになる。その後、`exit`でコンテナを抜けても(2個目のプロセスを切っても)、まだ1個目のプロセスは動いている。

 - 「なんで、exitでコンテナから抜けたのに、まだstatusがupのままなの？？」と感じたら、上のような原因が考えられる。

### コンテナから出たい

```py
# コンテナを動かしているプロセスを切って、出る。
exit

# detach
# コンテナを動かしているプロセスを残したまま、出る。
control p + q
```
 - exitで出ると、コンテナの status は、Exited になる。(プロセスは終了する。)
 - detachで出ると、コンテナの status は、Up のまま。(プロセスは起動したまま。)

### コンテナを再起動させたい

```py
docker restart <container>
```
 - `<container>` は、再起動させたいコンテナのID、または、コンテナの名前を指定する。
 - コンテナの status は、Exited から、 Up になる。

### コンテナにプログラムを実行させたい

```py
docker exec -it <container> bash
```
 - `<container>` は、実行させたいコンテナのID or 名前を指定する。
 - -it: bash起動時等に必要なおまじない
 - bash: コンテナ起動時に実行するプログラム。ここではbashというプログラムを実行させている。


# コンテナに入れない😭

コンテナに入るところで、つまづいたポイントです。コンテナ入れなくてめちゃくちゃ困り果てたので、同じことが起こった人は参考にしてみて下さい。

### コンテナのstatusがUpにならない😭

Exited状態のコマンドに対して、`docker start` `docker restart`をしても、statusがUpにならない問題。

これはおまじない`-it`をつけ忘れて、`run`をしている可能性があります。もう一度、`docker run -it <image>`でimageからコンテナを作成してみてください。

自分も、おまじない`-it`をなめて、つけないでいると、コンテナにどう頑張っても入れず痛い目を喰らいました。おまじないを忘れないように。

### `docker exec -it <container> bash`を実行しても、`Error response from deamon: Container ランダムな値 is not running`エラーが発生する😭

コンテナのStatusがExited(停止中)になっている可能性があります。StatusがUpになっているかを確認して下さい。StatusがExitedになっている場合は、`docker restart <container>`でコンテナを起動させる必要がある。

# おまじない `-it` ってなんやねん😡

 - `-i`: これをつける事で初めて、ターミナルで打ったコマンドを、コンテナ側が認識してくれます。例えば、`-i`を抜いてコンテナを立ち上げた時に、ターミナルで`ls pwd cd`等を打っても反応が一切ありません。

 - `-t`: これをつける事で初めて、コンテナからの出力の表示が綺麗になったり、タブ補完が効くようになります。例えば、-tを抜いてコンテナを立ち上げた時に、出力の表示が汚かったり、タブ補完が効きません。

試しに、以下のコマンドでの挙動の違いを見てみると勉強になります。

```py
docker run -it ubuntu bash  
docker run -t ubuntu bash  
docker run -i ubuntu bash  
docker run ubuntu bash  
```

# 最後に
dockerは難しいですが、非常に便利なので、早く慣れたいと思います。

勉強し始めてまだ2週間で、いろいろツッコミがあると思います。コメントでご指摘して下さると、ありがたいです🙇‍♂️