DockerとLXCはどう違う?コンテナ技術の系譜を解説


DockerとLXCの関係史 2008 LXC誕生 2013 Docker 0.1 (LXC使用) 2014 libcontainer (LXCから独立) 2015〜 OCI標準化 LXC:システムコンテナ OS丸ごとを隔離する軽量VM 用途:Proxmox VE、自宅サーバー 複数サービスを1コンテナで共存 Docker:アプリコンテナ 1コンテナ1プロセスの哲学 用途:Kubernetes、CI/CD ポータビリティと再現性を重視 OCI標準で接続
DockerとLXCの関係:同じ技術基盤から異なる進化を遂げた
ひよこ ひよこ

DockerってLinuxコンテナ技術を使ってるって聞いたけど、LXCって何かな?

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

LXCLinux Containersの略で、2008年にLinuxカーネルに取り込まれた公式のコンテナ技術だよ。仮想マシンを使わずに、カーネルの「cgroups」と「namespaces」という機能でプロセスを隔離するんだ。

ひよこ ひよこ

カーネルの機能でプロセスを隔離する……なんとなくわかる気がする。じゃあDockerLXCって別物なの?

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

実はDockerは最初、LXCを土台にして動いていたんだよ。2013年にリリースされたDocker 0.1はLXCバックエンドとして使っていたんだ。LXCの上にイメージ管理やポータビリティの仕組みを乗せたのがDockerの出発点だね。

ひよこ ひよこ

えっ、DockerってもともとLXCを使ってたんだ!それなのになぜ今は違うの?

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

2014年にDockerはlibcontainerという独自のコンテナランタイムに切り替えたんだ。LXCに依存していると、Linuxディストリビューションによってバージョンが違ったり、思い通りに制御できないことがあってね。自前で実装することで、どの環境でも同じ挙動を保証できるようにしたんだよ。

ひよこ ひよこ

なるほど、移植性のために独立したんだね。でもLXCってその後どうなったの?なくなっちゃったの?

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

全然現役だよ!LXCDockerとは別の道を歩んでいて、「システムコンテナ」として使われているんだ。1つのコンテナの中でOSのような環境を丸ごと動かすイメージかな。Proxmox VEっていう仮想化プラットフォームがLXCを活用しているのが有名な例だね。

ひよこ ひよこ

DockerはアプリのコンテナLXCはOS丸ごとのコンテナ……設計の考え方が根本から違うんだ!

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

そこが核心だね。Dockerは「12Docker4」の哲学を持っていて、アプリをシンプルに分離してデプロイしやすくすることを目指しているよ。一方LXCは、複数のサービスが共存できる軽量VMのような存在だね。KubernetesDockerの哲学と相性が良いんだ。

ひよこ ひよこ

今の開発現場ではどっちを使うことが多いの?

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

アプリ開発・DevOpsKubernetesならほぼ間違いなくDockerを選ぶよ。LXCは自宅サーバーProxmoxで複数のOSライクな環境を管理したいときに向いていて、用途が棲み分けられているんだ。どちらが優れているというよりか、解きたい問題が違うんだよ。

ひよこ ひよこ

最近「OCI」って言葉も聞くけど、それはどう関係するの?

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

OCIOpen Container Initiativeの略で、2015年にDockerやCoreOSなどが立ち上げた標準化団体だよ。コンテナイメージフォーマットランタイムの仕様を統一して、DockerだけでなくPodmancontainerdなど複数の実装が互換性を持てるようにしたんだ。LXCも独自の世界観を保ちつつ、この標準の影響を受けているよ。

ひよこ ひよこ

標準化があると、Dockerのイメージを他のツールでも動かせるってこと?

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

その通り!Kubernetesは今やDockerエンジン自体に直接依存していなくて、OCI準拠のcontainerdというランタイムを使っているんだ。DockerLXCから独立してlibcontainerを作り、それがrunCとしてOCIに寄贈され、業界全体の基盤になった——Dockerの独立という決断がコンテナエコシステム全体の標準化に繋がったんだよ。

ひよこ ひよこ

Dockerを使うだけでもカーネルの隔離機能・設計思想の歴史・OCI標準化まで全部繋がってるんだね。裏側を知ると面白いな!

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

そうだね。Dockerを「便利なツール」として使うだけでも十分だけど、LXCやlibcontainerやOCIを知っておくと、トラブル時の調査力や設計判断がぐっと上がるよ。コンテナの「なぜ」を理解することが、クラウドネイティブ開発への一番の近道だね。