「Docker/Kubernetes実践コンテナ開発入門 改訂新版」まとめ

# はじめに
- 良書として有名な[Docker/Kubernetes 実践コンテナ開発入門](https://gihyo.jp/book/2018/978-4-297-10033-9)の[改訂新版](https://gihyo.jp/book/2024/978-4-297-14017-5)が発売されたので、購入しました。
- 各章ごとに初版の内容と比較しながら、まとめを書いて行きます。
- なお、購入には[miive](https://miive.jp)という福利厚生サービスを活用しました。

# miiveとは
- miiveとはプリペイド式のクレジットカードで、「食事」または「学び」に使用できるポイントが毎月3,500円分支給されます。
- 私は主に書籍の購入で活用していますが、毎月書籍購入で3,500円分の補助があるのは本当にありがたいです！
- 弊社でのmiive導入については[こちら](https://miive.jp/case-study/yuzuriha)で詳しく紹介しているので、興味のある方は是非ご覧ください。

# 初版との比較
- 初版と比べると、より分厚くなってることがわかります。
- <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627922/e027c103-9b36-c9ec-128f-76e8190b957d.jpeg" width="800" />
- 5年半ぶりの改訂新版ということで、この5年半でのDocker/Kubernetes界隈の技術の進歩が窺えます。

# 1. コンテナとDockerの基礎
- タイトル通り基本中の基本です。
- そもそも「コンテナとは」「Dockerとは」から学ぶにはとても良い内容ですね。
- 「開発環境に限らず本番環境でもコンテナ技術を活用すべき」という話の中では、筆者の方がCyberAgentグループ所属ということもあり、ABEMAが配信した2022年FIFAワールドカップの事例が紹介されています。
- 私自身2022年FIFAワールドカップは深夜に起きて観ていたので、サービスを使う一人のユーザとしてコンテナ技術の有用性を感じることができました。

# 2. コンテナのデプロイ
- コンテナでアプリケーションをデプロイするところまでの流れについて書かれています。
- `docker search`や`docker container run`など具体的なコマンドを使って解説してくれているので、わかりやすいですね。

# 3. 実用的なコンテナの構築とデプロイ
- 2章までは基礎的な内容でしたが、ここからは実際にコンテナを構築したりデプロイしたりする際に起こる事象について解説されています。
- コンテナの粒度についても解説されており、「1コンテナ = 1プロセス」にするべきかは確かに私が所属するチーム内でも議論になったことがあります。
- この問題について、[Dockerの公式ドキュメント](https://docs.docker.com/develop/develop-images/guidelines/#decouple-applications)では「コンテナは1つの関心ごとにだけ集中すべきだ」という見解がなされています。
- ここで言う「1つの関心ごと」とは、「1つの役割(ロール)」や「1つの問題領域(ドメイン)」と言い換えることもできます。
- これらを踏まえて筆者は以下の考え方を示しており、「なるほどな」と思いました。
  - > アプリケーションとコンテナの粒度について考える場合、「それぞれのコンテナが担うべき役割を適切に見定め、かつそれがレプリカとして複製された場合でも副作用なくスタックとして正しく動作できる状態になるか？」という考えにもとづいて設計すると良いわけです。

# 4. 複数コンテナ構成でのアプリケーション構築
- タスク管理アプリのアーキテクチャを例にして、以下6つのコンテナによるWebアプリケーションの構成について解説されています。
  - web
    - nginx-web(Reverse Proxy for Web)
    - web(Web server)
  - api
    - nginx-api(Reverse Proxy for API)
    - api(API server)
  - db
    - migrator(DB migration tool)
    - mysql(MySQL server)
- なお、初版の4章では`Swarm`が扱われていましたが、現在は開発終了しているため改訂新版では`Compose`と`Tilt`が扱われています。
- 次章からは代表的なコンテナオーケストレーションツールである`Kuberbetes`が登場するため、初学者の方にも理解しやすいように、まずは本章で初歩として適している最もシンプルなコンテナオーケストレーションシステムの`Compose`が選ばれています。

# 5. Kubernetes入門
- ここから`Kubernetes`が登場します。
- 入門ということで、「`Kubernetes`とは何か」から図解入りで丁寧に解説してくれています。
- また、コラムでは[`k9s`](https://github.com/derailed/k9s)というツールについても解説されています。
  - `k8s`は`Kubernetes`の略ですが、`k9s`は`Kubernetes`上のリソースを監視・管理するためのCLIツールです。
  - デファクトスタンダードになっているCLIツール`kubctl`よりも操作手順が減って、使いやすいらしいです。

# 6. Kubernetesのデプロイ・クラスタ構築
- 4章の`Compose`上で実行したタスクアプリを、`Kubernetes`でどのように実行して行くのか解説されています。
- 初版では`GKE(Google Kubernetes Engine)`を使って構築していましたが、改訂新版ではローカル`Kubernetes`環境(`Docker Desktop`)に構築しています。
  - これはよりシンプルにわかりやすく解説するためでしょうか
- 最後に、ローカル`Kubernetes`環境では難しい`Ingress`のインターネット上への公開を、`AKS(Azure Kubernetes Service)`を使って行っています。

# 7. Kubernetesの発展的な利用
- `Kubernetes`の一般的なデプロイ以外の用途について、以下の3つが紹介されています。
  - Podのデプロイ戦略
    - `RollingUpdate`
    - `Blue-Green Deployment`
  - 定期的なバッチジョブの実行
    - `CronJob`
  - ユーザ管理と`RBAC(Role-Based Access Control)`

# 8. Kubernetesアプリケーションのパッケージング
- `Kubernetes`リソースの構成管理やパッケージングを補助するためのツールである`Kustomize`と`Helm`について、解説されています。
- 初版では`Helm`のみ扱われていましたが、改訂新版では`Kustomize`も加わっています。
- この2つの使い分け方について、以下のように記載されています。
  - > Kustomizeは、開発環境や本番環境など複数の環境にデプロイする際、必要最小限のマニフェストファイルの管理をするために利用しています。
  - > Helmは、Kustomizより細かいマニフェストファイルの制御が必要な場合に利用します。また、Kubernetesアプリケーションを他のプロジェクトで再利用したり、OSSで公開する用途でも有用です。

# 9. コンテナの運用
- コンテナ運用で欠かせないロギングやログ収集・管理機構の構築について、`Elastic Stack`を通して解説されています。
- `Elastic Stack`とは、Elastic社が提供する`Elasticsearch`・`Kibana`・`Beats`・`Logstash`等で構成されるプロダクト群のことで、様々なソースからデータを取得して検索・分析・可視化することができます。

# 10. 最適なコンテナイメージ作成と運用
- 本書で最も重要な章かと思います。
- 初版では「より軽量なDockerイメージを作る」という章がありましたが、改訂新版では「最適なコンテナイメージ」という内容に書き直されています。
- 以下のような流れで解説されています。
  - まず、`scratch`・`BusyBox`・`Alpine Linux`・`Distroless`といった軽量なベースイメージから、軽量なコンテナイメージを作る方法について
  - 次に、Docker 17.05から導入された`Multi-stage builds`について
  - また、従来のイメージビルダー（`docker image build`コマンド)を拡張した[`BuildKit`](https://github.com/moby/buildkit)について
  - 最後に、`GitHub Actions`を用いたワークフローコンテナのビルドとPushについて

# 11. コンテナにおける継続的デリバリー
- この章は初版には無く、改訂新版で新たに追加された章になります。
- 継続的デリバリー(`Continuos Delivery`)について、`GitOps`を中心に解説されています。
- `GitOps`とは、コンテナアプリケーションのデプロイ方法の王道です。
  - Gitリポジトリを信頼できる唯一の情報源として扱い、マニフェストファイル群を管理します。
- また、以下3つの継続的デリバリーシステムが紹介されています。
  - [Flux](https://github.com/fluxcd/flux2)
  - [Argo CD](https://github.com/argoproj/argo-cd)
  - [PipeCD](https://github.com/pipe-cd/pipecd)

# 12. コンテナのさまざまな活用方法
- 本章では、以下のようなアプリケーションのデプロイ以外のコンテナの活用方法について解説されています
  - チーム開発での開発環境の統一
  - コマンドラインツールでのコンテナの利用
    - コンテナイメージ脆弱性診断ツール[`Trivy`](https://github.com/aquasecurity/trivy)をコンテナで実行する
  - 負荷テストでの利用
    - 負荷テストツールの[`Locust`](https://github.com/locustio/locust)や[`k6`](https://github.com/grafana/k6)について

# 最後に
- 私自身バックエンド領域の業務がメインのため、既に用意された`Dockerfile`や`docker-compose.yml`から自分のローカル開発環境を作ることは多いのですが、一からdocker環境を構築した経験は少ないので、大変勉強になりました。
- 初版も数年前にしっかり読んだはずなのですが、普段から使っていない技術はやはり忘れてしまってますね。
- バックエンド領域の業務がメインでも、Dockerや`Kubernetes`といったコンテナ技術やインフラ領域についての知見があるに越したことは無いので、これからも学んで行きたいですね。