コンテナとは

こんてな

アプリケーションと、その実行に必要なライブラリや設定をまとめ、ホストのOSのカーネルを共有しながら、ほかのプロセスから隔離して動かす実行の単位。Linuxでは、プロセスID・ネットワーク・マウントなどの見え方を分ける名前空間と、CPUやメモリの使用量を制限するcgroupsで実現される。OSを丸ごと起動する仮想マシンより軽く、起動も速いが、カーネルを共有するので、ホストと異なる種類のOSのカーネルは動かせない。コンテナはコンテナイメージから作られ、DockerやKubernetesなどで作成・管理される。

「コンテナ」は、2分野の19問の練習問題に出てきます(クラウドとコンテナの基礎, OSとハードウェアなど)。

この用語の分野: クラウドとコンテナの基礎

仮想マシンとの違い

仮想マシンはハイパーバイザの上で、それぞれがカーネルを含むOSを動かします。コンテナはOSを起動せず、ホストのカーネルの上で隔離されたプロセスとして動くので、起動は秒以下で済むことが多く、1台に多数を詰め込めます。その代わり、隔離はカーネルの機能に頼るので、仮想マシンほど強くはありません。強い隔離が必要な場面では、コンテナを軽量の仮想マシンの中で動かす方式も使われます。

コンテナのファイルシステム

コンテナのファイルシステムは、読み取り専用のイメージの層の上に、コンテナごとの書き込み可能な層を重ねたものです。イメージのファイルを書き換えると、そのファイルが書き込み可能な層にコピーされてから変更されます(コピーオンライト)。書き込み可能な層はコンテナを削除すると消えるので、残したいデータはボリュームなどの外部の記憶領域に置きます。

使い捨てにする設計

コンテナは、壊れたら直すのではなく、イメージから作り直して置き換えることを前提に設計します。設定は環境変数などで外から与え、ログは標準出力に書いて基盤に集めさせ、状態はデータベースやストレージに置きます。こうしておくと、台数を増減したり、新しい版に入れ替えたりするのが簡単になります。

コンテナの練習問題に挑戦

コンテナと仮想マシンの違いとして正しいものはどれか。

  1. Aコンテナはそれぞれが独自のOSのカーネルをもち、仮想マシンはカーネルを共有する
  2. Bコンテナはハイパーバイザの上で動き、仮想マシンはOSの機能だけで動く
  3. Cコンテナはカーネルを共有し、仮想マシンは独自のOSを動かす
答えと解説を見る

正解:C. コンテナはカーネルを共有し、仮想マシンは独自のOSを動かす

コンテナは、1つのOSのカーネルを共有しながら、ファイルの見え方、プロセス、ネットワーク、使える資源などをグループごとに分けて隔離する方式です。OSを丸ごと起動しないので軽く、起動も速くなります。仮想マシンはハイパーバイザの上で、それぞれが独自のカーネルを含むOSを動かすため、重い代わりに隔離が強く、別の種類のOSも動かせます。カーネルを共有するのはコンテナの側で、説明が逆になっている選択肢に注意が必要です。

Linuxのコンテナを実現するカーネルの機能のうち、名前空間(namespaces)とcgroups(コントロールグループ)の役割の組み合わせとして、正しいものはどれか。

  1. A名前空間:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける、cgroups:CPUやメモリなどの資源の使用量を制限・計測する
  2. B名前空間:CPUやメモリなどの資源の使用量を制限・計測する、cgroups:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける
  3. C名前空間:コンテナごとに別のカーネルを起動して互いを隔離する、cgroups:コンテナごとに仮想的なCPUを作り、ハードウェアを模倣する
答えと解説を見る

正解:A. 名前空間:プロセスから見えるもの(プロセスID、ネットワーク、マウントなど)を分ける、cgroups:CPUやメモリなどの資源の使用量を制限・計測する

コンテナは、ホストのカーネルの上で動く普通のプロセスに、2つの仕組みで隔離をかけたものです。名前空間は、プロセスID、ネットワーク、マウント(ファイルシステムの見え方)、ホスト名などをグループごとに分け、コンテナの中のプロセスには自分たちの分だけが見えるようにします。cgroupsは、プロセスのグループが使えるCPUの時間やメモリの量を制限し、使用量を計測します。どちらもカーネルの機能なので、コンテナは別のカーネルを起動せず、ハードウェアを模倣することもありません。

