Docker/Kubernetes 実践コンテナ開発入門 出版に寄せて

こんにちは、オジュウチョウサンです。既にTwitterでは告知してますが、8/25(土)に技術評論社から「Docker/Kubernetes 実践コンテナ開発入門」を出版します。

執筆の経緯とか、どのように進めていったかについては別のエントリを用意するつもりなので、本エントリでは本書の見どころを紹介しておきたい💪

本書の目的

まず、本書の「はじめに」の一節を抜粋しておきます。本書の目的はこの文に集約されてる。

本書はDockerやKubernetesの基礎力をつけつつ、コンテナに親和性のあるアプリケーションを作るポイントを押さえ、実際に本番環境で利用していく上での定番の手法やノウハウを学びやすいように構成しています。本書を読むことで最新のトレンドのキャッチアップもしやすくなるはずです。筆者は本番環境でこそDockerを利用することに意味があると考えています。本書をきっかけに、開発環境での利用に留まらず、本番環境でコンテナをフル活用した開発に挑戦してみてください。

簡単に一言でまとめると、「おーい磯野ー!早く本番でコンテナ使おうぜー!」となることを目的とした書籍。

DockerやKubernetesを始める上での悩みどころとして、やはり何から手を付けていいかわからないということにあります。しかも、DockerもKubernetesもどんどん新しくなっていき、周辺のエコシステムも次々に登場していく。一瞬で陳腐化する情報が多い中で、効率的に学ぶためのこれといった道が見えにくかったのも事実です。本書は、まさにそのような悩みを持つ人をターゲットに書きました。

Dockerをどちらかと言うとインフラレイヤーの技術と認識している人もいるかもしれませんが、むしろアプリケーションのデプロイに特化した技術なので、フロントエンドからサーバサイド、DevOps、インフラといった幅広い領域がターゲットです。

もちろん本書は全網羅的な書籍ではないため全てを得られるわけではありませんが、この書籍を読むことでコンテナを使った開発・運用の勘所がつかめるようになり、習熟も加速するはずです。

さて、目次情報は既に公開されていますが、この情報だけを判断材料として購入していただくのも心苦しいので、本書がどのような内容になっているか、見どころを章を追いながら簡単に紹介しましょう。

1. Dockerの基礎

Dockerの歴史や基本的な概念、MobyやLinuxKitについて。コンテナを本格的に利用していくことに悩んでいる人もいると思うので、Dockerを利用する意義や本番環境で利用することで得られるメリットについて丁寧に解説したつもり。もし読者が所属する会社で導入の障壁になっているような人がいたら、この章を見せてほしい。

その他、Dockerを使い始める前準備としてDocker for Windows/MacやLinux環境へのインストール等、Docker EEについて。

2. Dockerコンテナのデプロイ

まずDockerコンテナとイメージの基本的な操作から始めているので経験者にとってはまだ退屈かもしれない。ある程度慣れた段階でComposeでの複数コンテナ実行を解説する。ComposeでJenkinsのMaster/Slave構成を構築する上で、コンテナ間の連携や環境変数を使ってアプリケーションの挙動をどう制御するかといった、マルチコンテナ実行の基本を体験する。

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

2章までは非常に単純なコンテナのワークロードを扱っていたが、この章でSwarmでのコンテナオーケストレーションを体験する。今日、コンテナオーケストレーションのデファクトはKubernetesであるが、本書では敢えてSwarmを扱う。もちろん、今はDocker DesktopにKubernetesは組み込まれているし、コンテナ初心者がKubernetesから学習することを否定するつもりはないが、概念的には多くの事を学ぶ必要があり、まだまだ敷居は高い。まずはSwarmでオーケストレーションを体験した方が、Kubernetesの学習もしやすくなるという考えから。

ちなみに、Swarmはローカル環境にdind(Docker in Docker)で複数Dockerを用意する方式で構築している。

4. Swarmによる実践的なアプリケーション構築

ここではそこそこ実践的な構成のWebアプリケーションを構築し、Swarmクラスタ上で実行していく。Kubernetesだけ目当てな人にも読んでもらいたい。コンテナに親和性のあるアプリケーションの作り方や、コンテナの構成の考え方はオーケストレーションツールを問わず重要な要素だと考えている。例えば、レプリケーション構成のMySQLを立てるにはどのようなイメージを構築すべきか。ポータビリティのあるイメージにするにはどうすべきか。アプリケーションの実装に寄り添いながら、コンテナの良さを活かす内容にしている。

扱うドメインはTODOアプリで、APIはGolangで、WebアプリケーションのレンダリングはNode.js(Nuxt.js)で構築する内容となっている。NodeのassetsをどのようにNginxから配信すべきか?等についても解説している。この章を終える頃には、コンテナをフル活用したアプリケーション構築のイメージがついてくるはず。

