Docker完全ガイド:仕組みから基本コマンドまで図解で学ぶ

CHATGPT / AIChatGPTなどの生成AIを活用して運営・記事制作・更新を行っています。制作方針

Dockerの仕組み、仮想マシンとの違い、イメージとコンテナ、Dockerfile、Compose、基本コマンド、トラブル対応まで図解ベースで解説します。

Dockerfileからイメージを作り、同じ設計で複数の隔離コンテナを起動する階層図解

この記事でわかること

Dockerの概念から実用までを一通り押さえるための総合ガイドです。導入済みの人が仕組みを理解する用途にも向いています。

  • コンテナと仮想マシンの違い
  • Docker Engine、イメージ、コンテナの関係
  • 日常的に使う基本コマンドの位置づけ

おすすめ読者: Dockerをなんとなく使っている人、仕組みから整理して理解したい人。

読む前の注意: コンテナの動作はOS、CPUアーキテクチャ、Dockerの実行環境、bind mountや環境変数などにも左右されます。実行前に手元の条件と公式情報を確認してください。

🐳 Docker 完全ガイド — 図解付きで詳しく学ぶ

出典: Medium, DEV Community, Spacelift, ITcross, Qiita, Zenn, CircleCI などの複数の技術記事を総合
作成日: 2026年4月25日


目次

  1. Docker とは何か
  2. なぜ Docker が注目されるのか
  3. コンテナ VS 仮想マシン (VM)
  4. Docker のアーキテクチャ(構造図)
  5. Docker コンポーネントの詳細解説
  6. イメージ vs コンテナ — 根本的な違い
  7. Docker の内部動作 — docker run の裏側
  8. Layered Filesystem(階層ファイルシステム)
  9. 基礎知識: Namespaces と cgroups
  10. Docker の基本的な使い方の流れ
  11. Dockerfile の書き方
  12. Docker Compose 入門
  13. Docker ネットワークとボリューム
  14. よく使う Docker コマンド一覧
  15. Docker の活用法・活用シーン
  16. つまずきポイントと解決策
  17. まとめ

1. Docker とは何か

Docker は、アプリケーションと依存関係を「コンテナ」として配布・実行するプラットフォームです。同じイメージを使うと環境を再現しやすくなりますが、互換性やホスト側の設定が異なれば動作も変わります。

2013年にDocker社(旧dotCloud社)によってオープンソースとして公開されて以来、世界中のエンジニアに支持されています。

コンテナとは?

コンテナとは、アプリケーションとその実行に必要なライブラリや依存関係、設定をひとまとめにした隔離された実行環境です。

Linux上のLinuxコンテナはホストのLinuxカーネルを共有します。macOSのDocker Desktopと、WindowsのLinuxコンテナモードはLinux仮想マシン内で実行します。WindowsコンテナモードはWindows用のコンテナです。起動時間やメモリ使用量は、イメージ、設定、ホスト、ワークロードによって変わります。


2. なぜ Docker が注目されるのか

メリット説明
環境の再現性アプリと依存関係をまとめ、環境差による問題を減らしやすくする
軽量・高速VMとは実行方式が異なる。実際の起動時間や資源使用量は条件によって変わる
ポータビリティOS・CPUアーキテクチャ・カーネルなどが互換で、必要な設定もそろえば、同じイメージを利用できる
チーム開発の効率化共通のイメージと設定を使い、チームで環境をそろえやすくする
CI/CDとの親和性自動テストやデプロイのパイプラインに組み込みやすい

Docker が解決する課題 — "It works on my machine"

┌─────────────────────────────────────────────────────┐
│          伝統的な開発環境の課題                        │
├─────────────────────────────────────────────────────┤
│                                                     │
│   開発者AのPC           開発者BのPC     本番サーバー │
│   Python 3.9            Python 3.11    Python 3.8    │
│   Ubuntu 20.04          macOS 12       CentOS 7      │
│   MySQL 5.7             PostgreSQL     MySQL 8.0     │
│                                                     │
│           ↑ ↑ ↑                                     │
│   「環境がバラバラ → 不具合の温床」                │
│                                                     │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│              Docker 導入後                          │
├─────────────────────────────────────────────────────┤
│                                                     │
│   同じイメージ + 互換OS/CPU/設定 = 再現しやすい環境 │
│                                                     │
│   開発者A ◀── Docker Image ───▶ 開発者B            │
│         ───▶ 本番サーバー                            │
│   kernel・CPU・mount・環境変数の差は別途確認           │
│                                                     │
└─────────────────────────────────────────────────────┘

同じイメージを使っても、ホストのOSカーネル、CPUアーキテクチャ、bind mount、環境変数、実行時設定などが違えば挙動も変わることがあります。複数CPU向けのイメージや互換性の確認についてはDocker公式のmulti-platform build解説も参照してください。


3. コンテナ VS 仮想マシン(VM)

アーキテクチャ図で比較

┌──────────────────────────────────────────────────────────┐
│ Linux host + Docker Engine     │ Docker Desktop (Linux containers)│
│                                │                                 │
│ ┌───────────────────────────┐  │ ┌─────────────────────────────┐ │
│ │ Linux host kernel         │  │ │ macOS/Windows host          │ │
│ │   └ Docker Engine         │  │ │   └ Linux VM                │ │
│ │       ├ Container A       │  │ │       └ Linux kernel         │ │
│ │       └ Container B       │  │ │           └ Docker Engine    │ │
│ └───────────────────────────┘  │               ├ Container A   │ │
│                                │               └ Container B   │ │
│ Linux containers share the     │ Linux containers use the VM's   │
│ Linux host kernel              │ kernel, not the Mac/Windows one │
└────────────────────────────────┴─────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────┐
│ 仮想マシンは仮想化されたハードウェア上でゲストOSとカーネルを実行 │
│ コンテナは対応するホストカーネル機能を使ってプロセスを隔離       │
└──────────────────────────────────────────────────────────────────┘