よくある質問

コンテナの中でホストと違うLinuxのディストリビューションを使えますか?

使えます。イメージに入っているのはコマンドやライブラリなどのユーザ空間のファイルなので、別のディストリビューションのものを使えます。ただし、カーネルはホストのものを共有するので、uname -r はホストのカーネルを表示し、ホストのカーネルがもたない機能は使えません。

WindowsやmacOSでLinuxのコンテナを動かせるのはなぜですか?

Docker Desktopなどは、その中で小さなLinuxの仮想マシンを動かし、その上でLinuxのコンテナを実行しているからです。Linuxのコンテナには、どこかでLinuxのカーネルが必要です。

解説の中の「コンテナ」

「コンテナ」が出てくる問題(19問)

  1. コンテナと仮想マシンの違いとして正しいものはどれか。
  2. Linuxのコンテナを実現するカーネルの機能のうち、名前空間(namespaces)とcgroups(コントロールグループ)の役割の組み合わせとして、正しいものはどれか。
  3. LinuxのホストでDockerを使い、ホストとは別のディストリビューションをもとにしたイメージからコンテナを起動して、その中で uname -r(カーネルのリリースを表示するコマンド)と cat /etc/os-release(ディストリビューションの情報を表示するコマンド)を実行した。結果の説明として、正しいものはどれか。
  4. コンテナイメージとコンテナの関係の説明として、正しいものはどれか。
  5. あるイメージから起動したコンテナの中で、イメージに含まれている設定ファイル /etc/app.conf を書き換えた。Dockerの一般的なストレージの仕組み(overlay2 など)で起きることとして、正しいものはどれか。
  6. 上のDockerfileで、docker build でイメージを作るときに実行されるコマンドと、docker run でコンテナを起動するときに実行されるコマンドの組み合わせとして、正しいものはどれか。
  7. 上のDockerfileから作ったイメージ pinger を、docker run pinger example.com として起動した。コンテナの中で実行されるコマンドとして、正しいものはどれか。
  8. ポート80で待ち受けるWebサーバのイメージ nginx から、上のコマンドでコンテナを起動した。ホストのIPアドレスを 192.0.2.10 とし、ファイアウォールなどの制限はないものとする。同じネットワークにある別のPCのブラウザから、このWebサーバに接続するURLとして、正しいものはどれか。
  9. Dockerで、コンテナが書いたデータを残すための名前付きボリュームとバインドマウントの説明として、正しいものはどれか。
  10. Kubernetesで、デプロイして管理する最小の単位であり、1つ以上のコンテナをまとめて、同じIPアドレスやボリュームを共有させるものはどれか。
  11. あるWebアプリケーションは、起動してからキャッシュを読み込むまでの約60秒間は要求を処理できず、その間は /ready に503を返す。Podのコンテナに上の設定を加えたときの効果として、正しいものはどれか。
  12. Podのコンテナに上の設定をしたDeploymentで、Podが4つ動いており、どのPodもCPUを400m(0.4コア)ずつ使っている。HorizontalPodAutoscalerのCPU使用率の目標を60%とし、必要なPodの数は ⌈現在の数 × 現在の使用率 ÷ 目標の使用率⌉ で求めるものとする。必要なPodの数として、正しいものはどれか。
  13. Kubernetesで、コンテナに設定する資源の requests と limits の説明として、正しいものはどれか。
  14. 割り当て可能な資源がCPU 4コア、メモリ 8 GiB のノードがある。各Podのコンテナには、requests としてCPU 500m・メモリ 1.5 GiB、limits としてCPU 1コア・メモリ 2 GiB を設定した。ほかのPodやシステムの予約はないものとする。このノードに置けるPodの最大の数として、正しいものはどれか。
  15. 上のように、データベースの接続先をイメージに書き込まず、コンテナを起動するときに環境変数で渡すようにした。この設計の主な利点として、最も適切なものはどれか。

クラウドとコンテナの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

Pod Docker Kubernetes 環境変数 ハイパーバイザ コンテナイメージ コピーオンライト JSON 引数 HTTP

用語集の一覧へ