TenForward

技術ブログ。はてなダイアリーから移転しました

令和 3 年秋期応用情報技術者試験のコンテナ型仮想化に関する問題からコンテナを考える

今さらの話なのですが、「コンテナとは」というお話です。厳密には「コンテナ型仮想化とは」です。

まあ、ほとんどネタなので、細かなところへのツッコミはなしでお願いします😂

X を見てると、徳丸さん(@ockeghem)の気になるポストを見つけました。

情報処理試験に出た「コンテナ型仮想化」に関する問題です。令和 3 年秋期という結構前の問題なので、IPA さんも「今ならこんな問題出さないよ」という話かもしれませんが。

なんで令和 3 年の問題が今取り上げられていたのかは知りません。

問題は次のような問題です。

正解は「ア」です。うーん、これはとても微妙でモヤモヤする解答ですね。徳丸さんのおっしゃるように消去法で答えられるかもしれませんが、答えられないような気もします。

設問を見ていきましょう。

そもそも、コンテナとは何か? ですが、これは次の記事に説明があります。

gihyo.jp

プロセスの一部をグループ化し、他のグループやグループに属していないプロセスから隔離した空間で動作させる

つまりプロセスから見えている OS リソースを、他のプロセスから隔離するのがコンテナです。

アを分解すると

  1. アプリケーションの起動に必要なプログラムやライブラリなどをまとめ、ホスト OS で動作させる
  2. 独立性を保ちながら複数のアプリケーションを稼働できる

さて、ここで「コンテナ技術って何?」に立ち返ってみましょう。コンテナは OS リソースを他のプロセスから隔離することが本質です。

1 の「アプリケーションの起動に必要なプログラムやライブラリなどをまとめ、ホスト OS で動作させる」はコンテナ技術とはまったく関係ありません。この文章だけだと、rpmdeb などのパッケージ管理システムも当てはまるでしょう。もちろん、コンテナイメージにも当てはまりますが。

2 の「独立性を保ちながら複数のアプリケーションを稼働できる」はコンテナの特徴といえるでしょう。しかし、これだけだと仮想マシンでも同じことができますし、徳丸さんがおっしゃるように、

のようなスマホアプリでも実現できますし、古くからの chroot でもできますし、snap や Flatpak でも、ホスト OS とは独立した環境でアプリケーションを実行できます(これらも全部簡易的なコンテナと言えるでしょう)。

では、1 と 2 を組み合わせたときにコンテナならではの特徴・機能になるのかというと、そうではありません。特定のコンテナマネージャの実装には当てはまる説明にはなるでしょう。特に今一般的な Docker などのコンテナマネージャ。

2013 年にリリースされた Docker が爆発的に流行し、今、コンテナ技術が一般的になった理由のひとつは、ホスト OS とは独立したプログラムやライブラリをまとめたイメージを展開し、お手軽にホスト OS とは独立した環境で動作させるというものでしょう。イメージの取得と展開も高速になる工夫がありましたし、仮想マシンとは違い、プロセスが起動するだけですので、それが高速に起動できるというところがポイントです。でも、これは Docker の特徴ですし、この Docker の特徴でコンテナならではというのは「高速に起動できる」というところくらいでしょう(あくまで仮想マシンと比べてのお話です)。

このような特徴は、コンテナのファイルシステムがホストのファイルシステムと独立しているところがポイントです。

しかし、Linux で起動するコンテナにおいては、この独立は OS リソースごとに独立(隔離)できます。コンテナのファイルシステムをホストと独立させなくても、その他のリソースを独立させれば立派なコンテナです。

もうひとつ、「アプリケーションの起動に必要なプログラムやライブラリなどをまとめ、ホスト OS で動作させるので、独立性を保」てると書いてるのですが、プログラムやライブラリなどをまとめることは独立性とは関係ありません。先に書いた通り、rpm などのパッケージ管理システムも「プログラムやライブラリなどをまとめてホスト OS 上で動かすための仕組み」です。