比較表

項目Docker コンテナ仮想マシン(VM)
カーネルLinuxコンテナはLinuxカーネルを共有。Docker DesktopではLinux VMのカーネルを使う(Windows containersは別)各VMが独立したカーネルを持つ
起動時間起動時間はアプリ、イメージ、ホスト、実行方式によるゲストOSと設定による
リソース消費イメージ、プロセス、実行環境によるゲストOS、割当資源、ディスクイメージによる
隔離の境界カーネル機能を使ったプロセス・リソースの隔離。VMと同じ境界ではないゲストOSを含む仮想マシン単位
ファイルサイズ含まれるソフトウェアやデータによるゲストOSや保存データによる
性能オーバーヘッド実行環境やI/Oなどに左右される仮想化方式やワークロードに左右される

4. Docker のアーキテクチャ

Docker の全体構成図(High-Level Architecture)

┌───────────────────────────────────────────────────────────────────┐
│                        DOCKER ARCHITECTURE                         │
│                                                                     │
│  ┌────────────┐                                                   │
│  │ Docker CLI  │  ← ユーザーが操作するコマンドライン               │
│  │ (docker)   │     "docker run nginx" など                       │
│  └──────┬─────┘                                                   │
│         │ REST API (Unix Socket / TLS)                             │
│         ▼                                                         │
│  ┌────────────┐             ┌─────────────┐                      │
│  │  dockerd    │◀───────────▶│ Docker API  │   ← バックエンド    │
│  │  (Daemon)   │             │ Server      │                      │
│  │              │             └──────┬──────┘                      │
│  │ • コンテナ管理 │                    │                            │
│  │ • イメージ管理 │     ┌──────────────┴──────────────┐           │
│  │ • ネットワーク │     │          containerd         │           │
│  │ • ボリューム   │     │    (Container Runtime Mgr)  │           │
│  │ • 画像レジスト │     └──────────────┬──────────────┘           │
│  └──────────────┘                     │                            │
│                                       ▼                            │
│                              ┌──────────────────┐                  │
│                              │   containerd-shim  │  ← プロセス監視 │
│                              └──────────┬─────────┘                  │
│                                         │                           │
│                                         ▼                           │
│                              ┌──────────────────┐                  │
│                              │       runc         │  ← OCIランタイム │
│                              │ (コンテナ作成実行)  │                  │
│                              └──────────┬─────────┘                  │
│                                         │                           │
│                                         ▼                           │
│                              ┌──────────────────┐                  │
│                              │   Linux Kernel    │  ← カーネル機能  │
│                              │ • Namespaces      │   (隔離・制御)   │
│                              │ • cgroups         │   リソース管理   │
│                              │ • OverlayFS       │   ファイルシステム│
│                              │ • Network(veth)   │   ネットワーク   │
│                              └──────────────────┘                  │
│                                                                     │
└───────────────────────────────────────────────────────────────────┘

もう一つの視点 — コンポーネント相互作用図

                    ┌──────────────┐
       ユーザー ──▶│ Docker CLI   │
    (ターミナル操作)│  docker xxx  │
                    └──────┬───────┘
                           │ REST API
                           ▼
    ┌──────────────────────────────────────────┐
    │              dockerd (Daemon)            │
    │                                          │
    │  Docker API   ←→  Containerd             │
    │  (gRPC通信で連携)                          │
    │     │                                    │
    │     ├── Image Store                      │
    │     ├── Network Manager                  │
    │     └── Volume Manager                   │
    └──────────────────────────────────────────┘
                           │
                           ▼
              ┌─────────────────────┐
              │    containerd       │
              │  (ランタイム管理)    │
              │                     │
              │  containerd-shim → runc
              │          │         │
              │          ▼         ▼
              │      Kernel     Namespace
              │    cgroups     OverlayFS
              └─────────────────────┘

5. Docker コンポーネントの詳細解説

主要6コンポーネントの役割

① Docker CLI(コマンドラインインターフェース)

  • 役割: ユーザーがDockerを操作するためのターミナルツール
  • 動作: コマンドをREST APIリクエストに変換し、dockerdに送信
  • 例: docker run, docker build, docker images などのコマンド群
# ユーザーがCLIを通じてコマンドを入力
$ docker run -d --name myapp nginx:latest
# ↑ このCLIは docker にリクエストを送る

② dockerd(Docker Daemon / バックエンドサーバー)

  • 役割: Dockerの中心プロセス。すべてのAPIリクエストを処理
  • 詳細機能:
  • コンテナライフサイクル管理
  • イメージのビルドと管理
  • ネットワーク設定
  • ボリューム管理
  • 他のコンポーネント(containerdなど)への指示
  • 重要なポイント: dockerデーモンは常にバックグラウンドで稼働している必要がある
# デーモンの状態確認
$ systemctl status docker

# Dockerデーモンの設定ファイル
/etc/docker/daemon.json

③ containerd(コンテナランタイムマネージャー)

  • 役割: コンテナの実際のライフサイクルを管理
  • 詳細機能:
  • イメージのプル・プッシュ・保存
  • ファイルシステムスナップショット
  • コンテナの起動/停止
  • OCI Runtime Spec を containerd-shim に渡す
  • 技術: gRPC で Docker デーモンと通信
# containerd の状態確認
$ sudo systemctl status containerd

④ containerd-shim(プロセススーパーバイザー)

  • 役割: runc の前後でコンテナのプロセス監視を担当
  • 重要な特徴:
  • runc がプロセスを起動したらexitするため、代わりにshimが監視
  • dockerd/containerd が再起動しても、shimが存在すればコンテナは維持される
  • イオーストリーム(ログ出力など)の管理

