話題の記事

今あらためてコンテナ界隈を俯瞰する「Docker/Kubernetes コンテナ開発入門」

単著ならではの一貫性と、筆者のノウハウをありったけ突っ込んでやろう!というあっつい想いを感じる素晴らしい書籍です。
2024.03.14

「2018年から2024年、コンテナ界隈もいろいろ変わったもんだなぁ…(しみじみ)」

献本いただいた「Docker/Kubernetes 実践コンテナ開発入門 改訂新版」を眺めながら、ハマコーはそんな感慨にふけっておりました。

5年前、Docker始める人はまずこれ!書評「Docker/Kubernetes 実践コンテナ開発入門」で旧版の書評を書いたご縁で、著者の山田さんより改訂新版の献本をいただき、今この場にその本があるというわけです。

改めて中身読んでいたのですが、単著でこれはマジでやばいです。今コンテナを使った開発を進めようとしたときにでてくるであろう、開発〜運用面でのトピックが幅広く凝縮されている本で、「これ一冊読んどけば、マジはずれないよ」というぐらいの力が入った書籍でした。

ここ数年で、Docker/Kubernetesに関する情報は多く出回っている状況ですが、それら情報を網羅的に一冊で俯瞰できる本書は「これこれ、本ってこれだよな」という気持ちになること請け合いの一冊です。

コンテナ、温故知新ってこと…!?
  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

初版と改定新板を比較して眺めてみると、それはそれで発見がいろいろあって面白かったですYO

「Docker/Kubernetes 実践コンテナ開発入門」

話題のコンテナ技術,Docker/Kubernetesの基礎から実際にアプリケーションを作るまでを解説した入門書です。Docker/Kubernetesを実際の現場で活用している著者が最新情報や実践スキルをわかりやすく解説します。

ローカル環境での検証はもちろん,Google Kubernetes Engineへのデプロイなどクラウドでの実践にも触れています。コンテナを中心とした開発スタイル,実践的なCD(継続的デリバリー)入門など現場で本当に必要な知識が身につきます。

Docker/Kubernetesをきちんと本番で使うための王道的な解説を中心としつつ,CLIツールとしてDockerを導入したい,オンプレでKuberentesを使いたいといったニーズにも応える盛りだくさんの一冊です。

こんな方におすすめ
- Docker/Kubernetesといったコンテナ技術で実際にツールやサービスを構築したい方
- コンテナの基礎から実践まで一通り学びたい方
- コンテナの基礎はわかって実際に動かすところを体験したい方
- コンテナ中心の現代的なソフトウェアデリバリーに興味のある人

Docker/Kubernetes実践コンテナ開発入門 改訂新版:書籍案内|技術評論社

著者は山田明憲(やまだあきのり)さん

自分は、この狂気のイベントで直接お会いしたのをめっちゃよく覚えています。懐かしいなコレ…

目次

  • 1 コンテナとDockerの基礎
  • 2 コンテナのデプロイ
  • 3 実用的なコンテナの構築とデプロイ
  • 4 複数コンテナ構成でのアプリケーション構築
  • 5 Kubernetes入門
  • 6 Kubernetesのデプロイ・クラスタ構築
  • 7 Kubernetesの発展的な利用
  • 8 Kubernetesアプリケーションのパッケージング
  • 9 コンテナの運用
  • 10 最適なコンテナイメージ作成と運用
  • 11 コンテナにおける継続的デリバリー
  • 12 コンテナのさまざまな活用方法
  • App.A 開発ツールのセットアップ
  • App.B さまざまなコンテナオーケストレーション環境
  • App.C コンテナ開発・運用のTips

2018年出版の初版にはSwarmなども紹介されていたのですが、今回の改訂新版ではそのあたりばっさりなくなっていたりして、現代の技術スタックに寄せて大幅に目次や内容が更新されています。

以下、自分の琴線に触れたところを中心に紹介していきます。

1 コンテナとDockerの基礎

なにはなくとも基礎から。ホストOS型仮想化とコンテナ型仮想化の違い、コンテナのユースケース、コンテナの苦手な部分などが記載されていて、さらに、簡易的なDockerfileを書きながら、実際にコンテナを起動する内容、Docker Desktopのセットアップなど、はじめに頭に入れておくべき内容が記載されています。

