クラウドはわかったのに、コンテナはわからなかった
Dockerなどのコンテナ技術が使われるようになって何年も立ちますが、私がコンテナに対してモヤモヤ(理解できなくてスッキリしない気持ち)を感じなくなったのは、じつは最近です。
クラウドサービスが流行り出したとき、仮想マシン(VM)に対してはモヤモヤは感じませんでした。VMは物理的なコンピュータをソフトウェアとして再現したものです。ハードウェアかソフトウェアかの違いはあれど、独立した1つのコンピュータと考えれば、VMでアプリケーションが動くことも、VM同士で通信できることも、クラウド上でシステムを構築できることも、疑問なく受け入れられました。VMの詳細なしくみもそれほど気になりませんでした。「パソコン上で動くゲーム機のエミュレータがあるけれど、コンピュータ上で別のコンピュータを仮想的に実現できるのもアレと似たしくみなんだろうな」と。
しかし、Dockerが登場しコンテナ技術が流行り出したとき、コンテナでアプリケーションが動いたり、コンテナ同士で通信できたりすることは不思議でした。「コンテナはVMの軽量版である」と、ブラックボックスとして受け入れればよかったのかもしれませんが、なかなかそうは思えませんでした。
コンテナがわかりにくい理由
「コンテナはOS(ホストOS)上に独立したアプリケーション実行環境を作成したもの」と説明されても、疑問は深まる一方でした。「コンピュータを仮想化したもの」というVMの説明と比べると、前述のコンテナの説明は、私には抽象的すぎてそのままでは腑に落ちませんでした。
たとえばコンテナを触り始めたころは、DockerfileにPythonのイメージを指定してコンテナを起動するだけで、Pythonの実行環境が用意できることが不思議でした。「自分ではOSを導入・設定していないのに、シェルやファイルシステムなどはどうなっているのだろう?」と。実際には、Pythonのイメージに軽量なOSのイメージが含まれていたり、カーネルはホストとコンテナとで共有していたりします。プログラムを動かすために必要な技術スタックは、ホストやコンテナイメージなどに散在してはいますが、ちゃんとそろっています。でも、全部が見えているわけではありません。全体像が見えづらいことやホストとコンテナの境界があいまいなことが、コンテナの動作原理をイメージしづらい一因なのかもしれません。
モヤモヤを解消するには
コンテナを独立した実行環境として迷いなく見られるようになるには、「ホストのどのリソースや環境を、どんな機能を使って分離・隔離しているのか」「どのレイヤでどの技術が機能して仮想的な環境が実現されているのか」ということを知る必要がありそうです。私は、本業の『Software Design』の制作を通じて、Dockerのしくみを解説する記事を読み、なんとか把握できたように思います(それらの記事をもとにして刊行されたのが、『イラストでわかるDockerとKubernetes』などの書籍です)。
また最近、当社は『Docker & Kubernetesネットワークのしくみ』という書籍を刊行しました。コンテナは多くの場合、複数のマシンから構成されたクラスタ上で実行されます。コンテナ自身も、スケールアウト/スケールイン、障害からの復旧など、状況に応じて頻繁に起動と削除が行われます。このような状況においてはネットワーク設定も頻繁に変わるはずですが、アプリケーション利用者からは変わらずにアクセスできることが求められます。これはどのように実現されているのでしょう。本書ではそんなコンテナ技術の裏側のネットワークのしくみを解説しています。
コンテナはしくみがわからなくてもある程度は使えると思います。でも、しくみがわかれば安心して使えます。もしあなたが、私と同じようにコンテナにモヤモヤを感じているならば、コンテナの内部のしくみに目を向けてみるとよいかもしれません。
- プロフィール