⑤ runc(OCI標準ランタイム)

  • 役割: 実際に対応カーネル機能を使ってコンテナを生成する低レベルツール
  • 詳細機能:
  • Namespaces の作成
  • cgroups の制限適用
  • rootfs のマウント
  • エントリポイントの実行
  • 重要ポイント: runcは一度コンテナを作るとすぐにexitする(監視はshimが担当)
# runc自体が使われていることを確認(containerd内部で)
$ journalctl -u containerd

⑥ Linux Kernel(Linuxカーネル — コアの隔離機能)

機能説明
Namespacesプロセスの隔離。各コンテナは独立したPID、ネットワーク、ファイルシステムなどを見る
cgroupsリソース制限。CPU/メモリ/I/Oの使用量を制限・監視
OverlayFS階層ファイルシステム。イメージのレイヤを積層して管理
Network (veth)バーチャルイーサーネットペアにより、コンテナ間の通信を可能に

Airport(空港)アナロジー — 記憶するためのたとえ

┌───────────────────────────────────────────────────┐
│         🛫 Docker コンポーネント vs 空港            │
├──────────┬────────────┬───────────────────────────┤
│ コンポー- │ 空港での   │ 実際の意味               │
│ ねント   │ 役割       │                          │
├──────────┼────────────┼───────────────────────────┤
│ Docker CLI │ 旅客ターミ │ パッセンジャが「docker run」│
│          │ 널(ターミ)│ を入力する                │
│ dockerd   │ 空港管理   │ 全てのフライト/ゲートを管  │
│          │ センター    │ 理                         │
│ containerd│ グラウンド  │ ラグ(イメージ)の読み込   │
│          │ コントロール│ み、滑走路のアサイン       │
│ container- │ ギャtoff  │ プレインを準備。再始動   │
│ d-shim    │ 係員      │ しても機体を維持           │
│ runc     │ パイロット  │ 実際に飛行(コンテナ実行)   │
│ Linux Kernel │ 航空管  │ 空中交通制御(リソース限  │
│          │ 制 (ATC)   │ 制、衝突防止)             │
│ Container │ 実際のフ   │ 旅客が搭乗して飛ぶアプリ  │
│          │ ライト     │ ケーション                 │
└──────────┴────────────┴───────────────────────────┘

6. イメージ vs コンテナ — 根本的な違い

イメージ(Image)とコンテナ(Container)の関係を図解

┌───────────────────────────────────────────────────────────┐
│              イメージとコンテナの関係                        │
├───────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐                                          │
│   │  Dockerfile  │     "設計図を書く"                      │
│   │ (レシピ)     │                                          │
│   └──────┬──────┘                                          │
│          │ docker build                                     │
│          ▼                                                 │
│   ┌─────────────┐           イメージ(Image)             │
│   │  読取り専用   │    = 料理の「レシピ」                  │
│   │  ファイル   │                                            │
│   │  システム    │    ・ベースイメージ(食材)            │
│   └─────────────┘    ・RUN命令でレイヤ追加                │
│          │             (調理手順)                        │
│          │ docker run                                    │
│          ▼                                                 │
│   ┌─────────────┐           コンテナ(Container)         │
│   │  読み書き可能 │    = レシピで作った「料理」            │
│   │  実行環境    │                                            │
│   │  (Writable  │    ・実実行体                         │
│   │   Layer)    │    ・起動/停止/再開が可能              │
│   └─────────────┘    ・複数作成可能                        │
│          │                                                 │
│          ▼                                                 │
│   ══════════════════════════════════════════════════       │
│   イメージ(設計図) 1つ → コンテナ(実行体) 複数作成      │
│                                                     ║     │
│                                                   ┌┴┐    │
│                                                 ① │2│    │
│                                                    └┬┘   │
│       イメージ ◀─────────▶ [複数のコンテナ]              │
└───────────────────────────────────────────────────────┘

イメージとコンテナの比較表

項目Docker イメージ(Image)Docker コンテナ(Container)
性質読み取り専用テンプレート実行環境(インスタンス)
役割コンテナを作る設計図実際に動く実体
たとえレシピ(レシピ)レシピから作った料理
作成コマンドdocker build, docker pulldocker run, docker create
管理コマンドdocker images, docker rmidocker ps, docker stop
変更不可(イミュータブル)可能(書き込み層がある)
ライフサイクル静的・保存される起動/停止/再起動/破棄

7. Docker の内部動作 — docker run の裏側

docker run nginx を実行した時の全体フロー図

┌───────────────────────────────────────────────────────────────────┐
│              docker run -d -p 8080:80 nginx を実行!               │
│                                                                      │
│  [Step 1] CLI → dockerd                                             │
│  ┌──────────────────────┐                                          │
│  │ Docker CLI           │                                          │
│  │ "docker run ..."     │─ REST API ─▶ dockerd                    │
│  │ (Unix Socket経由)    │   JSONペイロード                           │
│  └──────────────────────┘                                          │
│                                                                      │
│  [Step 2] dockerd の検証                                           │
│  - コマンドの妥当性チェック                                        │
│  - ローカルイメージ有無の確認                                      │
│  - コンテナ作成の調整                                              │
│                                                                      │
│  [Step 3] イメージ Pull(必要な場合)                                │
│  ┌──────────────────────┐                                          │
│  │ containerd           │                                          │
│  │ • レジストリ認証      │──▶ Docker Hub                           │
│  │ • マニフェスト解決    │   "nginx" イメージを取得                 │
│  │ • Layer ダウンロード & │   → ローカルImage Storeに保存          │
│  │   検証               │                                          │
│  └──────────┬───────────┘                                          │
│             │                                                      │
│  [Step 4] ファイルシステム組み立て                                  │
│  containerd が準備:                                                │
│  • Snapshot (ファイルシステムスナップショット)                      │
│  • OverlayFS Upper/LowerDir 配置                                  │
│  • OCI Bundle(メタデータ/ランタイム設定)                          │
│                                                                      │
│  [Step 5] ネットワーク設定                                         │
│  dockerd が:                                                       │
│  • veth ペア作成                                                   │
│  • Host側を docker0 ブリッジに追加                                │
│  • コンテナにIP付与 (例: 172.17.0.2)                              │
│  • iptables DNAT (ポートフォワーディング: 8080→80)                │
│  • MASQUERADE ルール設定                                           │
│                                                                      │
│  [Step 6] containerd → containerd-shim                             │
│  containerd が:                                                    │
│  • shim を起動                                                     │
│  • OCI Spec を引き渡す                                             │
│  • ライフサイクル管理を委譲                                        │
│                                                                      │
│  [Step 7] shim → runc → Linux Kernel                               │
│  runc が:                                                          │
│  • Namespaces 作成 (PID, NET, MNT, USR, IPC, USER)                │
│  • rootfs マウント                                                  │
│  • cgroups 制限適用                                                 │
│  • コンテナエントリポイント実行                                    │
│  • **runc はexit(監視はshimが担当)**                               │
│                                                                      │
│  [Step 8] コンテナ実行完了                                         │
│  • shim がプロセスを監視                                           │
│  • dockerd がログストリーミング                                     │
│  • カーネルが隔離・リソース制限を適用                              │
│                                                                      │
│  ══════════════════════════════════════════════════                │
│  nginx コンテナがホストの8080番ポートで動作開始!                   │
└───────────────────────────────────────────────────────────────────┘

