ここ 1 年以内(2020 年 12 月)に発売されたコンテナ本、かつ要素技術についても触れられているということで、kindle 版を購入してみました。
この本は概要にもあるように「コンテナを動作原理から理解したい人」向けの本でした。イメージでいうと この web 連載 と雰囲気が似ていると思います。この連載をパラパラと読んでみて、自分に合ってそうなら購入を検討されるとよいと思います。コンテナの素晴らしさが強調されているわけでなく、実践的なテクニックが紹介されているわけでなく、純粋な技術入門書といった印象です。なので、他のところでなんとなくコンテナを触ってみて、その面白さがなんとなく分かってきたタイミングでこの本を読むようにすると、実はこういう要素技術を使って実現されていたのか~、という気付きを得られるかもしれません。また、ある程度は簡単なシェルスクリプトは読めたほうがよいかもしれません。
以下、各章でどんな学びがあったかまとめています。
1.コンテナ技術の概要
この章では、コンテナそのものの概要と特徴、そして Docker と Kubernetes について簡単に紹介されています。
コンテナって何?という説明の初手で、コンテナ内で ps
コマンドを実行してどう見えるかについてサンプルが示されていて、「あ、こういう感じの本ね!」ということを予感させてくれます。また、必ず扱われる仮想マシンとコンテナとの比較については、特段それほど深く掘り下げはしないものの、KVM やら namespace やらのワードをしっかり出していて、技術寄りの本だなという匂いがします。
このあたりまでは Amazon で試し読みできる範囲なので、それで雰囲気を見て自分に合ってそうなら購入を検討するとよいと思います。以降、ずっとこんな感じが続きます。
2.Docker の概要
この章では、Docker についての概要と要素技術について深堀りしていきます。
この章の前半(2.1 節)は、Docker CLI の各コマンド(build, run, exec, push, pull)の実行結果を示しつつ、Docker の Build / Ship / Run の概念を説明してくれます。この部分は、別段特別なことはありません。Docker Hub についての紹介もあります。
一方で、この章の後半(2.2 節)は、コンテナイメージはレイヤ(差分)の集合というキーワードのもと、docker save コマンドで展開した各レイヤのデータを確認してみたり、docker build 時の出力を確認してみたり、キャッシュを効かせてみたりと、要素技術についてしっかりと深堀りしていきます。 ググって出てくる Docker 入門記事でなんとなく概要掴んできたあとに読むとちょうどいい感じです。また、Overlay ファイルシステム(overlay2)についても触れられていて、実際に mount -t overlay でディレクトリを重ね合わせてマウントしたファイルシステムの挙動を観察したりして、とてもよくイメージを掴むことができました。
3.Kubernetes の概要
この章では、Kubernetes に登場するコンポーネントの概念について解説されています。
Kubernetes は使ったこともないし他の書籍も読んだことがないので、この章がどのくらいの粒度の説明なのかつかみきれないのですが、図が多用されていて私の初学者にも優しいレイアウトになっていつつ、用語は「」で囲まれていて目立つので、地の文は流し読みでも図に書いてあることを理解できるようになっています。また、一通り用語を使って説明したあとに「ここでは、~~~という点をおさえてくれれば ok です」のようなサマリがあって、とても親切です。
登場する概念としては、マニフェスト、クラスタ、ノード、コントロールプレーン、Pod、Deployment、StatefulSet、DaemonSet、Job、CronJob、ConfigMap、Secret、Volume、PersistentVolume、Service、あたりです。また、要素技術として、CRI ランタイム、OCI ランタイム、CNI プラグインも名前だけ登場します。
4.コンテナランタイムとコンテナの標準仕様の概要
この章では、Docker や Kubernetes が実際にコンテナを作成する際に利用している、コンテナランタイムについての概要が紹介されています。
コンテナランタイムには高レベルランタイムと低レベルランタイムがあるそうで、前者では containerd、後者では runc がメインで取り上げられています。多くのプロジェクト名や用語が登場しますが、平易な説明に留められており大枠のイメージを掴むには十分でした。ただ、部分的に曖昧な箇所があり解釈が難しかったので、この資料 などをググって読んで理解を補強しました。この本で大枠のイメージを掴んでいたおかげで、ググっている中で「この記事で言ってること、わかる、わかるぞ…!」となり、成長を感じることができました。
また、後半(4.5 節~4.6 節)では、docker export コマンド等で既存のイメージから抽出したデータを用いて、直接 runc を呼び出してみたり、runshare コマンドで namespace を分けたあとに cgroup で制限をかけてみてどういう振る舞いになるかを確認してみたりと、実際に動いている様子まで観測できてためになりました。