今回読んでいて良いなと思ったのが、コラムの多さ。第一章だけでこれだけのコラムがあるんですが、どれも本文の内容とは別軸でコンテナ界隈の情報を得ることができるので読んでて楽しいです。

  • コンテナの苦手な部分
  • Mobyプロジェクト
  • クラウドのIaCとImmutable Infrastructure
  • コンテナ技術とサーバーレスプラットフォーム
  • ARMアーキテクチャ
  • Linux環境へのインストール
  • Dockerのサブスクリプションプラン

本書、全編コラムが多めです。おそらく著者の山田さん的に「あれも、これも伝えたいんだよ!」という想いがこのコラムの多さにつながっているんじゃないかなぁと想像しながら読んでました。

2 コンテナのデプロイ

この章では、もう少し具体的にDockerを利用してイメージの作り方から実際にコンテナを動かすまでの作法全般が解説されます。網羅的なコマンドの解説というよりは、作る所作の流れの中でよく出てくるユースケースやひっかかりポイントが記述されているので、初めて触るって方には非常に有用なGetting Startじゃないでしょうか。

「ENTRYPOINTでコマンドの実行の仕方を工夫する」ってコラムがあったり、すごい親切。

Docker HubやGitHub Container Registry(GHCR)へのログインからイメージのプッシュも解説されているので、ここを一通り流しておけば、各パブリッククラウドのコンテナレジストリも自然と利用できます。

Docker Composeの詳細解説もあり

複数コンテナを協調して動作させ運用するときDocker Composeは無くてはならない存在ですが、そのあたりも網羅されています。この章を一通り通すことで、基本的なコンテナ開発におけるライフサイクル全般を学ぶことができます。実際のコマンド例が豊富で丁寧なので、ハンズオン的に流すことができるのがありがたい。

3 実用的なコンテナの構築とデプロイ

1章〜2章は基礎的な内容がメインですが、この章あたりから一気に面白くなってきます。「実用的な〜」という記載があるとおり、実際にアプリケーションをコンテナで運用するときによく目の辺りにする事象について、詳細に解説されています。

  • アプリケーションとコンテナの粒度
    • 1つのコンテナに何をどこまで含ませるのか
    • 1コンテナ=1プロセスで本当に良いの?
  • コンテナのポータビリティ
    • ポータビリティには例外もあるよ
    • ライブラリのリンク方式による可搬性の違いとその解決方法
  • コンテナフレンドリーなアプリケーション
    • 設定情報のうち、何をコンテナに含めて、何を外から注入できるようにするべきか
    • 外からの注入方法にどんなやりかたがあるか
  • 秘匿情報をどのように扱うべきか
  • 永続化データの扱い方

よくこのあたりは、The Twelve-Factor App (日本語訳)のコンテナでの実装方法として記載される場合も多い気がするのですが、本書ではそのようなアプローチではなく、コンテナアプリケーションの実用的な開発〜運用という文脈で、「あ〜〜これは、あるよね、うんうん」という納得感とともに読み進めることができました。

4 複数コンテナ構成でのアプリケーション構築

3章までの知識を活かして、コンテナでWebアプリケーションを構築します。全部で6つのコンテナ(リバースプロキシやDBコンテナもあり)が協調動作しつつ、一つのWebアプリケーションを構成しているので、データベースの運用やこれらコンテナを扱うためのリポジトリ構造など、実際のアプリ運用に近い目線での情報が役に立ちます。

各コンテナの構成はこんな感じ。

Docker Composeベースで、各コンテナのコード含めて全てサンプルコードがダウンロード可能で、かつ動作させるための解説もめっちゃ充実しているので、より実用的なノウハウがあるのが最高に良いですね。

自分は、普段の仕事からしてAWS脳なので、ロードバランサやDBはマネージドサービスを使う前提で考える癖があるのですが、改めてコンテナだけで組む場合にどのような構成になるのか、含まれるコードがどうなるのか、あたりを改めて知ることができて凄い参考になりました。

コラムの「PolyrepoとMonorepo」も、「あ〜〜〜、そうだよねぇ、、、そうなんだよぅ!」と頷ける内容になっていて、学びが深かったです。余談ですが、自分の観測範囲ではIaCやフロントエンド、サーバーサイド含めてモノレポの案件が多い傾向にあるなと感じてます。

この章、かなりページ数が多いのですが、5章の注釈にある山田さんのこの注釈が良い。