もう一つのフロー図(ステップバイステップ)

docker run -d -p 8080:80 nginx
         │
         ▼
┌──────────────────┐
│ Step 1: CLI       │
│ "docker run ..."  │
└───────┬──────────┘
        │ REST API (JSON)
        ▼
┌──────────────────┐
│ Step 2: dockerd   │
│ バリデーション    │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 3: Pull      │  ← ローカルにイメージがなければ
│ イメージ取得     │
│ (containerd)     │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 4: FS Assembly│
│ ファイルシステム   │
│ 組み立て         │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 5: Network   │
│ ポートマッピング  │
│ (8080:80)       │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 6: containerd│
│ → containerd-shim │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 7: runc      │
│ Namespaces,cgroups│
│ + カーネル実行    │
└───────┬──────────┘
        │
        ▼
┌──────────────────┐
│ Step 8: 実行完了! │
│ コンテナ動作開始   │
└──────────────────┘

8. Layered Filesystem(階層ファイルシステム)

Docker イメージのレイヤ構造図

┌─────────────────────────────────────────────────────┐
│              Layered Filesystem(OverlayFS)          │
│                                                       │
│  ┌───────────────────┐                                │
│  │  Container Layer   │ ◀─ 各コンテナに「書き込み」層 │
│  │  (読み書き可能)   │    が自動で追加される         │
│  └────────┬──────────┘                                │
│  ┌────────▼──────────┐                                │
│  │      Layer N       │ ◀─ RUN apt-get update          │
│  └────────┬──────────┘                                │
│  ┌────────▼──────────┐                                │
│  │      Layer N-1     │ ◀─ COPY ./app /app             │
│  └────────┬──────────┘                                │
│  ┌────────▼──────────┐                                │
│  │      ...           │                                │
│  └────────┬──────────┘                                │
│  ┌────────▼──────────┐                                │
│  │      Layer 2       │ ◀─ RUN pip install             │
│  └────────┬──────────┘                                │
│  ┌────────▼──────────┐                                │
│  │      Layer 1       │ ◀─ FROM python:3.12           │
│  └────────┬──────────┘                                │
│             ▼                                           │
│  ┌───────────────────┐                                │
│  │   共有されるレイヤ │ ◀─ 他のイメージとLayerを共有  │
│  └───────────────────┘    → ディスク節約              │
│                                                       │
│  OverlayFS の仕組み:                                   │
│  ┌──────────────┐                                     │
│  │  MergedDir   │ ◀─ コンテナから見える единое 文件系统 │
│  │ (統合表示)    │                                       │
│  └──────┬───────┘                                       │
│         ├─ UpperDir(変更/新規ファイル)                  │
│         └─ LowerDir(読み取り専用レイヤ群)              │
│                                                         │
└───────────────────────────────────────────────────────┘

レイヤの具体的なイメージ

Dockerfile:
  FROM python:3.12-slim      ← Layer 0 (ベース)
  WORKDIR /app               ← Layer 1
  COPY requirements.txt .    ← Layer 2
  RUN pip install -r ...     ← Layer 3
  COPY . .                   ← Layer 4

Dockerfile:
  FROM python:3.12-slim      ← Layer 0 (同じ!共有される)
  WORKDIR /app               ← Layer 1 (同じ!共有される)
  RUN apt-get update         ← NEW Layer (5番目)
  COPY . .                   ← NEW Layer

→ Layer 0,1 は両方のイメージで再利用される!!!

UnionFS の仕組み(CoW = Copy-on-Write)

┌─────────────────────────────────────────────┐
│        OverlayFS: Copy-on-Write 概要         │
│                                              │
│   LowerDir (read-only image layers)          │
│   ┌─────┐ ┌─────┐ ┌─────┐                  │
│   │Lay0 │ │Lay1 │ │Lay2 │                  │
│   └──┬──┘ └──┬──┘ └──┬──┘                  │
│      ╲       ╲       ╱                      │
│       ╲       ╲     ╱    ← 読み取りはLowerDirから  │
│        ╲       ╲   ╱                       │
│         ╲       ╲ ╱                        │
│          ╲_______╱                         │
│             ▲                               │
│             │ (ファイル変更時はコピー)      │
│             │                               │
│   UpperDir (writable layer for container)  │
│   ┌─────┐ ┌─────┐                          │
│   │NewFile│ │Modfied│                        │
│   └─────┘ └─────┘                          │
│                                              │
│  MergedDir (コンテナに見える единое filesystem) │
│  All files from Lower + Upper combined        │
│                                              │
└───────────────────────────────────────────────┘

