Dockerとは何か?その2

Dockerとは何か?その1の続きである。

小部屋になった理由

前回を読んでみて気づいたと思うのだが、大型サーバ>仮想化サーバ>Dockerの流れというのは、いかにしてコストをかけずに自由を得るかという流れだったと言える。最初の大きなサーバの話では、管理者に決められたOS、管理者に決められたソフトという大きな制限があった。その一方、仮想サーバというワンルームでは、OSから自分で決めることができ、好き勝手ができた。さらに、その中の小部屋であるDocker環境では、最初にLinuxと決める必要はあるものの(Linuxでしか動かないので)、それ以外は小部屋ごとに自由である。そして、この小部屋の中で何が起こっても、他の小部屋には影響しない。

ここで考えてみて欲しいのは、「何がそんなに怖かったのか?」ということだ。最初の大型サーバで恐れられていたことは何か?ワンルームを小部屋に区切る必要があった理由として恐れられていたことは何だろうか?

こっちでやってることが、あっちに影響する可能性である。時には、あっちに多大な影響を及ぼしてしまうことだ。そして実は、これが良く起こることなのである。だからこんなややこしい仕組みを考えついたのである。新たなソフトが出たので使いたい、この機能をつけたいなどと言って勝手をやっていると、その箇所のみならず、他にも影響し、最悪の場合は動作しなくなってしまう。

本番環境でもこれは良く起こるし、開発環境であればなおさらだ。最初の大型サーバにせよ、仮想環境のワンルームにせよ、新たなものをどんどん入れていけば、いつのまにか他が動かなくなっていることに気がつく。

そのため、Linux Kernalという基本インフラ(バス、トイレ、キッチン)を共通にする以外は、小部屋の中では何してもいい、他には影響しないという環境を作り出した。そして、簡単に小部屋(コンテナ)を導入でき、必要なくなったり、うまく行かなければすぐに捨てられるようにしたのである。

ウェブサービスの小人さんたち

さて、このワンルームの小部屋それぞれに基本的には、小人さんが一人ずつ入っている。この小人さんにそれぞれ様々な役割が割り当てられているわけだ。しかし、もちろん用済みになったら、すぐに追い出されて、別の小人さんが入ることになる。

※このワンルームの「広さ」は、サーバレンタル業者との契約時に決まっているので、もちろん無制限にどんな小人さんも入れるわけには行かない。そして、やたらとスペースをとる小人さんも入れば、そうでない小人さんもいるため、その塩梅が重要だ。

これらの小人さんの中で最も花形と言えるのは、ウェブサーバと呼ばれるものである。このワンルームの外のどこかにいるユーザがブラウザで「https://example.com」とか入力すると、この小人さんが、「はいはい、それな!」と言って内容を送り出す役割をしている。

実は、この種の小人さんは、このワンルームに一人だけとは限らない。一つのワンルームの中で、「https://example.com」、「https://foobar.com」、「https://dogcat.com」など、複数のウェブサービスの小人さんがいる可能性がある。Dockerの場合、もちろん、これらの小人さんたちは別々の部屋に住んでいる。もし、この小人さんが外部からのリクエストに応じるために特殊なソフトが必要とすれば、それを何でも好き勝手に導入できる。

しかし、ウェブサービスを提供する小人さんとしてはこれだけではない。外部の一般ユーザ向けに「コンテンツ」を提供するソフトもあれば、そのワンルームを契約した小グループや個人だけが使うサーバソフトもあるのだ。例えば、メールサーバは、基本的にはメールをやりとりする機能だが、希望すればウェブサービスによるインターフェースもつけられる。これを使えば、ユーザは、自分のパソコンにメールソフトを入れなくても、ブラウザだけでメールのやりとりができる。つまり、この小人さんは、外部にウェブサービスを提供しつつも、同時にメールの送信や受信の役割を果たすことになる。

あるいは、自分達専用の掲示板のようなものを考えてみるといい、これもまたウェブサービスである。広く一般には公開しないものの、やってることは普通のウェブサービスと同じだ。はたまた、jitsiというZOOM会議機能もまたウェブサービス、ブラウザ上でのビデオ会議を実現している。

現代では、あらゆるものがウェブサービスとして実現されているため、結局のところ、このワンルームの小部屋に住む小人さん達の、かなりの多くがウェブサービスを提供することになる。

ワンルームの玄関口とリバースプロキシ

ところがである、このワンルームの(上の文脈での)玄関口は一つしかない。

外部からブラウザを使って、何らかのサービスを、このワンルームの小人さん達のいずれかに頼み、結果を返してもらうのだが、その場合には、この玄関口に外部からの使いの者がやってきて、「example.comのこれこれの中身が欲しいんですけど」と言ってくる。それに応じ、example.com担当の小人さんが、その結果を使いの者に渡すことになる。

ところが、玄関口を専有できるのは、一人だけ、一つの小部屋だけなのである。この場合は、80番あるいは443番という玄関口なのだが、現代では間違いなく443のみが使われる。この番号の玄関口を専有できるのは、一人の小人さんだけだ。つまり、この小人さんの部屋に443という番号の外部とのやり取り口がついていると思えば良い。しかし、この部屋につけた場合、他の部屋にはつけられない。これでは、他の部屋にいるウェブサービスの小人さんたちは何もできない。リクエストを受けることができないのだから。

ではどうするかと言うと、リバースプロキシと呼ばれる小人さんの出番になる。この小人さんが、443番窓口を専有してしまい、そこに外部から来たリクエストの中身を見て、他のそれぞれの小人さんの部屋に持っていき、その小人さんからの結果を得たら、それを外部に返してやるというわけだ。

さらにこのリバースプロキシには重要な役割がある。この443番窓口というのは、暗号化されてなければならない。つまり、この窓口を担うリバースプロキシと、外部にいるユーザの使っているブラウザの間で暗号化通信が行われるのである。この暗号化を実現するためには、SSL証明書という物を外部の認証局というものに申請して取得しなければならない。さらに、無料で使える認証局の証明書は三ヶ月で期限切れになってしまう。この小人さんは、証明書の申請と取得、定期的な再申請の役割も担っている。

ワンルームの全体像

こんな風に、ワンルームは複数の小部屋(コンテナ)に分かれており、それぞれに小人さんが住んでいるが、重要な点としては、小人さん達の多くがウェブサービスを提供していることだ。このウェブサービスには、一般に公開されているものもあるが、小グループあるいは個人でのみ使うものもある。しかし、それら複数のウェブサービスの玄関口は一つしかなく、そこを専有してしまい、すべてのリクエストを一手に担う役割の小人さん、つまりリバースプロキシが、ただ一人だけ存在することである。

そして、これらの小人さん達のことが、もし気に入らなければ、比較的簡単に交換が可能である。基本的には、小部屋(コンテナ)を捨てて、新たなコンテナを持ち込むだけだ。もちろん、蓄積されたデータを持っている小人さんをそのまま捨てるわけには行かないのだが、基本的には他の部屋への影響なく自由に交換したり、追加したり、削除することができる。

さらには、実験的な機能を導入したりすることもできる。他の小部屋には影響を及ぼさないのだから。