過去問ドリル

LinuCレベル3 プラットフォームスペシャリスト コンテナ技術の利用 問14

コンテナ技術の利用/コンテナの基本原理と内部構造

Dockerホストに gVisor のランタイム runsc を導入し、/etc/docker/daemon.json の runtimes に runsc という名前で登録した。信頼できないイメージ untrusted/app のコンテナだけを、ホストのカーネルから強く隔離して動かしたい。コマンドとして適切なものはどれか。

当サイトのオリジナル問題(LinuCレベル3 プラットフォームスペシャリストの出題範囲「コンテナ技術の利用」に対応。実際の試験問題ではありません)

正解:B

解説

Dockerは既定では低レベルランタイムとしてruncを使いますが、daemon.jsonのruntimesに別のOCIランタイムを登録しておくと、docker runの--runtimeでコンテナごとに使うランタイムを選べます。gVisorのrunscは、コンテナのシステムコールをユーザー空間で動くカーネル(Sentry)が受け取って処理するため、コンテナのプロセスがホストのカーネルに直接触れる範囲を大きく減らせます。そのため、信頼できないコードを動かすコンテナだけにrunscを使い、他は通常のruncで動かすといった使い分けができます。ただし、システムコールの処理に層が増えるぶん、I/Oの多い処理などでは性能が下がることがあります。

選択肢ごとの解説

  • A誤り。no-new-privilegesは、setuidなどでコンテナ内のプロセスが権限を上げるのを防ぐ設定です。コンテナは引き続きruncで動き、ホストのカーネルを直接使います。
  • B正しい。--runtime=runscを指定すると、そのコンテナだけがgVisorのランタイムで起動され、システムコールがユーザー空間のカーネルで処理されます。
  • C誤り。--initは、コンテナのPID 1として小さなinit(tini等)を動かし、シグナルの中継やゾンビプロセスの回収を行わせる指定です。隔離の強さは変わりません。
  • D誤り。--cgroupns=privateは、コンテナに専用のcgroup名前空間を与える指定です。通常のコンテナの名前空間による分離の一部で、ホストのカーネルを直接使う点は変わりません。
LinuCレベル3 プラットフォームスペシャリストの問題を演習モードで解く