9. 基礎知識: Namespaces と cgroups

9-1. Namespaces(名前空間)— 隔離の仕組み

┌──────────────────────────────────────────────────────────┐
│              Linux Namespaces — 仮想化された「視点」       │
│                                                            │
│  プロセスはclone(CLONE_NEWNS | CLONE_NEWPID | ...) を    │
│  呼び出すことで、独立したビューを取得する                   │
│                                                            │
│  ┌──────────────────┐      ┌──────────────────┐         │
│  │ ホスト OS での視点 │      │ コンテナAの視点   │         │
│  │                  │      │ (PID Namespace)  │         │
│  │ PID 1: dockerd   │      │ PID 1: myapp     │         │
│  │ PID 2: sshd      │      │ PID 2: worker    │         │
│  │ PID 3: nginx     │      │                  │         │
│  │ PID 4: app       │      │  "PID 1"以外を   │         │
│  │ ...              │      │  見えない!       │         │
│  └──────────────────┘      └──────────────────┘         │
│                                                            │
│  ┌──────────────────┐      ┌──────────────────┐         │
│  │ ネットの世界 (Host)│      │ ネットの世界 (C1) │         │
│  │ docker0: 172.17.0.1│     │ eth0: 172.17.0.2 │         │
│  │ lo: 127.0.0.1     │     │ lo: 127.0.0.1    │         │
│  └──────────────────┘      └──────────────────┘         │
│                                                            │
│  6種類のNamespace                                            │
│  ┌────────────────────────────────────────────────────┐  │
│  │  PID    │ プロセスID空間を隔離                       │  │
│  │  NET    │ ネットワークスタック・IPを独立             │  │
│  │  MNT    │ マウントポイント(ファイルシステム)        │  │
│  │  USR    │ ユーザー/グループ ID を分離               │  │
│  │  IPC    │ Inter-Process Communication を隔離        │  │
│  │  UTS    │ ホスト名・ドメイン名を独立                 │  │
│  └────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────┘

9-2. cgroups(コントロールグループ)— リソース制限の仕組み

┌──────────────────────────────────────────────────────────┐
│              cgroups — CPU/メモリ/I/O 制御               │
│                                                            │
│  /sys/fs/cgroup/                                           │
│  └── docker/                                               │
│       ├── container1/                                      │
│       │   ├── cpu.cfs_quota_us     → CPU制限              │
│       │   ├── memory.limit_in_bytes → メモリ制限           │
│       │   ├── blkio.weight          → I/O優先度           │
│       │   └── ...                                             │
│       └── container2/                                      │
│           ├── cpu.cfs_quota_us      → CPU 50%             │
│           ├── memory.limit_in_bytes → 256MB               │
│           └── ...                                             │
│                                                            │
│  ┌───────────────────────────────────────────────┐       │
│  │  cgroup の役割                                   │       │
│  ├───────────────────────────────────────────────┤       │
│  │ ① リソース制限    → CPU/メモリ/I/Oの上限設定   │       │
│  │ ② 使用量追跡      → どのコンテナがどれだけ使用 │       │
│  │ ③ オーバーコミット防止 → 1つのコンテナがHostを  │       │
│  │                        圧迫しないよう保護        │       │
│  └───────────────────────────────────────────────┘       │
│                                                            │
│  例: docker run --memory=512m --cpus=0.5 myapp            │
│      ↑ これによって cgroup に制限が記録される              │
└──────────────────────────────────────────────────────────┘

Namespaces と cgroups を合わせた全体図

┌─────────────────────────────────────────────────────────────┐
│                 Linux カーネルレベルの隔離                    │
│                                                               │
│  ┌───────────┐    ┌───────────┐    ┌───────────┐          │
│  │ Namespace  │    │ Namespace  │    │ Namespace  │          │
│  │ (PID)     │    │ (NET)      │    │ (MNT)     │          │
│  │ "PID1=app" │    │ "eth0"    │    │ "/app"    │          │
│  └─────┬─────┘    └─────┬─────┘    └─────┬─────┘          │
│        │                │                 │                  │
│   ┌────▼────────────────▼─────────────────▼──────┐         │
│   │              cgroups (リソース制御)            │         │
│   │                                              │         │
│   │  cpu:     CPUS.limit = 0.5                  │         │
│   │  memory:  limit = 512MB                     │         │
│   │  blkio:   weight = 500                      │         │
│   └──────────────────┬─────────────────────────┘          │
│                      │                                      │
│            ┌─────────▼──────────┐                           │
│            │    コンテナ実行     │                           │
│            │ (プロセス動作)     │                           │
│            └────────────────────┘                           │
│                                                               │
│  ※ ホスト上でも同じPID/Net/MNTを見られる!                    │
│     = 他のコンテナからは完全に隔離!                            │
└─────────────────────────────────────────────────────────────┘

10. Docker の基本的な使い方の流れ

全体のライフサイクル図

┌───────────────────────────────────────────────────────────┐
│                    Docker の全体ライフサイクル              │
│                                                             │
│   ┌──────────┐     ┌──────────────┐     ┌──────────────┐  │
│   │ イメージ  │ ──▶ │    コンテナ   │ ──▶ │   コンテナ   │  │
│   │ (Image)   │     │   (Running)   │     │ (Stopped)   │  │
│   └──────────┘     └──────┬───────┘     └──────┬───────┘  │
│      ▲                     │                     │           │
│      │                      │                    ▼           │
│      │                   docker stop              │           │
│      │                                     docker rm       │
│      │                                     (削除)            │
│      │                                                      │
│   ┌──┴─────────────────────────────────────────────────┐  │
│   │                                                  Docker Hub                       │
│   │  pull / push                                      │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│  流れ:                                                     │
│  1. Dockerfile でレシピを書く                             │
│  2. docker build でイメージを作成                            │
│  3. docker run でコンテナを起動                              │
│  4. docker stop / rm で停止・削除                         │
└───────────────────────────────────────────────────────────┘

