Dockerのきほんのきほん、のそのまたきほんを話す

 

この記事で伝えていること

・Dockerがわからない初学者は

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん』(著:小笠原穂高)という本を読むと何とかなる。

・わかりやすい説明とは、要するに欲望の解消。

 

※ この投稿はFLINTERS BASEブログ祭りの記事です。  
※ テーマは #読書メモ #説明 です。

 

はじめに

10期生のサトミです。
「Docker」という技術があります。弊社FLINTERS BASEでは新人に三ヶ月の研修期間があり、Python、SQLといったプログラミング/クエリ言語からAWS、GCPなどのクラウドサービスに至るまで広範に学ぶことができます。

しかし、研修も中盤にさしかかると現れる「Docker」の単元は、多くの初学者エンジニアにとってなかなかの鬼門でした。

説明を聞いてもググってみても自分で軽く触ってみても、Dockerの理解に関してはモヤをつかむような感覚。結局、一通り見てみたところで「よく分からないクジラマークのあんちくしょう」として終わりがち…というケースを自分を含め多々見てきました。

Dockerのクジラ(公式サイトhttps://www.docker.com/ja-jp/legal/trademark-guidelines/より引用)。筆者の地元の千葉県南房総ではクジラ肉が給食で出てきます。

そんな中で出会ったのが『仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん』(※以下、『Dockerのきほん』と表記)という本でした。

ページをめくるたび、わかる!それが知りたかったんだ!の連続。この本を一冊読み終わって、Dockerというシステムについて一気に頭の中の霧が晴れたような感覚を覚えました。

さらに本を通じて「わかりやすい説明とは何なのか?」という疑問に対する答えも見えてきました。

そこで当記事では、本の内容を紹介しながら、そのポイントについても触れていきたいと思います。

 

Docker、それは君がみた隔離

そもそも、Dockerとは何なのでしょうか?Wikipediaを見ると以下のような説明が書かれています。

 

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである。

 

 

この説明でピンとくる人は少ないでしょう。「コンテナ仮想化を用いて」とは何か?開発・配置・実行?技術ではなくプラットフォームなのか?多くの初学者にとって理解しづらい部分が多いです。

しかし、他の解説サイトをみても1台のサーバー上であらゆるアプリケーションを手軽に実行できるようになる、などの似た説明がほとんどです。

他にも、Dockerというとこのような図と説明をよく見かけます。

 

DockerはDockerfileからDockerイメージをbuildし、さらにイメージをrunさせることでDockerコンテナ、いわばアプリケーションの実行環境が立ち上がる。

 

Dockerのシステムの流れ

Dockerfileという文書によってイメージを作り出し、そこからコンテナを実態化?これは黒魔術かなにかですか?


そんな初学者には難しい説明ばかりが跋扈する中、『Dockerのきほん』ではこのように説明しています。

 

Dockerを一言で表せば、「データやプログラムを隔離できる」仕組みです。

 

この説明は非常に分かりやすいと感じました。Dockerfileやイメージ、コンテナという用語をあえて使わず、「何ができるのか」に絞ってDockerを表している。筆者の説明は続きます。

まず、パソコンやサーバーでは、複数のプログラムが動いている。こうした複数のプログラムやデータを、独立した環境に隔離できるのがDockerである。しかも隔離できるのはプログラムやデータだけではなく、OS(っぽいもの)ごとできる。

Docker導入前後のサーバーイメージ

なるほど、要するにDockerとは「ゴチャゴチャしている奴らを隔離/格納させたい」ために作られた技術なのです。

この隔離/格納させるための箱が、上記で触れられていた「コンテナ」という代物の正体ということです。

 

鯨が持ってきたものはエントロピーを減少させる箱だった

このソフトウェアがゴチャゴチャしている状態、という感覚は何かしらのシステムを構築したことがある人間にとって非常によく理解できるものです。

自前のPCで何かシステムを操作したい、とあれば当然システムを動かすためのソフトウェアが必要です。

例えばWordPressを動かしたければ、最低でも1.WordPress本体、2.WebサーバーであるApache、3.サーバーと応答するためのPHPの実行環境、4.DBを操作するためのMySQLの4つのソフトウェアが求められる。

つまりこれだけで4つ、システムが依存するソフトウェアがサーバー内に含まれてしまうわけですね。さらにこれらは使用しているサーバーのOSにも依存し、加えて別のシステムやソフトウェアをインストールしようとすれば、より多くの依存関係をサーバー内に含むことになる。

 

さて、だんだんソフトウェアがサーバー内で”ゴチャゴチャして”きました。さらにソフトウェアを追加する…するとサーバー内はさらに有象無象のシステムで蠢くことになる。一体内側でどのような依存関係が動いているのか?事態は複雑です。

しかもあるシステムはPHPの6.0でないと動かず、別のシステムはPHPの7.0以上を求めていたら…そろそろサーバー内の関係性が収集つかなくなってきました…エントロピーの増大を感じます!

 

こうしたゴチャゴチャを解決するのがDocker、というわけです。

 

例えばWordPressの例でいえば、Dockerは1.WordPress本体、2.Apache、3.PHPの実行環境、4.MySQLのソフトウェアとそれらを動かすLINUXのOS(厳密にはOSのようなもの)を含んだオールインワンのコンテナを作成することが出来ます。

つまり、「ゴチャゴチャしている奴らの隔離/格納」を行える。

 

このコンテナを作って、起動する命令さえ与えれば、どのサーバー内でもDockerさえ入っていれば、箱庭的なWordPressサーバーを立ち上げることができる。

しかも、コンテナはひとつひとつシステムが”隔離”されている。全く別verのPHPを入れた違うシステムのコンテナを作って起動させたとしても、他のコンテナの環境とバージョン違い等で競合することなく動かすことが可能になっているのです。

加えて、コンテナは箱という言葉のイメージの通り、運搬も容易に設計されています。全く別の場所にあるサーバーであっても、Dockerが入っていれば必要なコンテナを運んで、どこでも簡単に欲しい環境やソフトウェアが動かせるわけです。

 

ちなみにWordPressの例でオールインワンパッケージのコンテナを挙げていましたが、もちろんそれぞれPHPのみ、Apacheのみ、MySQLのみとソフトウェアをバラバラに分けたコンテナ、あるいはMySQLだけ別コンテナにして他のWordPressに必要なソフトウェアはまとまったコンテナを作成する、など自由自在です。

AのコンテナとBのコンテナの組み合わさった環境が欲しいな、と思えばそれらを同時に動かして、機能を組み合わせてやればいい…なんだかレゴブロックのようですね。

 

初学者の理解を阻む”便利”の壁

さて、ここまで見たことでようやく、Dockerが大まかに理解できてきました。

『Dockerのきほん』に書かれた「Dockerとは、データやプログラムを隔離できる仕組みである」という説明により広がった理解。それは最初に紹介したWiki等の説明では得られなかったものです。

では、『Dockerのきほん』の説明はなぜこのように初学者にも理解できたのか?ここからは、序盤で触れたわかりやすい説明とは何なのか?という疑問について考えていきます。

 

わかりやすい理由。それは『Dockerのきほん』では、読者の欲望を顕在化し、その欲望を解消するものとしてDockerを説明していたから、だと考えています。

読者の欲望を顕在化するとは何か?先ほど、ソフトウェアの依存関係でゴチャゴチャしたサーバーの話を例に出しました。

こうしたゴチャゴチャしたサーバーはエンジニアであれば誰もが一度は経験し、不便を感じたことがあるはず。ですが初学者の多くはDockerの説明を読んで、その不便の経験と結びつけることができませんし、そもそも不便の経験を忘れている場合もあります。

 

とはいえ、過去の不便を感じた経験、無意識の欲望は確かに脳内に存在している。それを「あなたが求めているものって、実はこれですよね?」と相手の心理を掬い上げる形で提示する。

そこで『Dockerのきほんのきほん』では「サーバー内をゴチャゴチャと動き回っているシステムたち」というイメージを最初に提示することで、読者の欲望を顕在化させる第一ステップを踏み、そこから「コンテナ」という隔離/格納が可能な便利な箱を紹介する第二ステップに移行することで、その欲望を解消している訳です。

これによって、Dockerというシステムがエンジニアにとってなぜ必要な技術なのかが直感的に理解できる。

 

裏を返せば、理解できない説明の多くが、その知識を与えられた際の活用事例を想像できないことにあるとも言えます。もう一度Wikiの説明を見てみましょう。

 

Dockerは、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである。

 

これはDockerの概要の説明としては十分に満たしています。一方で、(Wikiの説明なので当たり前ですが)初学者にとってわかる説明とは言い難い。

なぜなら、上記の説明は初学者エンジニアにとっていったい何の不便を解消してくれるか全くわからないからです。

 

よくエンジニア界隈では自分から学んでいける人間が強い、という言説がありますが、これは言い換えると「不便を解消したい/より効率的にシステムを動作させたい」という欲望が自分の中で先に顕在化した状態で技術を学べるため、ユースケースを仮定しやすく、そのために理解する速度が速い、とも言えると思います。

逆に初学者は今ある便利なものを先に触れてしまい、不便な状態を知らないからこそ、ユースケースの仮定に失敗し技術をうまく飲み込めない。

失敗は成功の糧になる、と言いますが、不便は理解の糧になるとも言えるかもしれません。

 

仕組みと欲望は逆方向のベクトルである

さらに、『Dockerのきほん』は初学者が知る不便さ、つまり「欲望の範囲」を極めて正確に捉えて構成している本であると思います。この本では前半を基礎パート、後半を応用パートと分けています。

 

基礎パートはDockerコンテナの概要や起動/停止等の基礎的な操作コマンド、そしてDockerコンテナを”運搬”する際に必要な知識であるDockerイメージの説明を行なっています。

対して後半ではDockerコンテナの改造方法(=Dockerファイルの記述方法)、複数コンテナを制御するDocker Composeという技術について触れていきます。

この前半の基礎パート/後半の応用パートという分類の基準は明確に示され、それは使う人用/作る人用という二分法になっています。

 

つまり、ただ用意されているDockerを使うだけの人であれば、コンテナの運搬に必要なDockerイメージの簡単な操作方法と、Dockerコンテナの起動方法さえわかればいい。

しかし作る人はDockerコンテナを自分用に改造するためのDockerfileの知識が必要だし、その他にも複数コンテナの制御など必要な知識は多い。

ここで面白いのは、このブログ記事の序盤で紹介したDockerの仕組みと逆の順番で、『Dockerのきほん』の説明が展開していることです。

逆方向の説明順番

初学者の欲望は実際に触れられて、かつ有益さがわかる「結果」の部分を求め、そこから「原因」に遡って理解を深めるのに対して、仕組みの説明はどのようにシステムが動いているのか、という「原因」から始めて、最終的な「結果」に至るまでの順を追う形になる。

『Dockerのきほん』は初学者の欲望と同じ方向で説明を行なっています。一方で、一般的な仕組みの説明の方はそうではない。

このベクトルの相反が、初学者の理解を阻む理由の一つになっているのではないでしょうか?

 

こうした欲望と説明の順番が逆のベクトルになってしまっているケースは、多くの初心者向け解説で見かけます。もし初学者に新しいシステムについての説明をしたとき、相手にうまく響いていないようであれば説明のベクトルを逆にしてみるというのも一つの手かもしれません。

 

おわりに

ここでは紹介しきれませんでしたが、『仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん』はサーバーとは?/OSとは?という基礎的ながらも重要な説明から、痒いところに手が届くDocker知識まで幅広く扱っており、この内容を頭に入れられれば基本的な知識で躓くことは無いだろうな、と感じます。

また、何よりも初学者にとって「わかりやすい」をとにかく徹底した内容になっており、その説明力に感心してしまう点も大きな魅力です。Dockerの知識以上に、「わかりやすさ」という概念そのものについても理解を深めてくれる本だと感じます。

Dockerという巨大なクジラに飲み込まれて溺れかけている僕と同じようなエンジニアの方は、ぜひここから”きほんのきほん”を学んでみるのをオススメしたいと思います!