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

概要 — まず全体をつかむ

「自分のPCでは動くのに、本番サーバでは動かない」——この定番のつまずきを無くす道具が コンテナ、そしてそれを扱う代表的な仕組みが Docker です。

詳細 — 1段階ずつ追う

これは何をする係?

コンテナは、アプリ本体と、それが動くのに必要な環境(※1 ライブラリなどの部品)を、まとめて1つの箱に詰める仕組みです。

引っ越しにたとえると、家具を1つずつ運ぶのではなく、中身ごと箱に詰めて そのまま運ぶイメージ。箱の中は行き先が変わっても同じなので、どこでも同じように動きます

Docker はこの箱を作ったり動かしたりするための、いちばん有名な道具です。

登場人物メモ:

  • ※1 環境 — アプリが動くのに必要な部品一式(ライブラリ・設定など)
  • ※2 カーネル — OSの中核。ハードウェアとのやり取りを担う土台の部分
この部分をもっと深く(中級

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

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

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

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

登場人物メモ:

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

仕事の流れ

  1. アプリと必要な環境を箱に詰める(設計図を書く)
  2. 箱をそのまま別の場所へ運ぶ(開発PC → 本番サーバなど)
  3. どこでも同じ状態で起動する
  4. 要らなくなったら箱ごと捨てる(後片付けが簡単)
この部分をもっと深く(中級
  1. Dockerfile(手順書)にアプリと環境の作り方を書く
  2. それをビルドしてイメージ(設計図)を作る
  3. イメージをレジストリ(※3 倉庫)へ push(アップロード)する
  4. 使う場所で pull(ダウンロード)し、run でコンテナとして起動する

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

VMとの違い

同じ「隔離して動かす」でも、仮想マシン(VM) はゲストOSを丸ごと積むため重くなります。コンテナは OSの中核(※2 カーネル)を土台と共有し、上にアプリと必要な部品だけを載せるので、軽くて起動も速いのが特長です。

アニメーション『VMとコンテナの違い』を開く
仮想マシン(VM)OSをまるごと積む=重いコンテナカーネルを共有=軽い仮想マシン1アプリゲストOS(フルOS)仮想マシン2アプリゲストOS(フルOS)仮想マシン3アプリゲストOS(フルOS)ハイパーバイザハードウェアコンテナ1アプリ+必要な部品だけコンテナ2アプリ+必要な部品だけコンテナ3アプリ+必要な部品だけコンテナエンジンホストOSカーネルを全コンテナで共有ハードウェアVMはゲストOSごと積むので重い/コンテナはホストのカーネルを共有しOSを積まないので軽い
この部分をもっと深く(中級

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

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

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

⚠️ うまくいかないとき

  • 箱に入れ忘れ — 必要な部品を詰め忘れると、別の場所で動かない
  • データが消える — 箱を捨てると中のデータも消える(保存先は別に分ける必要がある)
  • 軽い=万能ではない — カーネルを共有するため、土台と大きく違う環境向けには不向きなこともある
この部分をもっと深く(中級
  • イメージの肥大化 — 不要な物まで層に積むと重くなる(最小限の土台を選ぶ)
  • 状態の消失 — コンテナは使い捨て前提。消えて困るデータは外部(ボリューム等)へ
  • カーネル依存 — ホストと大きく異なるOSは共有カーネルでは動かせない
  • latest 頼み — バージョンを固定しないと、環境ごとに中身がずれて「動かない」が再発する

理解度チェック

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

1. コンテナを一言でいうと?

2. コンテナが仮想マシン(VM)より軽くて速いのはなぜ?

3. コンテナが「箱に詰める」ものとして正しいのは?

4. 文中の「Docker」の説明として最も近いのは?

5. コンテナ(箱)を捨てるとき、気をつけるべきことは?

6. 「コンテナは軽いけれど万能ではない」と言えるのはなぜ?

7. OSの中核で、ハードウェアとのやり取りを担う土台の部分を何と呼ぶか、カタカナで答えてください。コンテナはこれをホストと共有する。

8. コンテナと違ってゲストOSを丸ごと積むため重くなる、もう一つの「隔離して動かす」やり方を何と呼ぶか。英字2文字でも可。