基本的な使い方の例

# Step 1: イメージを取得(Docker Hubから)
$ docker pull nginx

# Step 2: コンテナを起動
$ docker run -d -p 8080:80 --name my-web nginx

# Step 3: 実行中のコンテナを確認
$ docker ps

# Step 4: コンテナのログを見る
$ docker logs my-web

# Step 5: コンテナ内でコマンドを実行
$ docker exec -it my-web /bin/bash

# Step 6: コンテナを停止
$ docker stop my-web

# Step 7: コンテナを削除
$ docker rm my-web

11. Dockerfile の書き方

Dockerfile とは?

Dockerfile は、Docker イメージをビルドするための設計図(レシピ)です。
どのベースイメージを使うか、どのようなパッケージをインストールするか、
どのようなコマンドを実行するかなど、すべての手順を記述します。

Dockerfile の基本構文

# ベースイメージの指定
FROM python:3.12-slim

# コンテナ内の作業ディレクトリを設定
WORKDIR /app

# ホストのファイル(requirements.txt)をコピー
COPY requirements.txt .

# パッケージインストールを実行(レイヤが作成される)
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーション本体をコピー
COPY . .

# コンテナが listen するポートを宣言
EXPOSE 5000

# コンテナ起動時に実行するデフォルトコマンド
CMD ["python", "app.py"]

Dockerfile の主要命令(Instruction)一覧

命令意味例
FROMベースとなるイメージを指定FROM python:3.12-slim
RUNイメージビルド時にコマンドを実行RUN apt-get update
CMDコンテナ起動時のデフォルトコマンドCMD ["python", "app.py"]
COPYホストのファイルをコンテナにコピーCOPY . /app
ENTRYPOINTコンテナ起動時に実行。上書き不可ENTRYPOINT ["/run.sh"]
WORKDIR作業ディレクトリを指定WORKDIR /app
EXPOSEポートを宣言(実際には開かない)EXPOSE 8080
ENV環境変数を設定ENV NODE_ENV=production
ADDURLダウンロードなど COPY の上位互換ADD https://... .
ARGビルド時に渡す変数ARG VERSION=1.0
VOLUMEボリュームをマウントVOLUME /data
USER実行ユーザーを指定(セキュリティ向上)USER appuser

Dockerfile を使ったイメージのビルドとコンテナ起動

# イメージをビルド(Dockerfileから)
$ docker build -t my-python-app .

# ビルドしたイメージからコンテナを起動
$ docker run -d -p 5000:5000 --name myapp my-python-app

# ブラウザで確認
# http://localhost:5000

Dockerfile のベストプラクティス

# ❌ ベストプラクティスに反する例
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3
COPY app.py /app.py
CMD ["python", "/app.py"]

# ✅ ベストプラクティスに従った例(軽量でセキュア)
FROM python:3.12-slim  # slimバージョンでサイズ削減

WORKDIR /app           # 作業ディレクトリ設定

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt  # キャッシュ削除でサイズ削減

COPY . .               # アプリコードをコピー(RUNと分離してキャッシュ活用)

EXPOSE 5000            # ポート宣言

USER appuser           # rootではなく一般ユーザーで実行(セキュリティ)

CMD ["python", "app.py"]

Dockerfile のベストプラクティスまとめ

✅ やるべきこと❌ やらないべきこと
-slim または -alpine を使う巨大なベースイメージ
RUN は && でつなぐ1行=1 RUN 命令(レイヤ増)
キャッシュを意識(変更頻度の低いものを先に)全部を最後にCOPY
.dockerignore を使う.git や node_modules を含める
USER で一般ユーザーに切り替えRootで実行

12. Docker Compose 入門

Docker Compose とは?

Docker Compose は、複数のコンテナで構成されるアプリケーションを定義・管理するためのツールです。
YAML形式の設定ファイル(docker-compose.yml)に構成を記述し、1つのコマンドで全コンテナを操作できます。

なぜ Docker Compose が必要なのか?

┌─────────────────────────────────────────────────────┐
│  単一コンテナ vs 複数コンテナ(Docker Compose)       │
├─────────────────────────────────────────────────────┤
│                                                     │
│   単一コンテナ:                                     │
│   $ docker run -d -p 8080:80 nginx                 │
│   $ docker run -d -e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" mysql:8.0 │
│   $ docker run -d --link ... myapp                │
│             ↑ コンテナごとにコマンド!               │
│                                                     │
│   Docker Compose:                                   │
│   $ docker compose up -d                            │
│             ↑ 1つのコマンドで全サービス一斉起動!    │
│                                                     │
│   Web + DB + Cache の構成をまとめて起動              │
└─────────────────────────────────────────────────────┘

docker-compose.yml の基本構造

# docker-compose.yml
version: '3.8'

services:                          # 各サービス(コンテナ)の定義
  web:                             # Webサーバー(Nginx)
    image: nginx:latest            # イメージを指定
    ports:                         # ポートマッピング
      - "8080:80"                # ホスト:8080 → コンテナ:80
    volumes:                       # ボリューム(ファイル共有)
      - ./html:/usr/share/nginx/html
    depends_on:                    # 起動順序の制御
      - app

  app:                             # アプリケーション
    build: .                       # カレントディレクトリのDockerfileからビルド
    ports:                         # ポート公開
      - "5000:5000"
    depends_on:                    # DBの起動順を指定(準備完了までは保証しない)
      - db
    environment:                   # 環境変数
      - FLASK_ENV=development

  db:                              # データベース
    image: mysql:8.0             # MySQL 8.0 イメージ
    environment:                   # 環境変数で初期設定
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?Set MYSQL_ROOT_PASSWORD in your local environment}
      MYSQL_DATABASE: myapp
    volumes:                       # ボリュームでデータを永続化
      - db-data:/var/lib/mysql

