なぜ Docker ではホストと異なるディストリビューションのコンテナが動くのか
Docker Hub で Dockerfile を眺めていると、同じレポジトリでも base image が alpine のものや ubuntu のものが用意されていることに気がついた。ということは、例えばホストマシーンで CentOS が動いている場合 base image が CentOS の Dockerfile で統一しないと動かないのでは?と思い調べてみた。
とっかかりの理解としてはこの回答がわかりやすかった。
Since all Linux distributions run the same (yup, it’s a bit simplified) Linux kernel and differ only in userland software, it’s pretty easy to simulate a different distribution environment - by just installing that userland software and pretending it’s another distribution.
つまり、すべての Linux ディストリビューションは同じ Linux カーネルを使用しており、違いはユーザーランドのソフトウェアだけだということ。
Linux ディストリビューションの構成要素
Docker の仕組みを理解するために、まずは Linux ディストリビューションの構成する要素を見ていく。Linux ディストリビューションは大きく分けて2つの部分で構成されている。
- Linux カーネル:
- ハードウェアの制御
- プロセス管理
- メモリ管理
- ファイルシステムの基本操作
など Linux ディストリビューションの中核となる基本的な機能を提供する。
- ユーザーランド:
- パッケージ管理システム(apt や yum など)
- コマンドラインツール
- システムライブラリ
- その他のアプリケーション
など、各ディストリビューション固有のソフトウェア群を指す。
Docker コンテナの動作の仕組み
コンテナはホストマシンの Linux カーネルのみを共有し、ユーザーランドについては完全に分離された環境を持つ。この仕組みにより、異なるディストリビューションのコンテナを柔軟に実行できるようになっている。
ベースイメージの選択は、このコンテナ内のディストリビューション環境を決定する重要な要素となる。例えば、Debian ベースイメージを選択した場合、コンテナ内には Debian の apt パッケージマネージャーやファイル構造、システム設定が含まれた環境が構築される。そのため、ホストマシンが CentOS で動作していても、コンテナ内では Ubuntu の環境を利用するといった柔軟な運用が可能になっている。
まとめ
- Docker コンテナは、ホストマシンの Linux カーネルを共有しつつ、独自のユーザーランド環境を持つ
- ベースイメージの選択は、コンテナ内で使用するディストリビューション環境を決定する
- ホスト OS のディストリビューションに関係なく、異なるディストリビューションのコンテナを実行可能