本書ではコンテナオーケストレーションのとっかかりとしてComposeを扱いました。<中略>コンテナを使った開発のイロハを学ぶための入口としては最適です。Kuernetesはかなり便利ですが、現状、コンテナの初学者には 多少ハードルも高い面も否めませんし、最初にコンテナの基礎技術を段階的にに経験しておいた方が結果的にKubernetesの理解も早くなると考えたからです。

とのことなので、特に初学者の方はこの後の理解が明らかにかわってくるので、じっくり取組むのが良いかと思います。

5 Kubernetes入門

いよいよ、みんな大好きKubernetesが始まります。Docker Desktopを利用してローカル環境で動作させることができるので、そのあたりは昔に比べてお手軽になってますね。その前提で、Kubernetesの基本的なコンポーネントを動かす章となっています。

初学者には、ここで新しい単語が山のようにでてくるので敷居が高いのですが、図が非常に丁寧に記載されているので、ゆっくり読めば自然と各単語の概念が頭に入ってくると思います。

コラムも変わらず充実しています。k9sとか、初めて聞きました。

derailed/k9s: 🐶 Kubernetes CLI To Manage Your Clusters In Style!

この章で、Kubernetesに出てくる主要なコンポーネントはほぼほぼ全て網羅されているので、Kubernetesを初めて触ってみよう!という方は、この章を実際に手を動かしながら体験することを強く強くオススメします。

6 Kubernetesのデプロイ・クラスタ構築

タスクアプリの構築を体験しつつ、より実践的なKubernetes上での構築ノウハウを得ることができる章。構成はこんな感じ。

「構成でかいな!」と一瞬引くかもですが、それぞれの役割を頭に入れておければ、存外シンプルに感じられるかと思います。このタスクアプリの構築を通して、コンポーネント間の通信、シークレットの扱い、静的ファイルのボリュームの利用などを学習可能です。

7 Kubernetesの発展的な利用

Kubernetesは一般的なWebアプリケーションのデプロイにももちろん使えますが、それ以外の用途でも様々使えます。

  • Podのデプロイ戦略
  • 定期的なバッチジョブの実行
  • ユーザー管理とRole-Based Access Control(RBAC)

など、実際の運用で頻出する事項の解説も詳細にあります。RBACあたりは、実際に複数人でクラスターを運用したり複数アプリケーションをデプロイするときに必ず抑えておくべき事項なので、ここでしっかり理解しておくのが良いでしょう。

8 Kubernetesアプリケーションのパッケージング

Kustomize、Helmといったパッケージング手法の解説です。Kubernetes上でデプロイされるコンポーネントやこれらパッケージングツールで提供されているものが非常に多いです。既存のものをデプロイするだけであればコマンドを流すだけで簡単ですが、自前のツールやミドルウェアをパッケージングするには、このあたりの概念の学習は必須になります。

ここも、すごく丁寧に概念の解説から、実際に手を動かしてパッケージングしていく流れが記載されていてほんとこの本読むだけで原則理解できるので、最初のとっかかりにまじでオススメです。あんまりこういう実践的なパッケージングの情報って無い気がするんですよね、ありがたい。

9 コンテナの運用

コンテナ運用に無くてはならない、ログ運用、Kubernetesの運用(耐障害性、オートスケール戦略)の話です。特にログ運用に関しては、マネージドサービスを使うにせよ何にせよ、運用において確実に必要になる事項(だけれど後回しにされがち)なので、ここでしっかり原則を抑えておくことをオススメします。

Kubernetesの運用における、Node障害対応や、Podの配置戦略、PodとNodeのオートスケールなど、運用に不可欠な事項が含まれているので、じっくり読みましょう。

10 最適なコンテナイメージ作成と運用

自分が一番好きな章です。いやぁ、この章良いですね。コンテナをどんな環境で動かすにせよ必ず意識しておく必要がある普遍的なノウハウが詰まっています。

どんなベースイメージを利用して、タグ戦略を考えて、レイヤー構造を意識し、イメージサイズを最適化しながら、可読性が高いDockerfileを書く方法が、事細かに解説されています。加えてMulti-stage buildsの考え方や、そのためのBuildKitによるビルドセスの高速化、分散イメージビルドの方法、さらに最近必ず出てくるマルチプラットフォーム対応の話も出てきます。

最近はAWSもコンテナ実行環境のFargateがGravitonプロセッサに対応するなど、コンテナをx86_64アーキテクチャではないARMベースのアーキテクチャで動作させることが徐々に増えつつあります。そんなマルチプラットフォーム対応のコンテナイメージをビルドするための方法もBuildKitの具体的な使い方と合わせて紹介されています。

