もう逃げない。基礎から学ぶDocker入門 / Dockerの基本操作（ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除）（3/9）

## はじめに

今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。

https://www.docker.com/

コレまで、便利なんだろうなと思いながらも、逃げてました。

なので、開発環境では使いこなせるスキルにまでは理解したいと思います。

あと、暗記してたDockerコマンドを１つ１つ理解していきます。

以下のような順番で勉強していきます。

- [Dockerの概要（1/9）](https://qiita.com/ryosuketter/items/d7833182dced67713d27)
- [Dockerの基本操作（イメージの作成, コンテナの起動, 停止, 削除）（2/9）
](https://qiita.com/ryosuketter/items/c53352f1143366d8b9a9)
- [Dockerの基本操作（ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除）（3/9）](https://qiita.com/ryosuketter/items/5fd73b7311175a691dfe) :point_left_tone1: 今ここ
- [Dockerfileを使用したサーバー構築（座学編）（4/9）](https://qiita.com/ryosuketter/items/d9c3420be7da586225e8)
- [Dockerfileを使用したサーバー構築（実践編）（5/9）](https://qiita.com/ryosuketter/items/716a4c5e49795d494600)
- [Docker Composeの概要（座学編）（6/9）](https://qiita.com/ryosuketter/items/104a4eb38f8824eb6de9)
- [Docker Composeのよく使う基本操作（7/9）](https://qiita.com/ryosuketter/items/8bbd2c60392f443cfe23)
- [Docker Composeを使ってRailsの環境を構築する（8/9）](https://qiita.com/ryosuketter/items/91cd107794c1cbe358c6)
- [Docker上に構築したRailsをHeroku（本番環境）にデプロイ（公開）する（9/9）](https://qiita.com/ryosuketter/items/e3e68ce6ec572dc8905e)

## Dockerの基本操作

よく使うであろうコマンド操作を覚えていきます。

- ログの出力（`docker container logs`）
- 指定したコンテナの中でプロセスを実行する方法（`docker container exec`）
- 使用していない Docker オブジェクトの削除（`docker system prune`）

### ログの出力

ログを出力させたいので、再度、dockerコンテナを起動させます。

```bash
docker container run -d -p 8000:8000 --name webrick sample/webrick:latest                                                                                                   

dac0475130a1f393026dc81ca6d0ea0207ac1c1268f499c6a77880ec38fc5207
```

前回にはないオプション（`-d`）が追加されましたね。

これは、デタッチドモードと言って、バックグラウンドでcontainerを立ち上げるオプションです。

https://qiita.com/keitean/items/d83254090405aa714b15

なぜこれをするかというと、バックグラウンドでcontainerを立ち上げると、画面が出力結果で支配されるので（docker container run はデフォでフォアグラウンドモード）。

フォアグラウンドモード（ -d を指定しないデフォルト ）では、 docker run はコンテナの中でプロセスを開始でき、操作画面上（コンソール）にプロセスの標準入力、標準出力、標準エラーを取り付け（アタッチ）できます。

https://docs.docker.jp/engine/reference/run.html#d

ここで、`http://localhost:8000/`にアクセスしてから、以下のログ出力コマンドを実行してみましょう。

```
docker container logs webrick

[2021-09-24 05:03:04] INFO  WEBrick 1.6.1
[2021-09-24 05:03:04] INFO  ruby 2.7.4 (2021-07-07) [x86_64-linux]
[2021-09-24 05:03:04] INFO  WEBrick::HTTPServer#start: pid=1 port=8000
172.17.0.1 - - [24/Sep/2021:05:10:40 UTC] "GET / HTTP/1.1" 200 5
- -> /
172.17.0.1 - - [24/Sep/2021:05:10:41 UTC] "GET /favicon.ico HTTP/1.1" 200 5
http://localhost:8000/ -> /favicon.ico
```

こんな感じです。

### 指定したコンテナの中でプロセスを実行する方法

指定したコンテナの中でプロセスを実行するためのコマンド`docker exec`を見ていきます。

これは、実行中のdockerコンテナに対して、別のコマンドを実行したいときに役立ちます。

僕自身も実務でよく使いますこれ（よくわからず使ってました :angel:）。

```bash
docker container exec webrick ruby -v

# docker container exec コンテナ名　実際のコマンド

ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
```

今回は、コンテナ（`webrick`）にあるrubyのバージョンを出力しているだけです。

https://docs.docker.jp/engine/reference/commandline/exec.html

実務ではよく以下のコマンドを実行していました。

```bash
docker exec -it {container code} sh
```

`-i`: Keep STDIN open even if not attached

標準入力を開き続けるという意味です。

`-t`: Allocate a pseudo-TTY
疑似ttyを割り当てる。

TTYは、TeleTYpewriter の略。

> tty【コマンド】とは、コンピュータさんに対する命令文（コマンド）のひとつであり、接続端末のデバイスファイル名を表示するときに使うUnix系のコマンド

https://wa3.i-3-i.info/word11668.html

ということは、`-it`は、dockerコンテナ内で標準入力を開き続け、そこを操作出来るようにする。

実行コマンドは`sh`なので、dockerコンテナ内でシェルを起動するという意味なのでしょうね。

```bash
docker container ls

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                       NAMES
dac0475130a1   sample/webrick:latest   "ruby /var/www/main.…"   44 minutes ago   Up 44 minutes   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   webrick
```

なので、以下は同じ結果になりました。

```
docker exec -it dac0475130a1 sh
docker container exec -it dac0475130a1 sh
docker exec -it webrick sh
docker container exec -it webrick sh
```

### 使用していない Docker オブジェクトの削除

dockerに慣れてくるのはいいのですが、そうなると、今度は、使わないイメージとかコンテナが肥大化することがよくあるそうです。

ハードディスクの容量を圧迫してしまいますので、消す方法も覚えます。

そのコマンドが以下です。

```bash
docker system prune -a
```

`-a`は全てのコンテナに対して実行するというやつです。

https://docs.docker.jp/config/pruning.html

実際の結果が以下。

```bash
docker system prune -a

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
dac0475130a1f393026dc81ca6d0ea0207ac1c1268f499c6a77880ec38fc5207

Deleted Images:
untagged: sample/webrick:latest
deleted: sha256:a1136785b9176e2a25e7a3a206745ce19cdd5d6c97ae7f53884f7fa5181428e6
deleted: sha256:d589299c6217c3ba7913e0f3fefddcc091d8dd48aab45f6f666403b2e2b44f11
deleted: sha256:8b98db69df51d82145bc4497b07e4033d3c702d5e0fbb05f185511d07c7161d9
deleted: sha256:4ef38426686a8db4b3a4e91cc80fef26c9ff0806740f90bd98673372a4534676
deleted: sha256:bea8a1d9e6d2ee9e446eeeb648847a6f0b6bb8acf7418f56b1ca8fd96dd1b5f6
deleted: sha256:090b8395b21d6777699d86674baa55fa14a6ef8a29e03dfc3460ad216de6f05f
deleted: sha256:044896171174fe4b8e57958fe9540883daedae0bfc4858023469aaa238bd2388
deleted: sha256:7c8e6d275c16b312f3a9fbd14dac058e0925c3071c61f85c14dd85d070567aa2
deleted: sha256:dde6172a7948c5a7c96cc46703d13946bfd47b726decc1acf48abeda64f32ac4
deleted: sha256:f11c0e4e16dc4cc8c0ffac9ac15db9a7c5091f16a86d53cab55306be2d4891a8
deleted: sha256:799760671c382bd2492346f4c36ee4033cf917400be4354c8b096ecef88df34b

Total reclaimed space: 863.7MB
```

container name `sample/webrick`が消えたことがわかりますね！

ハードディスクから`863.7MB`の容量が空いたこともわかりますね。

これが、使わないイメージ・コンテナの削除の方法です。

以上です。

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103