用語辞典・クラウド・開発運用

コンテナ

コンテナとは

container(コンテナ)は、アプリと必要なライブラリを隔離された実行単位へまとめ、同じOS上で動かす技術です。アプリケーションコンテナーはOS-段階仮想化とソフトウェアパッケージ化を組み合わせ、再利用・自動化しやすい形で処理を実行します。

一般的なLinuxコンテナーはホストカーネルを共有し、名前空間で処理・マウント・ネットワーク等の表示を分け、cgroupでCPU・メモリー・I/O等を計測・制限します。コンテナーごとに完全なゲストOSカーネルを起動する仮想マシンとは隔離層が違います。

コンテナーは小さな仮想マシンではなく、ホストカーネル上で隔離された処理群です。画像にファイルをまとめても、カーネル、リソース、ネットワーク、秘密情報、永続データは実行時設定とホストへ依存します。

複数層からなるイメージから実行時コンテナーを作り、三つの処理群が一つのホストカーネルを共有する名前空間、cgroup、ネットワーク、書き込み可能層、永続ボリュームとVMを分ける
読み取り専用の複数層からなるイメージから書き込み可能なコンテナーを作り、三つのコンテナー内プロセスがそれぞれファイルシステム、プロセス空間、ネットワークインターフェース、リソース制限を持ちながら、一つのホストカーネルへシステムコールを渡す構造のピクトグラム図解
図1名前空間は見える範囲を分け、cgroupはリソースを制御します。どちらもホストカーネルの脆弱性や過剰な特権を自動で無害化するものではありません。

コンテナーの構成要素

Image実行前の読み取り専用層群

アプリケーション、ライブラリー、設定の初期値とメタデータを内容アドレス方式の層で配布します。

Runtime画像から起動した処理

entrypoint、引数、環境、マウント、ネットワーク、リソース上限を加えて実行します。

Namespaces処理から見える世界を分離

PID、マウント、ネットワーク、IPC、ホスト名、利用者ID等の表示をコンテナーごとに分けます。

Cgroupsリソースを計測・制限

CPU、メモリー、I/O、処理数等へ上限・weightを設定し、ホスト枯渇を抑えます。

Writable層コンテナー固有の一時変更

実行中のファイル作成・変更を上層へ記録し、コンテナー削除時に通常失われます。

Volumeライフサイクル外の永続データ

ホストパス、管理対象容量、ネットワーク保存領域等をマウントし、コンテナー交換後もデータを残します。

画像とコンテナーは設計図と実行中処理

画像はファイルシステム層と実行メタデータを持つテンプレート、コンテナーは画像へ実行時設定と書き込み可能層を加えたインスタンスです。同じ画像から複数コンテナーを起動しても、メモリー・PID・書き込み可能層は別です。

画像タグは別コンテンツへ付け替えられる場合があります。再現性が必要ならダイジェストで固定し、ソース、ビルドrecipe、ベースイメージ、SBOM、署名を追跡します。

ホストカーネルを共有する

コンテナー内にOS分配のuser-spaceファイルが見えても、システム呼び出しを処理するカーネルはホスト側です。別カーネルモジュールや異なるカーネル系列を自由に起動するVMとは違います。

Windows・LinuxコンテナーやCPUアーキテクチャー間の互換性には制約があります。コンテナー画像が「どこでも同じ」とは、対応実行時・カーネル機能・アーキテクチャー・マウント・ネットワーク等が揃う範囲での可搬性です。

名前空間とcgroupの役割

PID名前空間は処理番号、マウント名前空間はファイルシステム表示、ネットワーク名前空間はインターフェース・経路・ソケット等を分けます。利用者名前空間はコンテナー内IDをホスト側の別IDへ対応付けできます。

cgroupはリソースaccountingと上限を担います。メモリー上限なしでホストを圧迫し、CPU 共有だけで遅延を保証できない場合があります。要求と上限、OOM動作、ディスク・ネットワーク制約を監視します。

書き込み可能層へデータを預けない

コンテナーを削除・交換すると書き込み可能層は通常消えます。ログ、アップロード、データベース、セッション、利用者コンテンツは容量や外部サービスへ保存し、バックアップとアクセス制御を別設計します。

画像内へ秘密情報を書けば層履歴へ残ります。ビルド秘密情報機能や実行時秘密情報マウントを使い、レジストリへプッシュした画像を削除しただけで漏えい秘密情報が無効になるとは考えず回転します。

ネットワークは仮想インターフェースと方針で接続する

コンテナーはネットワーク名前空間内の仮想インターフェースをブリッジやオーバーレイへ接続し、ポート公開、サービスディスカバリー、プロキシ等で外部へ公開します。コンテナー内で待受けしてもホスト・Internetへ公開されたとは限りません。

逆にホストネットワークモードや特権付き設定は隔離を弱めます。ソースIP、NAT、DNS、IPv6、ファイアウォール、ネットワーク方針を実行時・orchestrator単位で確認します。

処理ライフサイクルを明示する

コンテナーは主処理の終了とライフサイクルが結び付く設計が一般的です。foreground処理、信号、段階的な停止、子処理回収、ヘルスチェックを実装します。

再起動方針は異常終了を隠す場合があります。再起動回数、終了コード、OOM、正常性、ログを保存し、無限再起動だけで可用性を作りません。

VMより軽いことと安全性は別

ゲストカーネルを起動しないため起動が速く高密度に配置しやすい一方、ホストカーネルを共有します。カーネル攻撃手法、コンテナーエスケープ、実行時・デーモン脆弱性、危険なマウント・対応能力がホストへ影響し得ます。

non-root利用者、対応能力削減、読み取り専用ルートファイルシステム、seccomp・MAC方針、ルートレスモード、署名済み画像、脆弱性スキャン、ホストパッチ、テナント分離を組み合わせます。強い隔離が必要ならVM・sandboxed実行時等も検討します。

コンテナーは画像から起動する隔離処理群で、ホストカーネルを共有します。名前空間、cgroup、書き込み可能層、容量、ネットワーク、特権を実行時に組み合わせ、可搬性と隔離の限界を含めて運用します。

containerをOS virtualizationとapplication packagingとして扱うsecurity guide:NIST SP 800-190、image・runtime・distributionの標準:Open Container Initiative

関連用語