ここは、この選択肢を正解としたいなら、「プログラムやライブラリなどをまとめ、ホスト OS とは独立したファイルシステムで動作させるので、独立性を保ちながらアプリケーションを稼働できる」と書くべきでしょう。

まとめると、

  • プログラムやライブラリをまとめてホスト OS 上で動作させるのは、コンテナ独自の特徴ではない
  • プログラムやライブラリをまとめることはコンテナ技術とは関係ない
  • プログラムやライブラリをまとめなくても(コンテナのファイルシステムをホストと独立させなくても)コンテナは稼働できる
  • 独立性を保ちながら複数のアプリケーションを稼働するのは、コンテナ独自の特徴ではない
  • プログラムやライブラリをまとめただけで独立性が保てるわけではない

となります。

この選択肢は、コンテナならではの特徴ではないけど、コンテナでは(特にメジャーな特定のコンテナマネージャの)特徴となりえることを書いているので、すぐに正解!と飛びつけるかというと微妙な文章であるといえます。また、独立性の根拠が根拠になってない部分も気になるところでしょう。プログラムやライブラリをまとめなくてもコンテナですし、プログラムやライブラリをまとめることと独立性は関係ないのですから、「もしかしたら不正解?」と思っても仕方ないですね。

「イ」の選択肢を見ていきましょう。

  1. サーバで仮想化ソフトウェアを動かし、
  2. その上で複数のゲスト OS を稼働させるので、サーバの OS とは異なる OS も稼働できる。

ここでポイントになるのは、

  • 仮想化ソフトウェア
  • 異なる OS

でしょう。

「仮想化ソフトウェア」は、仮想マシンを動かすための仮想化ソフトウェアを指しており、仮想化ソフトウェアが不要なコンテナは当てはまらないから不正解、とさせたい選択肢にも思えます。

しかし、待ってください。仮想マシンを起動させるための機能は Linux カーネルに標準的に実装されており、別に仮想化ソフトウェアを準備しなくても仮想マシンは起動します。そして、コンテナも同様に Linux カーネルに標準的に実装されており、別にコンテナ用ソフトウェアを準備しなくてもコンテナは起動しますので、Linux カーネル自身が「サーバ仮想化ソフトウェア」と言えるでしょう。

そして、イマドキのコンテナは「アプリケーションコンテナ」と言って、コンテナ内ではアプリケーションを実行するだけなのが普通ですが、コンテナ内で init(systemd)を起動させると、システムとしてコンテナが起動しますので、普通に Linux をインストールした環境や、仮想マシンLinux をインストールしたのと同じことが実現できます。

このようなコンテナをシステムコンテナといい、Docker 登場以前はシステムコンテナが普通でした。今でも OpenVZ や Incus、LXD といったシステムコンテナ用のコンテナマネージャーはあります。

ここで Linux カーネルの上では「Windows コンテナ」は動かないじゃないか、という反論もあるかと思います。しかし、問題では「異なる OS」と書かれています。例えば Ubuntu の上で Debian や Rocky のシステムコンテナを動かせば「異なる OS」と言えそうですし、Ubuntu の上で Ubuntu を動かしてもシステムとしては別の環境なので「異なる OS」と言うことができるでしょう。

いや、Linux の上で Linux を動かしても「異なる OS」とは言えない、というのも別に間違いではありません。

コンテナのプロセスとしてエミュレーターを動かして別の OS…とか言い出すとキリがないでしょうか。

まとめると、

  • コンテナ機能を実装したカーネルはコンテナを動作させるための「仮想化ソフトウェア」であると言える
  • 仮想マシンを起動する際も、特別なカーネル・システム・ソフトウェアは不要で、通常の OS を起動するだけで仮想マシンが起動するので、コンテナと変わらない
  • システムコンテナを起動すれば、ホスト OS の上で、別のシステムが起動するので「サーバの OS とは異なる OS も稼働できる」と言えなくもない

この選択肢は、「異なる OS も稼働できる」を素直に考えると、間違いとなりますが、システムコンテナの存在を考えると「もしかしたら正解?」と思ってしまう選択肢ですね。特に「ア」の選択肢が微妙なところを考えると、「いや、やっぱりこっちが正解かも?」と、解答者が混乱しても仕方がありません。

