Docker始める人はまずこれ!書評「Docker/Kubernetes 実践コンテナ開発入門」
「最近、Dockerむっちゃ流行ってんなぁ。やっぱりやってみるべきやんな。なにから始めてみよ…」
いまやすっかり定着した感があるDocker。プロダクション環境での事例も珍しくなくなり、その取り回しのやりやすさ、CI/CDパイプラインの構築のやりやすさ、DevOpsとの親和性など、従来のインフラ構築、アプリケーション開発の全てをひっくり返すような、どえらいテクノロジーであることは間違いありません。
Dockerは単なる軽量VMではありません。Dockerの導入は、インフラの構築からアプリケーションの開発〜運用の全てのライフサイクルに対して影響があるため、それらの背景を理解せずに無理やり導入すると「余計めんどくさくなったけど、これなんか意味あんの?」という結果になりがちです。
そんな考慮事項が半端なく多いDockerですが、その誕生の背景や周辺知識、使い所を理解するのに非常にオススメなのが、今回紹介する書籍「Docker/Kubernetes 実践コンテナ開発入門」。テンション挙げて紹介していきます。
__ (祭) ∧ ∧ Y ( ゚Д゚) Φ[_ソ__y_l〉 Dockerハジメルデ ダワッショイ |_|_| し'´J
「Docker/Kubernetes 実践コンテナ開発入門」
著者
株式会社サイバーエージェント 山田 明憲さん(???????????BOL D'OR(@stormcat24))
目次
- Dockerの基礎
- Dockerコンテナのデプロイ
- 実用的なコンテナの構築とデプロイ
- Swarmによる実践的なアプリケーション構築
- Kubernetes入門
- Kubernetesのデプロイ・クラスタ構築
- Kubernetesの発展的な利用
- コンテナの運用
- より軽量なDockerイメージを作る
- Dockerの様々な活用方法
- Appendix-A セキュリティ
- Appendix-B Dockerでの開発を支援するツール・サービス
- Appendix-C 主要コマンドまとめ
以下、自分の琴線にふれたところを中心に内容を紹介していきます。
(重要)「1. Dockerの基礎」
のっけから超重要です。この章では、実際にDockerの実行環境の紹介とクライアント環境へのインストール方式などが紹介されていますが、それ以上に重要なのが、Dockerの利用方法についての解説部分です。
自分、一番最初にDocker触れたとき、Dockerを従来の仮想マシン(VirtualBoxやVagrant)の延長で捉えていたため、その使い方に戸惑いました。一度起動した後、コンテナとローカルマシンのディレクトリをマウントしながら使おうとしたんですが、なんかこの使い方微妙なんですよね。正直めんどくさいったらありゃしない。
Dockerが存在する意味、Dockerはどうやって使うべきなのか、Dockerが苦手としている領域などをきちんと最初から説明してくれているのが、この1章の「1.1 Dockerとは」と「1.2 Dockerを利用する意義」です。
「これからDockerを現場に導入しよう!」というときに、このあたりDockerの得手不得手をきちんと理解しておかないと、「なんのためのDocker導入やねん。わけわからんわ」という気持ちになってしまいがちなので、ここはじっくりきっちり一字一句読み込んでおくことを強くオススメしておきます。
また、ある程度Dockerを使い込んでいる人が読んでも、あらためてその技術仕様の背景を整理することができるので、新たな発見があるかと思います。
「2. Dockerコンテナのデプロイ」
Dockerを扱う上での基礎中の基礎。Dockerfileの書き方からイメージやコンテナの扱い方を学びます。Dockerを扱う上で何をするにも必要な部分なので、しっかり手を動かしながらこれらコマンドを身体になじませておきましょう。
サンプルとして提示されているGoによる簡単なWebサーバ実装も、実際のイメージに近くて良ござんすです。
(超重要)「3. Dockerコンテナのデプロイ」
この章で一番重要なのが、「アプリケーションとコンテナの粒度」について、腹落ちさせておくことです。デプロイやスケールアウトを意識した場合に、アプリケーションの各要素をどのように分離するべきか、もしくは分離しないかについての指針が記載されています。また、コンテナの挙動の設定について、なぜ設定ファイルではなく環境変数を利用することが推奨されているかも大事な点ですね。さらに、ビルドしたバイナリをコンテナに同梱するときに陥りがちなライブラリのリンクの違いによる問題や、ポータビリティの限界、Dockerフレンドリーなアプリケーションの定義と、その構築方法についての記載があります。
この章は非常に重要です。なぜなら、実際Dockerを使いこなすときに大切なのは、細かいコマンドの使い方を習得することではなく、Dockerを本番環境までデプロイして活用していくために必要なお作法をしっかり把握することだからです。
そういった考え方って、Dockerコマンドを都度ググりながら一つずつ身につけていっても、なかなか理解できなかったりするんですが、この書籍の最も凄いところは、一貫してDockerのあるべき使い方を繰り返し読者に伝えてくれている点だと思います。
「4. Swarmによる実践的なアプリケーション構築」
この章では、コンテナオーケストレーションツールのSwarmを利用したWebアプリケーションの構築が解説されています。
コンテナオーケストレーションツールとして、Swarmは現在主流のものではないため、はやくKubernetesが触りたくてウズウズしているひとは、ここは概要を把握しつつ、コンテナオーケストレーションツールの役割について把握するのを目的としても良いかもしれません。
「5. Kubernetes入門 〜 7. Kubernetesの発展的な利用」
コンテナオーケストレーションツールとして、いまや完全にデファクトスタンダードとなったKubernetesをその入門から応用までを順に学ぶことができます。実行環境として、ローカル環境と合わせてGKE(Google Kubernetes Engine)のセットアップからチュートリアル形式で手を動かして学ぶことができるので、学習コストがアホみたいに高いKubernetesの入門としては、非常に有用な章です。
Kubernetesを学ぶには、別途書評を書かせていただいた「Kubernetes完全ガイド」(書評「Kubernetes完全ガイド」Kubernetesを学ぶ全ての人にオススメしたい)も非常に有用な本ですが、記述が一段深くある程度以上のDockerやインフラについての前提知識が必要となる本なので、Dockerを初めて学んだ後にKubernetesを触ってまずは感触をつかみたいという方には、本書をおすすめいたします。
「8. コンテナの運用」
本番環境でコンテナを運用していくにあたって必須となる下記3要素についての解説があります。
- ロギングの運用
- Dockerホストやデーモンの運用
- 障害対策
とくに、ロギングの章では、ロギングプラットフォームとしてデファクトのFluentdとElasticsearchによるログ収集・検索機構の構築がめっちゃ役に立ちます。
「9. より軽量なDockerイメージを作る」
コンテナイメージの軽量化は、コンテナを運用していく上で様々な面で大きなメリットがあります。「2. Dockerコンテナのデプロイ」の章でDockerfileの書き方が紹介されていましたが、それをもっと詳細に実践的に解説した章となっています。
- 軽量なイメージを使うことのメリット
- 代表的なベースイメージの紹介
- 軽量Dockerイメージの作り方
- レイヤー構造の意識の仕方
- マルチステージビルドの利用
Dockerfileの書き方〜Dockerビルドは、実は非常に奥が深くイメージの軽量化だけでなく、そのビルド速度の高速化もノウハウが山のようにある分野となっていて、コンテナを本格的に運用していく上では、このあたりの知識も欠かせません。
まずは最初に意識しておくべき点が簡潔にまとまっているので、Dockerをつかって本格的にアプリケーションを運用しようとしている人は、是非一読をおすすめします。
Docker Buildのもっとマニアックな世界に足を踏み込みたければ、このミートアップが非常に参考になるかと思います。著者の山田さんも登壇されています。
「10. Dockerの様々な活用方法」
ここまで紹介されていなかったDockerのさらなる活用方法について記載があります。
- 開発環境の統一
- CLIツールとしてのDockerの利用
- 負荷テストツールとしてのDockerの利用
一番おもしろかったのは、やっぱりCLIツールとしてのDockerの利用ですね。Dockerのポータビリティを活かして、jqやシェルスクリプトで記載されたCLIツールをDockerコンテナにまとめる手法は、最初に自前でなにかのコンテナを作る時の最高の教材だと、個人的には思います。
そうすることで、アプリケーションの実行に特化したDockerという使い方を自然と体得できます。利用するツールのバージョンの違いを、コンテナのタグの違いによって表現する手法は、実運用を考えても非常に参考になるんじゃないでしょうか。
特にこの章のコラム「DockerはVagratの代替となるか?」は必見。既存Vagrantを全てDockerに無理やり移行して切ない思いになる前に、読んでおくことをおすすめします。筆者の経験に基づいた、DockerとVagrantの使い分けガイドが役立ちます。
Appendix
ここでは、セキュリティに関する情報が目を引きます。ファイル追加のリスクや、適切なアクセス制御、クレデンシャルの扱い、合わせてそれらを制御、検証してくれるツールなどの紹介があります。
また、最後のまとめとして、主要コマンドの一覧があるので、リファレンスとしても使えます。Dockerfileのコマンドはなにげによく忘れるので見てます。後はHelmの扱いも多くなっているので、Kubernetes扱う方は、ここらへんも有用なんじゃないでしょうか。
「Dockerの基礎から流れに沿ってその活用方法を学ぶことができる良書。Dockerをこれから始める全ての人にオススメ」
この本に対して、Dockerコマンド周辺の詳細リファレンスを求めるのは間違っています。もちろんコマンドの一覧なども充実していますが、それよりはDockerが産まれた背景や適応領域をしっかり捉えることをどこまでも意識した本なので、そのあたりを味わって読むべき本ですね。リファレンスなんて、都度公式ページをググればそれで足ります。
チュートリアル的に学ぶことができる本なのですが、コマンドを追うことにとらわれず、途中挟まれるコラムなどを通して、そのあたりの「Dockerを扱う上での文化」を、身体になじませることを意識するのが良いんじゃないでしょうか。各コラムむっちゃええこと書いてあるので、是非じっくり味わって読んでみてください。
全体、最初から最後までストーリーがしっかりしていて単著ならではのまとまりが感じられます。単著でこの分量、ほんま山田さんには頭があがりません。技術を学ぶ手段として、動画やWebのチュートリアルなどいろいろありますが、書籍としてのフォーマットを最大限に活かした内容になっていると思います。
Docker始めるのに遅いなんてことは一切ありません。まずは最初の学習のお供に、「Docker/Kubernetes 実践コンテナ開発入門」いかがでしょうか。
それでは、今日はこのへんで。濱田(@hamako9999)でした。
おまけ
山田さんの執筆手記。やっぱり単著でこれだけ仕上げるのは尋常なことではないことを実感できます。