また、GitHub Actionsによるコンテナイメージの自動ビルドや、そのビルドプロセスにおけるTrivyを使ったセキュリティチェックなど、網羅的に紹介されていて、ホントこの章全部重要でどんな運用環境でも網羅しておくべき内容が入ってて、これを本という媒体で読むことができるのは、マジでありがたいです。

11 コンテナにおける継続的デリバリー

GitOpsを中心としたコンテナデリバリー(CD)全般の解説です。ここでは、主に以下3つのOSSが紹介されています。

この中でもPipeCDは異色で、著者の山田さんが所属しているサイバーエージェントの部署で開発され、CNDFのSandboxプロジェクトに認定されています。

一番の特徴は、Kubernetesだけではなく、パブリッククラウドの各種マネージドサービスである、Google Cloud Run, Amazon ECS, AWS Lambda, Terraformなどにも対応している点。というか、今この文章書いてて知りました。Terraformまで対応してるのか!

どのツールもメジャーであり、さらにGitOpsを前提としたものになっているので、現在のコンテナデリバリーのメインの潮流を3つのツールを比較しつつ把握可能なお得な章です。

12 コンテナのさまざまな活用方法

本編最後となるこの章もめちゃ参考になります。アプリケーションのデプロイ手段だけではない、コンテナの様々な活用方法が紹介されていて、日頃の業務に取り入れてみるヒントになる人も多いんじゃないでしょうか。

  • チーム内での開発環境の統一と共有
    • 開発でよく使うツール郡をコンテナにパッケージングして、共有利用
  • コマンドラインツールのコンテナでの利用
    • Trivyのコンテナ実行
    • シェルスクリプトのコンテナ実行
  • 負荷テストでのコンテナ利用
    • Locustやk6の紹介

チームによるアプリケーションの開発ライフサイクルにおいては、よく使うツールなどをコンテナ化しておくことは様々なメリットがあります。それらの使い方のヒントとなる具体的な例が紹介されているので、ここから刺激を受けて「そういや、うちのアレもコンテナ化したら便利やん」という発見がでてくると良いですね。

Appendix

Appendixといえど、ここもめっちゃ充実してます。

  • App.A 開発ツールのセットアップ
  • App.B さまざまなコンテナオーケストレーション環境
  • App.C コンテナ開発・運用のTips

個人的には、最後の「コンテナ開発・運用のTips」が面白い。コンテナランタイムの話や、Kubernetes、コンテナ開発、デプロイのTips、生成AIを利用したコンテナ開発の効率化など、筆者が伝えたかったノウハウが最後の最後まで記載されていて、「全部知ってることは伝えたい!」という気持ちが伝わってきました。

コンテナに骨の髄まで浸かりきった著者による一冊

おそらく、コンテナに関わっているほぼすべての人に、何かしら参考になる書籍かと。

一人でここまでの分量の書籍を執筆し、さらに移り変わりが激しいこの分野でこれだけの鮮度をもって出版するのは、本当に本当にハードだったと思います。マジで想像がつかない。尊敬します。自分は以前共著で本書いたことはあるのですが、それでも十分に疲弊したんですよね。

単著ならではだと思うのですが、書籍全体を通しての文体やテイストやこだわりが一貫していて、コンテナを利用したアプリケーション開発にどっぷり浸かり日々奮闘してきたであろう(勝手な想像です)ノウハウが、これでもかというぐらい詰め込まれているので、読んでて参考になるとともにそういう背景が見えてきて、勝手になんだか楽しい気持ちになっていました。

部分部分の技術要素の詳細については、それぞれ気になったところを各自が深堀りしていけば良いと思うのですが、コンテナ界隈全般を通して、その技術やノウハウを俯瞰して見ることができる貴重な本です。これからコンテナ始めようって方にも、ある程度経験はあるけれど改めて全体を俯瞰してみたいって方にも、どちらにも有用な本だと思うので、気になる方は是非手に取っていただくことをオススメします。

末筆になりますが、す(@stormcat24)さん / X、単著でこれだけの分量の書籍執筆、本当にお疲れさまでした。楽しく読ませていただきました。この場を借りて感謝いたします。

それでは、今日はこのへんで。濱田孝治(ハマコー)(@hamako9999)でした。