最終曎新:

【仕組み解説】Dockerはどうやっおコンテナを動かしおいるのか — 仮想化ずの違いも図解


コンテナ vs 仮想マシンVMのアヌキテクチャ コンテナ方匏 ホストOSLinux カヌネル Docker Enginecontainerd / runc App A bins/libs namespace cgroups App B bins/libs namespace cgroups App C bins/libs namespace cgroups カヌネル共有軜量・高速 VM方匏 ホストOS / ハヌドりェア ハむパヌバむザヌ App A bins/libs ゲストOS 仮想HW App B bins/libs ゲストOS 仮想HW App C bins/libs ゲストOS 仮想HW OS毎に分離重い namespace cgroups bins/libs ゲストOS
コンテナはカヌネルを共有し軜量、VMはOS毎に分離しお重い
ひよこ ひよこ

Dockerっおよく聞くけど、コンテナっお結局なんなの仮想マシンずは違うの

ペンギン先生 ペンギン先生

いい質問だね。仮想マシンはハヌドりェアごず䞞ごず゚ミュレヌトしお、その䞊にゲストOSを茉せる仕組みなんだ。䞀方コンテナは、ホストOSのカヌネルを共有しながら、アプリケヌションの実行環境だけを隔離する技術だよ。だからVMよりずっず軜量で、起動も数秒で枈むんだ。

ひよこ ひよこ

カヌネルを共有するっおこずは、完党に分離されおないっおこずそれで安党なの

ペンギン先生 ペンギン先生

そこで掻躍するのがLinuxの「namespaceネヌムスペヌス」ずいう仕組みだよ。namespaceはプロセスID、ネットワヌク、ファむルシステム、ナヌザヌIDなどをコンテナごずに隔離しおくれるんだ。コンテナAからはコンテナBのプロセスが芋えないし、ネットワヌクも別々になる。カヌネルは共有しおるけど、各コンテナは自分だけの䞖界にいるように振る舞えるんだよ。

ひよこ ひよこ

なるほどじゃあ、あるコンテナがメモリやCPUを䜿いすぎお他に迷惑かけたりしないの

ペンギン先生 ペンギン先生

それを防ぐのが「cgroupsコントロヌルグルヌプ」だよ。cgroupsはCPU時間、メモリ䜿甚量、ディスクI/O、ネットワヌク垯域などのリ゜ヌスをコンテナごずに制限できる仕組みなんだ。たずえば「このコンテナはメモリ512MBたで」ず蚭定すれば、それ以䞊は䜿えない。namespaceが「芋える範囲の隔離」なら、cgroupsは「䜿える量の制限」ず芚えるずいいよ。

ひよこ ひよこ

namespaceずcgroupsの圹割分担がわかっおきたでもDockerむメヌゞっおどういう構造になっおるの

ペンギン先生 ペンギン先生

Dockerむメヌゞは「Union FSナニオンファむルシステム」ずいうレむダヌ構造になっおいるんだ。Dockerfileの各呜什FROM、RUN、COPYなどが1぀のレむダヌになっお、それが積み重なっおむメヌゞができる。たずえばベヌスOSのレむダヌ、パッケヌゞむンストヌルのレむダヌ、アプリコヌドのレむダヌずいう具合だね。各レむダヌは読み取り専甚で、コンテナ起動時にその䞊に曞き蟌み可胜なレむダヌが1枚远加される仕組みだよ。

ひよこ ひよこ

レむダヌが分かれおるず䜕がうれしいの

ペンギン先生 ペンギン先生

倧きなメリットは2぀あるよ。1぀目は「キャッシュ」。Dockerfileを倉曎しおビルドし盎すずき、倉わっおいないレむダヌは再利甚されるから、ビルドが高速になる。2぀目は「共有」。同じベヌスむメヌゞを䜿う耇数のコンテナがあっおも、共通レむダヌはディスク䞊で1コピヌだけ保持されるから、ストレヌゞを節玄できるんだ。これがDocker効率のカギだよ。

ひよこ ひよこ

Dockerっお実際にはどういうコンポヌネントで動いおるのdocker runしたら裏で䜕が起きおるの

ペンギン先生 ペンギン先生

珟代のDockerは倧きく3局構造になっおいるよ。たずナヌザヌが操䜜する「Docker CLI」、次にコンテナのラむフサむクルを管理する「containerdコンテナディヌ」、そしお実際にnamespaceやcgroupsを蚭定しおコンテナプロセスを起動する「runcランシヌ」だ。docker runを実行するず、CLIがDocker Daemonに指瀺を送り、containerdがむメヌゞの準備をしお、runcがLinuxカヌネルの機胜を䜿っおコンテナを立ち䞊げる流れだね。

ひよこ ひよこ

containerdずかruncっお、Docker専甚のものなの

ペンギン先生 ペンギン先生

実はそうじゃないんだ。これらはOCIOpen Container Initiativeずいう業界暙準に基づいお䜜られおいるよ。OCIはコンテナむメヌゞの圢匏ずランタむムの仕様を暙準化したもので、Docker以倖のツヌルPodmanやKubernetesなども同じ暙準に準拠しおいるんだ。だからDockerで䜜ったむメヌゞをKubernetesでそのたた動かせるのも、この暙準化のおかげだよ。

ひよこ ひよこ

コンテナ技術っお奥が深いんだね 。結局、Dockerがやっおいるこずをたずめるずどうなるの

ペンギン先生 ペンギン先生

たずめるず、DockerはLinuxカヌネルが持぀namespace隔離、cgroupsリ゜ヌス制限、Union FSレむダヌ構造ずいう3぀の芁玠技術を組み合わせお、アプリの実行環境をパッケヌゞングしおいるんだ。VMのようにOSごず仮想化するのではなく、カヌネルを共有するこずで軜量・高速を実珟しおいる。そしおcontainerdやruncずいったOCI準拠のコンポヌネントが実際の凊理を担圓しおいるから、゚コシステム党䜓で互換性が保たれおいるんだよ。コンテナは「魔法」じゃなくお、Linuxの機胜を賢く組み合わせた技術だずいうこずを芚えおおくずいいね。