Docker&Kubernetesのきほんのきほん

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/253f5709-98e8-ae47-8afc-d85c35df857b.png">

読書記録
## 読者プロフィール
組込み系エンジニア。
今更だけどDockerってコンテナでしょ、以上の説明はできない。仕事ではビルドシステムにDockerが組み込まれていたようだ。知らんかった…。

## 雑感
入門書としての完成度は高く、Docker？なにそれ？状態の私が読んでもなんとなく理解できた気にさせてくれる。

ただし本書は著者の述べているとおり入門書であるため、内容は基本的なもので、恐らく検索やAIに聞けばわかる程度のものではある。が、それを体系的かつ初学者がわかるように嚙み砕いて説明している点に価値があると言える。ボリュームとしては数日で読める分量であるため、ささっとDockerの概要を掴みコマンドに慣れることができる。気合を入れずとも読めるラフさが良き。

この手の本の宿命として、導入手順を細かく記載しているため内容が陳腐化しやすい点は注意。WSLの導入手順は検索すれば多くのページがヒットするのでそちらを参考に。一応このページにも記載しておく。

# あらすじ
本書は実際にコマンドを入力して動かしながら理解を深めていく形式である。コミカルな図解が特徴的でイメージをつかみやすい内容になっている。ただしイメージを優先しているためあいまいな表現（OSっぽい、等）が多用されるため、本書に書かれている内容と気になって調べた部分（緑枠）を分けて記載する。

# Dockerとは？
Dockerとはデータやプログラムを隔離する仕組みとのこと。前提としてDockerはLinuxで動作するソフトウェアである。Linuxを（１）カーネルと（２）周辺部分に分け、Dockerはカーネルはそのまま使うため、所謂仮想化技術とは異なり高速に動作できる。

:::note info
Linuxの周辺部分って何？
Dockerの実態はLinuxのNamespaceという機能らしい。Namespace自体はかなり古くからあり、DockerはNamespaceによって分離されたプロセスに過ぎないとのこと。つまりLinuxの周辺部分＝Namespaceによって分離隔離されたプロセスで動く、後述するOSっぽいもの（＝OSからカーネルを抜いたもの）といえそう。

https://gihyo.jp/admin/serial/01/linux_containers/0002
https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/2-1-points


Docker初期はLinuxカーネル機能のcgroups とNamespaceを使っていて、Docker0.9以降libcontainerを使うようになった。libcontainerでもnamespace、cgroupsといった機能は使っていて、カーネルに依存していると思われる。

https://ja.wikipedia.org/wiki/Docker
https://kernelnewbies.org/Linux_2_6_29
https://www.docker.com/ja-jp/blog/docker-0-9-introducing-execution-drivers-and-libcontainer/
https://docs.docker.com/reference/glossary/#libcontainer
:::

# イメージとコンテナ
イメージとはコンテナの素となる設計図のようなもの、とのこと。逆にコンテナからイメージを作ることもできるためカスタムイメージを配布することも容易である。

イメージにはOSっぽいものとApacheやMySQLといったソフトウェアが含まれている。そのためこのイメージからコンテナを作ることで、任意のOS上でApacheやMySQLを動作させることができる。OSっぽいものとしてはUbuntu,CentOS,RedHatなどがある。

:::note info
OSっぽいものって何？なぜ「ホストOS」と「OSっぽいもの」は統一しなくてよいのか？
wikipediaによればコンテナ内のOSはホストのカーネルを用いるとのこと。つまり「OSっぽいもの」とはカーネル以外のOSといえそう。統一が不要というのはLinuxカーネルの後方互換性は非常に高く、かつホストOSが最新であれば問題にならないということと思われる。
https://ja.wikipedia.org/wiki/Docker
:::

# 環境構築
### WSL2のセットアップ
少々手間取ったのでメモ。私の環境は以下
>エディション	Windows 11 Home
バージョン	24H2
インストール日	‎2024/‎12/‎23
OS ビルド	26120.2705
エクスペリエンス	Windows 機能エクスペリエンス パック 1000.26100.42.0

