Docker を学んでみる - 001 -

# もくじ
[Docker ってなぁに？](#docker-ってなぁに)
[Docker の基本](#docker-の基本)
[コンテナの操作](#コンテナの操作)
[おわりに](#おわりに)

# 使用する環境
- Apple M1 Pro
- macOS Sequoia 15.0
- Rancher Desktop

# 使用書籍
- 開発系エンジニアのための Docker 絵とき入門
  第１章 〜 第６章

# Docker ってなぁに？
### コンテナ型仮想化ソフトウェアのひとつ
- ホスト OS にインストールして、コンテナという単位でアプリケーションを管理する
- １つのコンテナで１つのアプリケーションを扱う
- コンテナにゲスト OS は含まれないが、あるように見える
- コンテナは Linux カーネルをホストマシンに借りるため、Linux 仮想マシンが必要

### Docker を構成するもの
- Docker
- Docker Engine
  - デーモン(常駐プロセス)
  - デーモンが提供する API
  - デーモンが提供する CLI クライアント
- Docker Compose
  - Docker コンテナを一括で操作するためのツール
- Docker Desktop
  - Docker を扱うための GUI アプリケーション
- Docker Hub
  - クラウド上のレジストリサービス
  - イメージ(コンテナの雛形)が公開されている

# Docker の基本
### コンテナ ってなぁに？
- コマンドを実行するための領域
- コンテナはイメージから作られる
- 個々のコンテナは互いに独立している
- コンテナはコンテナランタイムがあればどこでも動く

### イメージ ってなぁに？
- コンテナの実行に必要なパッケージ
- イメージを共有すれば複数人で同じ開発環境を構築できる

### Dockerfile ってなぁに？
- 独自のイメージを作るための設定ファイル

# コンテナの操作
事前に Rancher Desktop を起動します

## コンテナを起動する
`hello-world` というイメージを使ってコンテナを起動してみる
```shell
docker container run hello-world
```

そうすると以下のようなメッセージが表示された
ここでは `Hello from Docker!` という表示が出れば OK！

```shell
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
478afc919002: Pull complete 
Digest: sha256:91fb4b041da273d5a3273b6d587d62d518300a6ad268b28628f74997b93171b2
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

色々書いてあるが `Hello from Docker!` を表示するために Docker が何をやったかがうんたらかんたら書いてある。

Ubuntu container を起動するコマンドが親切？に書いてある。

```shell
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
```

`docker run` コマンドは旧コマンドらしい。
現在のコマンドで実行してみる。(挙動は一緒だけど・・・)

```shell
docker container run -it ubuntu bash
```

コマンドを実行すると、ubuntu のイメージを使ったコンテナが起動し、操作待ちの状態になる。

```shell
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
6e59cb05818e: Pull complete 
Digest: sha256:dfc10878be8d8fc9c61cbff33166cb1d1fe44391539243703c72766894fa834a
Status: Downloaded newer image for ubuntu:latest
root@1a36f23dc916:/# 
```

試しに現在のシェルが何か聞いてみる

```shell
echo $SHELL
```

```shell
/bin/bash
```

よかった。bash。想定通り！

OS 情報が記載されてるファイルものぞいてみる。

```shell
head -n 4 /etc/os-release
```

```shell
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
```

Ubuntu の 24.04 が動いていることがわかる。
すごい。mac から Ubuntu 使えてる〜。

## コンテナ一覧を確認する
もうひとつターミナルを立ち上げて
`ls` コマンドで起動中のコンテナ一覧を確認してみる

```shell
docker container ls
```
```shell
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
1a36f23dc916   ubuntu    "bash"    About a minute ago   Up About a minute             modest_clarke
```

直前まで使っていた ubuntu コンテナが起動中になっていることがわかる。(STATUS が Up になっている)

すべてのコンテナ一覧で起動中以外のコンテナも確認してみる。

```shell
docker container ls --all
```
```shell
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                   PORTS     NAMES
1a36f23dc916   ubuntu        "bash"     About a minute ago   Up About a minute                  modest_clarke
15ff47cecae1   hello-world   "/hello"   5 hours ago          Exited (0) 5 hours ago             sweet_carver
```

最初に作った hello-world コンテナは、メッセージを出力したあとそのまま終了してしまうので、`--all` をつけることで一覧で確認できる。(STATUS が Exited は停止済のコンテナ)

## 起動中のコンテナを停止する
停止したい コンテナ ID を控えておく。(コンテナ一覧を確認したときに表示される)
今回は先ほど起動した Ubuntu コンテナを停止する。

```shell
docker container stop 1a36f23dc916
```
```shell
1a36f23dc916
```

コンテナが停止されると、停止したコンテナの ID が返ってくる
もう一度すべてのコンテナを表示させてみると、Ubuntu コンテナも停止済になっていることがわかる。

```shell
docker container ls --all
```
```shell
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                        PORTS     NAMES
1a36f23dc916   ubuntu        "bash"     7 minutes ago   Exited (137) 15 seconds ago             modest_clarke
15ff47cecae1   hello-world   "/hello"   5 hours ago     Exited (0) 5 hours ago                  sweet_carver
```

## コンテナを削除する
### 停止済みのコンテナを削除する
`rm` コマンドを使い、コンテナ ID もしくは コンテナ名で削除できる。
Ubuntu コンテナを、コンテナ ID で
hello-world コンテナを、コンテナ名で削除してみる。

```shell
docker container rm 1a36f23dc916 sweet_carver
```
```shell
1a36f23dc916
sweet_carver
```

削除できているか確認してみる

```shell
docker container ls --all
```
```shell
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

コンテナが表示されないため、削除されていることがわかる。


#### コンテナを削除するコマンド①
コンテナを起動するコマンドに `--rm` オプションコマンドを付与する

コンテナはイメージがあれば起動できるので、起動時にコンテナを停止したらついでに削除してねってオプションコマンド `--rm` をつけて起動するのもよいかも。

Ubuntu コンテナを起動する

```shell
docker container run -it --rm ubuntu bash
```

別ターミナルで Ubuntu コンテナが起動されていることを確認する

```shell
docker container ls
```
```shell
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
ccefa9487efd   ubuntu    "bash"    6 seconds ago   Up 5 seconds             serene_haslett
```

Ubuntu コンテナを起動しているターミナルに戻って、コマンドの待ち受け状態を抜ける

```shell
exit
```

すべてのコンテナ一覧を確認する

```shell
docker container ls --all
```

```shell
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

コンテナの終了と同時にコンテナが削除されていることがわかる。

#### コンテナを削除するコマンド②
起動中のコンテナを強制削除する `--force`

Ubuntu コンテナを起動する

```shell
docker container run -it ubuntu bash
```

別ターミナルで Ubuntu コンテナが起動されていることを確認する

```shell
docker container ls
```
```shell
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
dcc20ef5c99c   ubuntu    "bash"    8 seconds ago   Up 7 seconds             cool_galois
```

起動中のコンテナを停止＆削除する

```shell
docker container rm --force dcc20ef5c99c
```
```shell
dcc20ef5c99c
```

すべてのコンテナ一覧を確認する

```shell
docker container ls --all
```

```shell
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

コンテナを途中で強制終了させたい場合は、`--force` を使うが、場合によってはデータの損失や整合性に注意が必要になってくると思うので、慎重に使用したい。
`--rm` はコンテナが終了すると自動的に削除されるので、ディスク領域のムダ遣いを防げる〜☆
おすすめは `--rm` かな。

# おわりに
今回はコンテナを起動して停止するところまでやってみました。
ちょっとだけ Docker が怖くなくなりました(笑)
この本、私にとっては分かりやすくて今のところ好きです〜！
くじけず最後までやってみようと思う。