Docker/コンテナ — アプリを箱ごと運んで どこでも同じに動かす

中級の解説は準備中のため、中級の内容を表示しています。

概要 — まず全体をつかむ

初級ではコンテナを「アプリを箱ごと運ぶ仕組み」と捉えました。中級では、その箱の正体——イメージ・レイヤ・レジストリ——と、なぜ軽いのかの中身を見ます。

詳細 — 1段階ずつ追う

これは何をする係?

Docker の世界は、イメージコンテナの2語で回っています。

  • イメージ(※1)— 箱の設計図。不変のテンプレートで、これ自体は動かない
  • コンテナ — イメージを起動して動いている実体(実行インスタンス)

イメージは1枚岩ではなく、レイヤ(※2)=差分の積み重ねでできています。下からベースOS層・ランタイム/ライブラリ層・アプリ層…と重なり、同じ層は共有・キャッシュされます。だから配布もビルドも速く済みます。

アニメーション『イメージとコンテナのレイヤ』を開く
イメージ(設計図)読み取り専用レイヤの積み重ね・不変コンテナ(実行中)同じイメージ+薄い読み書き層1つの設計図アプリ層自分のアプリランタイム/ライブラリ層必要な部品ベースOS層土台の最小環境起動アプリ層(共有)ランタイム/ライブラリ層(共有)ベースOS層(共有)コンテナ1読み書き層(薄い)コンテナ2読み書き層(薄い)下位レイヤは1つを共有・各コンテナは薄い読み書き層だけを持つ同じ層は再ダウンロードしない=ディスクもキャッシュも節約でき、配布も速い変えたい所だけ差分レイヤを積み替えればよいので、作り直しも軽い

登場人物メモ:

  • ※1 イメージ — アプリと環境を固めた不変のテンプレート
  • ※2 レイヤ — イメージを構成する差分の層。共有・再利用でき、キャッシュが効く
  • ※3 レジストリ — イメージを保管・配布する倉庫(Docker Hub など)

仕事の流れ

  1. Dockerfile(手順書)にアプリと環境の作り方を書く
  2. それをビルドしてイメージ(設計図)を作る
  3. イメージをレジストリ(※3 倉庫)へ push(アップロード)する
  4. 使う場所で pull(ダウンロード)し、run でコンテナとして起動する

同じイメージを配れば、開発でも本番でも同じものが立ち上がる——これが ポータビリティ(持ち運びやすさ)の本質です。

仕組みの勘所

なぜ「軽いのに隔離されている」のか。土台の OSの仕組み が鍵です。

  • namespace(名前空間) — プロセスから見える範囲を仕切る。他のコンテナやホストが見えないので、独立して見える
  • cgroups — CPUやメモリなど使える資源に上限をかける。1つが暴走しても巻き込まれにくい
  • カーネルは共有 — 別OSを積まないので、起動は秒単位で軽い

つまりコンテナは「小さな仮想マシン」ではなく、隔離して資源制限したプロセスだと捉えると腑に落ちます。

⚠️ うまくいかないとき

  • イメージの肥大化 — 不要な物まで層に積むと重くなる(最小限の土台を選ぶ)
  • 状態の消失 — コンテナは使い捨て前提。消えて困るデータは外部(ボリューム等)へ
  • カーネル依存 — ホストと大きく異なるOSは共有カーネルでは動かせない
  • latest 頼み — バージョンを固定しないと、環境ごとに中身がずれて「動かない」が再発する

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. Dockerイメージが「レイヤ(層)」の積み重ねでできていることの利点として正しいのは?

2. Dockerfile の役割として最も正しいのは?

3. コンテナの隔離で「プロセスから見える範囲を仕切る」役割を担うのはどれ?

4. コンテナが軽量で速いのは なぜ?

5. イメージとコンテナの関係で正しいのは?

6. コンテナで「消えて困るデータ」の正しい扱いはどれ?

7. 作ったイメージを保管・配布する倉庫(Docker Hub など)を何と呼ぶか、カタカナで答えてください。

8. CPUやメモリなど「使える資源に上限」をかけ、1つのコンテナの暴走を他へ波及させないカーネルの仕組みを何と呼ぶか答えてください。