ドッカーはどのように隔離を実現しているのか?
Docker は Linux カーネルの機能をいくつか利用して、隔離を実現しています。具体的には、次のメカニズムによりコンテナの隔離を実現しています。
- DockerはLinuxのネームスペース機能を使用して、各コンテナに独立した実行環境を作成します。これらのネームスペースには、PID(プロセスID)、ネットワーク、IPC(プロセス間通信)、マウントポイント、ユーザー、UTS(ホスト名とドメイン名)などがあります。ネームスペースを使用することで、Dockerはコンテナ内のプロセスが自分自身のリソースのみを参照し、他のコンテナやホスト上のリソースにはアクセスできないようにすることができます。
- Dockerはcgroupを利用し、コンテナのリソース制限を行います。
- ファイルシステム(ファイルシステム):Dockerはユニオンファイルシステムを使用してコンテナのファイルシステムを作成しています。ユニオンファイルシステムは、ホストのファイルシステムの上にイメージレイヤーを作成し、その上に読み取り専用レイヤーを追加することで実現しています。これにより、各コンテナは独自のファイルシステムを持つようになり、ファイルの変更はコンテナの読み取り専用レイヤー上でのみ行われ、コンテナ間のファイルの分離が保証されています。
- セキュリティ強化(Security Enhancements):Dockerはコンテナの隔離性を高めるために、いくつかのセキュリティ強化を実施しています。例えば、Seccomp(安全計算モード)を使用してコンテナのシステムコールを制限し、AppArmorまたはSELinuxを使用してコンテナのホストリソースへのアクセスを制限し、またLinuxカーネルのセキュリティ機能を使用するなどです。
これらのメカニズムの組み合わせを使用して、Dockerは、高い単離性を持ったコンテナを実現し、それぞれのコンテナは、互いに干渉することなく、比較的独立した実行環境で動作できる。