5. Kubernetes入門

ここでKubernetesが登場する。Kubernetesの基本概念からkubectlでの基本的なリソース(Pod/ReplicaSet/Deployment/Service/Ingress)操作を実際に手を動かして学べる内容になっている。

ローカルでのKubernetes環境はMinikubeではなく、先日StableになったDocker for Win/MacのKubernetes連携を利用する。Kubernetesを利用する際に役立つfreshpod(ローカルでイメージがビルドされたらPodを再起動するツール)や、nginx-ingress-controllerの導入についても解説しているので、ローカル環境でトライアンドエラーしやすいKubernetes環境の整備に役立ててほしい。

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

4章で構築したTODO Webアプリケーションを、今度はGKE(Google Kubernetes Engine)上で構築する。PersistentVolumeやStatefulSetを利用してのMaster/Slave構成のMySQLの構築、WebやAPIのServiceやDeploymentの作成、Ingressでのインターネットへの公開について。GCPには無料クレジットがあるので、GKEの経験が無い読者にも是非試してみてほしい。

また、Kubesprayを利用したオンプレミスでのKubernetes環境の構築についても紹介する(ここは近い将来GKE On-Premに食われるのではないか)。

7. Kubernetesの発展的な利用

JobやCronJob、Secretといったリソースや、RBAC(Role-Based Access Control)の考え方、ServiceAccountを活用した権限制御を適用したアプリケーションの作り方について。

KubernetesのパッケージマネージャであるHelmについて解説する。既存パッケージのインストールはもちろん、独自Chartの作成のポイントや、Chartリポジトリの作り方について。Helmについてそれなりに手厚く触れた最初の書籍かもしれない。Helmベースでアプリケーションのデプロイを十分運用していけるだけの内容にはなっている。

その他に、RollingUpdateの制御やBlueGreen Deploymentの実現方法について。

8. コンテナの運用

7章まではアプリケーションとコンテナをどのように構築するという話がメインだったが、この章は守りに重きを置いている。Elasticsearch+Fluentdを使ったロギングの定番運用パターンや、Stackdriverやsternといったツールについて。

その他に、Dockerホストの運用や、DockerやKubernetesにおいて可用性を保つための障害対策。container-structure-test、AffinityでのPodやHorizontal Pod AutoscalerでのPod配置戦略)等。

9. より軽量なDockerイメージを作る

この章ではいかにDockerイメージを軽量化して運用していくかにフォーカスしている。ScratchやBusybox、Alpine Linuxの特性はもちろん、multi-stage buildsをはじめとする軽量イメージを作るためのノウハウについて。Dockerイメージの軽量化については、この章を見れば十分と言われるように書いた。

とはいえ、muslベースであるAlpineに傾倒しすぎることにネガティブになる意見も当然あるので、「Alpineは神」みたいな論調では書いてない。この件については大きめのコラムを用意しているので、適材適所でイメージを選べるようにしてほしい。最近はdistrolessもある。

10. Dockerの様々な活用方法

開発環境の統一、CLIツールのコンテナでの活用や、シェルスクリプト実行環境としてのコンテナ、例えばLocustでの複数コンテナを使った負荷試験等、コンテナだからこそのTIPSをいくつか。

付録A. セキュリティ

安全なイメージをどのように選択するか、安全なイメージを作るための手法や有用なツールについて。特にOSSでイメージをパブリックに公開する開発者は、この付録を読んで堅牢なイメージ構築に役立ててもらいたい。その他に、アクセス制御やクレデンシャルの扱いといった守りについて。

付録B. Dockerでの開発を支援する ツール・サービス

独自レジストリの構築や、CircleCIでのCI/CDの整備、AWS Fargateを用いたECSでのオーケストレーションについて。AWS Fargateはサーバレスコンテナの注目技術であり、ECSで簡単なサービスを公開する一連の流れを解説する。Kubernetesは既に多く解説しているので、ここではEKSではなくてECSを取り上げた。

付録C. 主要コマンドまとめ

この付録はdockerコマンド一覧や、Dockerfileのインストラクション、helmの頻出コマンドについて紹介している。

といった内容です。

さあ、コンテナを始めよう

業務時間外の1年をかけて執筆した力作です。Amazonでは既に予約販売が始まっています(おかげさまでそこそこ上位にいるようです)。

早いところでは(新宿紀伊国屋さんやジュンク堂書店さんの池袋本店)では、20日過ぎには並ぶ模様です。電子書籍も発売日と同時発売の予定です。Gihyo Digital Publishingはもちろん、Kindle版も提供されます。

ちなみに本書の裏テーマは、「この本を読めばAbemaTVや筆者の担当するFRESH LIVEやでやっていけるようになる」です。Happy Hiring!!