Dockerとは何か?その1

2023年1月30日

Dockerとは何かを、ほぼ初心者向けに書いてみる。というよりも、全くの素人がこれを理解してもらいたいと思う。不適当な箇所があればご指摘いただきたい。

昔のコンピュータの利用方法

昔のコンピュータというのは、一つのマシンがあり、そこに一つのOSが走っており、その単一のOSの上で複数のアプリを走らせるというイメージだった。そこに、複数のユーザのアカウントを作成し、それぞれのユーザの役割や信頼度によってできること・できないことを決めてあげて運用していた。

インターネット時代になっても、こういったやり方を引きずっていた。ネットに接続した一台のサーバマシンがあり、そこに複数のユーザを集めて、ウェブサイトを立ち上げてもらうなり、他の目的に使ってもらうなりしていた。

ここで問題になったのは、おそらく以下である。

  • 管理者の決めたOSしか使えない
  • 管理者のインストールしたアプリしか使えない

力のあるユーザは、自分ですべて決めたかったのである。しかし、管理者はユーザの要望を簡単に聞き入れるわけにはいかない。

システムに下手な変更を施すと容易に元には戻れない。最悪の場合、動作しなくなってしまい、それが全ユーザに影響する。

ユーザはすべてを自分で決めたかったのだが、同じ一つの部屋の中で皆が暮らしているため、勝手なことはさせられないし、できなかった。

仮想環境時代

仮想環境時代になってから、この状況が少々変わった。この仕組みとしては、一台のコンピュータというマンションの中に仮想的に複数のマシンというワンルームを作り、それぞれ別のOSを動作させてしまうことだった。それぞれにユーザを住まわせ、好き勝手にさせる。

前述の状況に不満を持っていたユーザだったが、自分専用の一つの大きなマンションを調達する必要はなく、仮想マシンというワンルームを提供してくれる業者探して契約し、そこに勝手にOSを入れ、自分で好きなアプリを入れれば良いことになった。

そして、この一つの仮想マシンの中の状態は、(以前に比較すればだが)比較的簡単にバックアップできて、何かまずいことがあれば、その状態を簡単に戻せるため、いくらでも好きな変更を施すことができる。当然だが、他のユーザには迷惑がかからない。一つのマシンの中だが、完全に隔絶されているのである。

ただし、デメリットはある。

  • 各自でOSやアプリをインストールするため、同じような、あるいは同一のOSやアプリをインストールした場合、重複してメモリやディスクが無駄になる。

これは、メモリやディスクが安くなっていけば解決できる問題ではある。しかし、次のような問題も出てきた。

  • アプリによっては、他アプリが使うものとは異なるバージョンをベースとする場合がある
  • 特定のアプリの構成を何度も変更して開発・テストしたい。

Docker時代

仮想環境では、マンションにワンルームを複数作り、それぞれに個人を住まわせる。その個人は、その部屋に自身で選んだ一つのOSを入れ、その上で複数のアプリを動作させる。しかし、それでも飽き足らず、そのワンルームの中で複数の別々の環境を欲しがりだしたのである。じゃ、個人で複数のワンルームを契約すればいいじゃないかと思うかもしれないが、それは嫌なのである。なぜなら、

  • 仮想環境はOSから基本ソフトから何から何まで一揃いそろっているので、大きくなりがちで、起動・停止・バックアップも大変になる。

人間の欲望は限りないもので、こんな当たり前のことも何とかならないかと思った(に違いない)。この解決策は、一つの仮想環境中に、さらに複数の隔離された部屋を作ってしまうことだった。ただし、Linux Kernelだけは、その仮想環境のものを使う。

つまり、サーバという一つの大きなマンションの中に、仮想環境という一つのワンルームを借りたが、それをさらに分割して、その中で好き勝手をするというわけだ。ただし、台所・風呂・トイレ等の基本インフラは共通のものを使って生活するというイメージだ。マンションの中の他のワンルームとは完全に隔絶されており、好き勝手ができるが、しかし、そのワンルームの中では、ある程度の制限が課される。

その制限とは、この場合、「Linux Kernelだけは変更できない」という点である。これがこの仮想環境全体に影響するインフラになる。

さて、この基本インフラ以外は、いくらでも小部屋を作ったり、削除したり、他からコピーしたりできる。仮想環境まるごとではなく、ほとんどの場合にはアプリ単位なので、これらの操作はかなり楽ちんだ。

ここで言葉を定義しておくと、一つのワンルーム、つまり仮想環境をホストといい、小部屋のことをコンテナという。パッケージングされた(小さめの)コンテナをいくつもワンルームに持ち込むようなイメージだ。

一つの大きなマンションに複数のワンルームを作った場合、いくつも同じようなトイレ・台所・風呂を用意しなければならないという無駄が発生していたが、Dockerの場合にも、さらに無駄が発生する。トイレ・台所・風呂という基本インフラは共通に使われるのだが、各コンテナでは、それぞれが必要とするものが重複する可能性はある。例えば、ウェブサービスを立ち上げるのには、nginxというサーバを使うことが多いが、こちらのコンテナも、あちらのコンテナもnginxを独自に使うことがある。これを避けて、共通化する方法もあるにはあるが面倒である。

したがって一般的に、Dockerを使った場合、使わない場合よりもメモリやディスク消費量が大きくなる。

ここまでのまとめとDockerの制限

一つの大きなマンションが不都合だったので、これを分割して仮想環境というワンルームを作った。それぞれのワンルームは、トイレ・風呂・台所という基本インフラをそれぞれ持っており、これらは重複している。さらにワンルームの中を小部屋分割するのだが、基本インフラの重複はなく、これらの小部屋は比較的「軽く」作ったり削除したりできる。

したがって、通常のワンルーム「仮想環境」よりも、Dockerの小部屋に課される制限は強くなる。

仮想環境での制限と言えば、ディスクやメモリ容量の制限は当たり前だが、CPUタイプがあった。x86_64(amd64)以外のCPUを使いたい場合は、特殊なサービスを探さなければならない。

小部屋としてのDockerコンテナの制限はさらに強い。まず、基本インフラは共通に使われ、その下で走行するため、以下の制限がある。

  • Linuxのみが対象。DockerとはLinuxを対象とするものであり、Windowsのソフトは動かない。
  • 基本インフラの使うLinuxカーネルバージョン以外のカーネルの機能は入れられない。あるバージョン以上のLinuxカーネルを要求するDockerコンテナは、その環境では動作しない。

ただし、そのLinuxカーネルを基本とするOSは、Dockerコンテナの中で自由に選択できる。例えば、Debianでも、Rocky Linuxでもよい。

Dockerとは何か?その2に続く