volumes:                             # 永続ストレージの定義
  db-data:                           # dbサービスのデータを保存

Composeはシェルの環境変数またはプロジェクトの.envから値を読み込みます。パスワードを含む.envはリポジトリへ登録しないでください。

Docker Compose の基本コマンド

コマンド用途例
docker compose up -d全サービスをバックグラウンドで起動最も基本的な使い方
docker compose down全サービスを停止・削除
docker compose logs全サービスのログを確認
docker compose psサービスの稼働状況を確認
docker compose exec web bash特定のサービスにシェルでアクセス
docker compose buildイメージを再ビルド
docker compose restart全サービスを再起動

Docker Compose の主要設定項目

フィールド用途例
image既存イメージを使用redis:7-alpine
buildDockerfileからビルドbuild: ./backend
portsポートマッピング- "3000:3000"
volumesデータの永続化/共有- ./data:/data
environment環境変数- DEBUG=true
depends_on起動順序制御depends_on: [db]

13. Docker ネットワークとボリューム

13-1. Docker ネットワーク

┌───────────────────────────────────────────────────────────┐
│                Docker ネットワークの構造                   │
│                                                             │
│  ホスト (Docker Host)                                      │
│  ┌─────────────────────────────────────┐                  │
│  │  docker0 (ブリッジネットワーク)      │                  │
│  │  IP: 172.17.0.1/16                 │                  │
│  │                                     │                  │
│  │  ┌───┐    ┌──────┐   ┌──────────┐ │                  │
│  │  │C1 │    │ C2   │   │  C3      │ │                  │
│  │  │eth0│    │eth0  │   │ eth0     │ │                  │
│  │  │172.│    │172.  │   │ 172.     │ │                  │
│  │  │ .0. │    │ .0.  │   │  .0.     │ │                  │
│  │  └───┘    └──────┘   └──────────┘ │                  │
│  └──────────────┬────────────────────┘                  │
│                  │ veth pairs (仮想イーサーネット)        │
│                  ▼                                        │
│             ホストOSの物理 NIC                            │
│                                                             │
│  ネットワークタイプ:                                      │
│  • bridge   → 個々コンテナ間のブリッジ                    │
│  • host     → ホストのネットワークを直接使用               │
│  • overlay  → マルチホム環境(Docker Swarm, K8s)        │
│  • none     → ネットワークなし                            │
└───────────────────────────────────────────────────────┘

13-2. Docker ボリューム

┌──────────────────────────────────────────────────────────────┐
│                    Docker ボリューム(永続ストレージ)          │
│                                                                │
│  ┌───────────────────────┐                                   │
│  │     コンテナA         │    ← コンテナを停止/削除しても...   │
│  │  ┌─────────────────┐  │      データは保たれる!           │
│  │  │ /app/data (tmp)  │  │                                   │
│  │  └─────────────────┘  │    ↔ 一方、通常ファイルは削除される │
│  │                         │                                 │
│  │  ⚠ 通常ファイル = コンテナ削除時消去                       │
│  │  ✅ ボリューム     = 永続化する                            │
│  └───────────┬───────────┘                                   │
│              │                                                │
│              ▼                                                │
│  ┌───────────────────────┐                                   │
│  │   ホスト上のボリューム   │    ← 実際にデータが保存される場所  │
│  │   /var/lib/docker/v/  │                                        │
│  │   my-data/_data/      │                                          │
│  └───────────────────────┘                                        │
│                                                                       │
│  ボリュームのメリット:                                               │
│  • コンテナを再起動してもデータが保持                                │
│  • データベースなどに適した永続ストレージ                              │
│  • ホストとの共有(docker run -v /host:/container)                   │
└─────────────────────────────────────────────────────┘

14. よく使う Docker コマンド一覧

オススメのコマンドリファレンス集

イメージ操作

コマンド用途
docker imagesローカルにあるイメージの一覧を表示
docker pull nginxイメージをDocker Hubから取得
docker build -t myapp .Dockerfileからイメージをビルド
docker rmi nginxイメージを削除
docker tag myapp:latest user/myapp:v1.0イメージにタグ(名前)をつける
docker push user/myapp:v1.0イメージをDocker Hubに公開

コンテナ操作

コマンド用途
docker run -d -p 8080:80 nginxイメージからコンテナを作成して起動
docker ps実行中のコンテナ一覧を表示
docker ps -a全コンテナ(停止含む)一覧
docker stop mycontainerコンテナを停止
docker start mycontainer停止したコンテナを開始
docker restart mycontainerコンテナを再起動
docker rm mycontainerコンテナを削除
docker exec -it mycontainer bashコンテナ内でコマンドを実行

ログ・情報

コマンド用途
docker logs mycontainerコンテナのログを表示
docker logs -f mycontainerリアルタイムでログをフォロー
docker inspect mycontainer詳細情報をJSON形式で表示
docker top mycontainerコンテナのプロセス一覧

Docker Compose

コマンド用途
docker compose up -d全サービス起動(バックグラウンド)
docker compose down全サービスを停止・削除
docker compose logs全サービスのログ
docker compose psサービスの稼働状況
docker compose exec web bash特定のサービスにアクセス
docker compose buildイメージを再ビルド

15. Docker の活用法・活用シーン

Dockerがよく使われる主要5つのシナリオ