これは情報だけを転送する「リモートデスクトップ」を指す話ですので、明らかに何の迷いもなくコンテナ型仮想化の話ではありません。

確信を持って正解の選択肢の候補から外せます。

この選択肢の文章がとても曖昧で微妙なので難しいところです。この選択肢は日本語としてどう理解するか?が一番難しかったです。

  1. ホスト OS で仮想化ソフトウェアを動かし、その上で複数のゲスト OS を稼働させる
  2. 物理サーバへアクセスするにはホスト OS を経由する必要がある

イで説明したとおり、「ホスト OS で仮想化ソフトウェアを動かす」はコンテナでもそう言えるでしょうから、この選択肢もコンテナの説明である可能性があります。

そして、この選択肢の一番の問題(困惑するところ)は「物理サーバへアクセスする」というのがどういう操作なのかが書かれていないことです。物理サーバのデバイスなどの物理的なモノをソフトウェア的に操作すること、という前提だと、次のようなことが考えられます(まあ、まさか物理的なサーバのケーブルを抜き差しするとかが、アクセスするという意味ではないでしょうけど)。

  1. 普通のシステムコンテナ(= ゲストOS)を複数起動しても、コンテナからは物理サーバへアクセスできないので、物理サーバへはホスト OS を経由する必要がある→コンテナの説明として成立
  2. ただし、システムコンテナを特権コンテナとして複数起動すると、ホスト OS と同じ操作がコンテナ内でできるため、物理サーバへはホスト OS を経由する必要はない→コンテナの説明としては間違い
  3. もちろん、仮想マシンとしてゲスト OS を複数稼働しても、ゲスト OS からは物理サーバへはアクセスできないので、物理サーバへはホスト OS を経由する必要がある→仮想マシンの説明としても成立

a、b、c いずれも考えてしまって、これが正解なのか間違いなのかはかなり迷いそうです。特に、a であるようなコンテナ環境が普通でしょうから、「これは正解」と思っても仕方ないですね。(いずれも「複数」起動してもしなくても関係ないですが、問題がそうだったのでそう書いてます)


選択肢を見てみましたが、明らかに適切でないのは「ウ」のみで、「イ」「エ」は適切と言えるケースもある、「ア」は適切だけどコンテナならではの特徴を書いてなし、コンテナで一番重要なポイントである独立性の根拠の説明が不適切ですので正解なのか微妙と思ってしまう可能性がある、と思いました。

まあ、普通の人であれば、徳丸さんがおっしゃるように「消去法で行くと『ア』になる」のでしょうけど、コンテナ技術に精通してる人がこの問題の選択肢を見ると、「イ」「エ」も正解と言えなくもない(もしくは正解がない)と思うはずです。

この問題、「コンテナ技術そのものを説明する選択肢を設けてくれ」と思います。コンテナ型仮想化を理解しているかどうかを問う問題としては、コンテナ技術そのものを書いた選択肢がなく、不適切な問題と言えるでしょう。


作問者には、ぜひ(通称「コンテナ本」である) "Linux Container Book" を一度読んで、設問の問題点を考えてほしいところですね😂。

コンテナ本こと、Linux Container Book シリーズは、技術書典サイトで購入できます。現時点で全 5 巻です。特に第 1 巻を見てほしいところです。

techbookfest.org

また、上記とまったく同じ内容のインプレス「技術の泉」シリーズから出ている電子書籍(とオンデマンド印刷本)がアマゾンをはじめとする各種オンラインブックサイトから購入できます。

Amazon.co.jp: Linux Container Book (技術の泉シリーズ(NextPublishing)) eBook : 加藤 泰文: 本

インプレス版 "Linux Container Book" は、技術書典版の第 1 巻と同じ内容ですが、技術書典版第 1 巻は新しい章を含む「第2版」が出ていますので、今なら技術書典版がオススメです。

結局自分の本の宣伝がしかったんかい!(はい、そうです😛)


(2025-08-14 追記)

もしかして、コンテナってこんな理解してる人が結構一般的なん?