Windows機能の有効化で「仮想マシンプラットフォーム」を有効化せよという指示があるが、この項目が見当たらなかった。よくわからない。仕方がないのでそのまま進む。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/6d4e976d-78dd-e969-3daa-72bd22ee2985.png">

Linuxカーネル（wsl_update_x64.msi）をダウンロードするがエラーになる。よくわからない。管理者権限でもダメ。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976844/9a0d8cb5-a032-8dc2-dc17-d65bc3153067.png">

調べていると以下のサイトを見つけた。ここを参考に以下を実施。
https://qiita.com/kekenonono/items/14b725ce3d00cd5281ec

## 結局環境構築としてやったこと
#### 【WSL】Powershellを管理者として開く
WSLと仮想マシンプラットフォームを有効にする
```Powershell:Powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
実行後PCの再起動

#### 【WSL】ディストリビューションのインストール
Microsoft Storeを立ち上げ、検索ウィンドウに「Ubuntu」と入力しインストール

#### 【WSL】WSLのバージョンを確認
ubuntuのVERSIONが2であることを確認した。
```Powershell:Powershell
PS C:\Users\xxx> wsl --list --verbose
  NAME              STATE           VERSION
* Ubuntu            Running         2
```
※WSL2が有効になったのでwsl_update_x64.msiのインストールは不要なはず。ということで非実施。


### 【Docker】Dockerのインストール
ここは特に詰まらなかった。本書の画像と若干UIは異なったが、WSL2で動作していることまで確認できた。
インストール時のバージョンは以下。
> docker version
Client:
 Version:           27.3.1
 API version:       1.47
 Go version:        go1.22.7
 Git commit:        ce12230
 Built:             Fri Sep 20 11:42:27 2024
 OS/Arch:           windows/amd64
 Context:           desktop-linux

>Server: Docker Desktop 4.36.0 (175267)
 Engine:
  Version:          27.3.1
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.22.7
  Git commit:       41ca978
  Built:            Fri Sep 20 11:41:11 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.21
  GitCommit:        472731909fa34bd7bc9c087e4c27943f9835f111
 runc:
  Version:          1.1.13
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# ワーク
実際にDockerコマンドを使ってみるワークが続く。以下のワークを通じてDockerの各種コマンドについて慣れていく。
・Apacheやnginxを使ってHTTPサーバを立てる
・コンテナ内部にバインドマウント（ホストPCの記憶領域をマウントし、コンテナと共有する）し、WEBページ(Apacheのホーム)を書き換える
・MySQL+WordPressを構築する
・RedMineを構築
・コンテナイメージの作成とDocker hubでの公開方法
・Docker Composeによるコンテナ生成の簡略化

# Kubernetes(クーベネティス)
Kubernetesとはコンテナのオーケストレーションツールで、Dockerとは別のソフトウェアである。オーケストレーションツールとは負荷分散のために多数のサーバ上にそれぞれ複数のコンテナが動いているような状況において、コンテナの数など期待値を定義（マニュフェストファイル）することで、何等かの要因でコンテナが停止した場合にマニュフェストファイルに沿うように自動的にコンテナを起動するように管理してくれるツールである。


Kubernetesの用語（Pod、サービス、デプロイメント、レプリカセット）について説明されている。ただしこの説明はイメージを掴むことを重視しており、役割についてはふわっとした理解にとどまる。

簡単なマニュフェストファイルの作成を行い、意図的にコンテナ（Pod）を1つ停止させ、それが自動的に復活することを確認するワークがある。

# あとがき 今後の学習について
本書は入門書の位置づけであるため、今後の学習についての指針が示されている。私の場合は配布されたイメージを使う開発者～コンテナを少し調整する開発者であるため、本書の知識だけでなく コンテナ内でbashを実行する方法、つまりLinuxについて勉強しなさいとのこと。幸いこの辺りは慣れているので本書の内容で事足りたと思う。