┌───────────────────────────────────────────────────────┐
│              Dockerの代表的な活用法                       │
├───────────────────────────────────────────────────────┤
│                                                       │
│  シーン ①: ローカル開発環境の統一                     │
│  ─────────────────────────                          │
│  • チーム全員が同じ開発環境を共有                      │
│  • OS・言語・ミドルウェアなどの環境差を小さくしやすい      │
│                                                       │
│  シーン②: CI/CDパイプライン                           │
│  ─────────────────────────                          │
│  • GitHub Actions / Jenkins と組み合わせ              │
│  • コードのプッシュ→自動テスト→ビルド→デプロイ       │
│  • テスト環境もコンテナで再現                         │
│                                                       │
│  シーン③: マイクログサービスアーキテクチャ            │
│  ─────────────────────────                          │
│  • 大きなアプリを小さな独立サービスに分割             │
│  • 各サービスを個別のコンテナとして運用               │
│  • 独立デプロイ・スケーリングが可能                   │
│                                                       │
│  シーン④: データベーステスト環境構築                   │
│  ─────────────────────────                          │
│  • MySQL / PostgreSQL / MongoDB の検証環境を用意      │
│  • テスト後に不要なコンテナを削除できる               │
│  • 接続先・volumeを分け、本番データとの誤接続を防ぐ    │
│                                                       │
│  シーン⑤: レガシーシステムのモダナイゼーション          │
│  ─────────────────────────                          │
│  • 互換性を確認した古い環境をコンテナ内に再現         │
│  • kernel・CPU・volumeなどホスト側の条件も確認         │
└───────────────────────────────────────────────────────┘

16. つまずきポイントと解決策

よくあるエラーと対処法

エラー ①: Permission Denied(権限エラー)

# 症状: "permission denied" が出る
# 原因: ユーザーが docker グループに入っていない

# 解決策:
$ sudo usermod -aG docker $USER
# → 再ログイン

権限の注意: Docker Engineのrootful構成では、dockerグループのメンバーはroot相当の権限を得ます。信頼できるユーザーだけを追加してください。root権限を避けたい場合はDocker rootless modeを検討します。

エラー ②: ポート競合(Port Already in Use)

# 症状: "port is already allocated"
# 原因: 指定したポートが既に使用中

# 解決策:
# 別のポートを割り当てる
$ docker run -p 8081:80 nginx

# または競合しているプロセスを停止

エラー ③: コンテナ即終了

# 症状: コンテナが起動後すぐに終了
# 状態・終了コード・エラーとログを確認
$ docker inspect --format='{{.State.Status}} {{.State.ExitCode}} {{.State.Error}}' mycontainer
$ docker logs mycontainer

エラー ④: ディスク容量の不足

# 症状: "no space left on device"

# まず使用量を確認
$ docker system df

使用量を確認してから、不要な対象を選んで個別に削除します。docker system pruneは停止中コンテナ、未使用ネットワーク、dangling image、build cacheを削除対象にし、-aを付けると未使用イメージも対象になります。実行前に公式の削除対象を確認し、再取得・再buildできるものだけを選んでください。

````bash # 削除対象を確認し、不要と判断したIDだけを削除 docker ps -a docker image ls docker volume ls docker container rm docker image rm # volume内のデータが不要と確認できた場合だけ実行 docker volume rm ````

17. まとめ

Docker 全体を振り返る

┌─────────────────────────────────────────────────────────────┐
│                   Docker の全体まとめ                          │
│                                                               │
│  ┌───────────────────────────────────────────────────────┐  │
│  │             Docker コンテナエコシステム                  │  │
│  │                                                       │  │
│  │  Docker Hub / Registry                                │  │
│  │     │  ◀ イメージのやり取り                            │  │
│  │  ▼                                                   │  │
│  │  Dockerfile → イメージ(設計図/ビルド済み)              │  │
│  │     │                                                │  │
│  │  docker run                                          │  │
│  │     │                                                │  │
│  │  コンテナ(実際の動作環境: アプリ+ランタイム+ライブラリ) │  │
│  │                                                       │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                               │
│  ✅ Docker のポイント:                                       │
│   • イメージは「設計図」、コンテナは「実行体」                │
│   • LinuxコンテナはLinux kernelを共有                                  │
│   • Docker DesktopはLinux VM内で実行                                   │
│   • Namespaces と cgroups が隔離とリソース制御を実現         │
│   • Dockerfile でイメージを作成、Compose で複数管理          │
│   • CI/CD・マイクロサービス・テスト環境など多様な活用        │
│                                                               │
│  🚀 次のステップ:                                            │
│   1. Dockerの基本操作をハンズオンで練習                         │
│   2. Dockerfile の自作                                        │
│   3. Docker Compose で複数コンテナ                            │
│   4. Kubernetes / AWS ECS へ                                  │
└───────────────────────────────────────────────────────────────┘

参考URL:
- Docker Fundamentals (Medium)
- Docker internals deep dive (DEV Community)
- Docker Architecture Overview (Spacelift)
- Docker チュートリアル完全ガイド (ITcross)
- Dockerの基本用語解説 (docker.lock-life.com)
- Docker Tutorial 2025 (QuashBugs)
- How Docker Containers Actually Work (Atmosly)
- Docker Image vs Container (CircleCI)
- 初学者向け docker 基礎 (Qiita)
- Dockerの基本用語解説 (Qiita)

Docker公式資料の確認日: 2026年10月2日。Multi-platform builds、Networking on Docker Desktop、Install Docker Desktop on Windows、Linux post-installation、Docker Engine security、docker system prune。

よくある質問

Dockerは仮想マシンの代わりですか?

近い用途で使われますが、仕組みは異なります。LinuxコンテナはLinuxカーネルの機能でプロセスなどを隔離します。Docker DesktopでLinuxコンテナを使う場合はLinux VMが間に入ります。

まず覚えるべきコマンドは?

docker run、docker ps、docker images、docker logs、docker exec、docker stopから始めると実務で困りにくいです。

学習時につまずきやすい点は?

イメージとコンテナの違い、ボリューム、ポート公開、権限周りでつまずきやすいです。この記事内の該当部分を行き来しながら確認してください。

表を拡大

左右にスワイプして読めます