Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】A container is just a process with a few private views. I built one in thirty lines.

2026年09月14日に「Dev.to」が公開したITニュース「A container is just a process with a few private views. I built one in thirty lines.」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

コンテナは、特別なものではなく、Linuxカーネルの「名前空間」機能でプロセス環境を隔離し、「cgroups」でCPU・メモリを制限した普通のプロセスだ。筆者は30行で自作し、コンテナの分離・制限機能がカーネルの機能に基づいていることを解説した。仮想マシンと異なり、ホストOSのカーネルを共有する。

ITニュース解説

多くのシステムエンジニア志望者が「コンテナとは何か?」という疑問を抱くが、その本質は驚くほどシンプルだ。コンテナは特別な魔法の箱ではなく、私たちが普段使っている「プロセス」そのものだ。ただし、通常のプロセスとは異なり、コンテナのプロセスはいくつかの「プライベートな視点」を与えられている点が特徴だ。これはまるで、同じ部屋の中にいても、自分だけの窓や自分だけの机が与えられているようなものだと考えられる。

この「プライベートな視点」を実現するのが、Linuxカーネルに備わる「名前空間(Namespaces)」という機能だ。名前空間は、システム全体で共有されているリソース(資源)を、プロセスごとに分離して管理するための仕組みである。例えば、プロセスID(PID)、ファイルシステムのマウントポイント、ネットワーク設定、ホスト名、プロセス間通信(IPC)、ユーザー情報といったリソースが名前空間の対象となる。通常のプロセスはこれらのリソースを他のプロセスと共有しているが、名前空間を使うことで、特定のプロセスだけが独立したリソースのコピーを持つことができるようになる。

この分離を実現する基本的なコマンドがunshareだ。unshareコマンドに特定のオプション(フラグ)を付与することで、必要な名前空間を個別に作成し、その中で新しいプロセスを実行できる。 例えば、--utsフラグはプロセスにプライベートなホスト名を与え、コンテナ内でホスト名を変更しても、ホスト側のシステムには影響しない。--pidフラグはプロセスに独立したPID空間を与え、コンテナ内のプロセスが自分自身を「PID 1」(最初のプロセス)として認識できるようにする。これにより、ホスト側の他のプロセスがコンテナ内からは見えなくなる。--netフラグは、コンテナに独自の空っぽのネットワークスタック(ネットワーク設定)を与えるため、コンテナはホストのネットワーク設定とは無関係に動作する。--mountフラグは、プロセスに独立したマウント空間を与え、コンテナ内でファイルシステムのマウントやアンマウントを行っても、ホスト側のマウント状態に影響しないようにする。 そして、--user --map-root-userフラグは特に重要だ。これは、コンテナ内でプロセスがroot権限を持っているかのように振る舞える「ユーザー名前空間」を作成する。これにより、ホスト上では一般ユーザーであっても、コンテナ内ではrootとしてファイルシステムのマウントなどの特権操作が可能になる。このように、unshareコマンドの各フラグは、コンテナが持つべき個別の分離機能を一つずつ提供しているのだ。

コンテナが完全に独立した環境に見えるようにするための、もう一つの重要なステップは、ルートファイルシステムを切り替えることだ。これは、コンテナがホストのファイルシステムではなく、コンテナ専用のファイルシステムを見るようにする作業を指す。 古いやり方としてchrootというコマンドがあるが、これは単に指定されたディレクトリをルート(根)として見せかけるだけで、特定の操作を行うと元のホストファイルシステムに「脱出」できてしまう脆弱性がある。これに対し、より堅牢な分離を実現するのがpivot_rootというシステムコールだ。pivot_rootは、新しいルートディレクトリと古いルートディレクトリを完全に交換し、古いルートは後から完全にアンマウントできる状態にする。これにより、コンテナからホストのファイルシステムにアクセスする経路が完全に遮断され、「脱出」が不可能になる。このpivot_rootを正しく使うためには、新しいルートを事前にマウントポイントとして準備したり、親マウントをプライベートに設定したりといったいくつかの手順が必要だが、この操作によってコンテナはホストのファイルシステムから完全に切り離される。

コンテナ内部でプロセスを正しく監視するためには、/procという仮想ファイルシステムを適切に扱う必要がある。/procは、実行中のプロセスに関する情報などをカーネルから取得するための重要なインターフェースだ。もし/procが正しくマウントされていない場合、psコマンドなどでプロセス情報を表示しようとしても何も見えない、といった誤った状況が発生することがある。これは、単に/procが指す先が間違っているだけで、プロセスが存在しないわけではない。そのため、ルートファイルシステムを切り替えた後、コンテナの新しいルートディレクトリ内に改めて/procをマウントし直すことが不可欠だ。これにより、コンテナのPID名前空間に属するプロセス情報だけが正確に表示されるようになる。

コンテナのもう半分を構成する重要な要素が「リソース制限」だ。名前空間はプロセスの「視点(何が見えるか)」を分離するが、「何を使えるか(どれだけのCPUやメモリを使えるか)」は制御しない。この役割を担うのが、Linuxカーネルの「コントロールグループ(cgroups)」という機能である。cgroupsは、プロセスグループに対して、CPU時間、メモリ量、ディスクI/Oなどのリソース使用量に上限を設け、管理することを可能にする。 例えば、メモリ制限は、特定のcgroupに属するプロセスが使用できるメモリの最大量を設定することで実現できる。この制限を超えてプロセスがメモリを消費しようとすると、カーネルの「Out-Of-Memory(OOM)キラー」が自動的にそのプロセスを終了させ、システム全体の安定性を保つ。メモリ制限は、cgroupの関連ファイルにバイト数を書き込むだけで設定できるほどシンプルだ。ただし、cgroupsの操作には通常root権限が必要となるか、systemdなどの仕組みによってユーザーに利用が委譲されている必要がある。

このように、コンテナは、名前空間によるプロセスレベルの分離と、cgroupsによるリソース制限という、二つの基本的なLinuxカーネル機能の組み合わせによって実現されている。これが、仮想マシン(VM)との決定的な違いとなる。仮想マシンは、独自のカーネルを持ち、ハードウェアレベルで完全な分離を実現するため、より重厚でオーバーヘッドも大きい。一方、コンテナはホストのカーネルを共有するため、非常に軽量で高速に起動できるというメリットがある。しかし、カーネルを共有しているため、ホストカーネルに存在する脆弱性はコンテナにも影響を及ぼす可能性がある。

Dockerのようなコンテナランタイムは、これらの基本的な分離・制限機能の上に、イメージ管理、ネットワーク設定、ストレージレイヤーといった便利な機能を追加して提供している。しかし、コンテナそのものの核となる部分は、unshareによる名前空間の作成、pivot_rootによるルートファイルシステムの切り替え、そしてcgroupsによるリソース制限という、比較的シンプルなカーネル機能の組み合わせに過ぎない。これらの仕組みを一度自分で構築してみることで、「コンテナは単なるプロセスだ」という言葉が、具体的な実感を伴って理解できるようになるはずだ。

関連コンテンツ

関連IT用語

関連ITニュース