なぜ 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つの部分で構成されている。

  1. Linux カーネル:
    • ハードウェアの制御
    • プロセス管理
    • メモリ管理
    • ファイルシステムの基本操作

など Linux ディストリビューションの中核となる基本的な機能を提供する。

  1. ユーザーランド:
    • パッケージ管理システム(apt や yum など)
    • コマンドラインツール
    • システムライブラリ
    • その他のアプリケーション

など、各ディストリビューション固有のソフトウェア群を指す。

Docker コンテナの動作の仕組み

コンテナはホストマシンの Linux カーネルのみを共有し、ユーザーランドについては完全に分離された環境を持つ。この仕組みにより、異なるディストリビューションのコンテナを柔軟に実行できるようになっている。

ベースイメージの選択は、このコンテナ内のディストリビューション環境を決定する重要な要素となる。例えば、Debian ベースイメージを選択した場合、コンテナ内には Debian の apt パッケージマネージャーやファイル構造、システム設定が含まれた環境が構築される。そのため、ホストマシンが CentOS で動作していても、コンテナ内では Ubuntu の環境を利用するといった柔軟な運用が可能になっている。

まとめ

  • Docker コンテナは、ホストマシンの Linux カーネルを共有しつつ、独自のユーザーランド環境を持つ
  • ベースイメージの選択は、コンテナ内で使用するディストリビューション環境を決定する
  • ホスト OS のディストリビューションに関係なく、異なるディストリビューションのコンテナを実行可能