LESSON 30分

Dockerのアーキテクチャ

ストーリー

「コンテナの概要はわかりました。でも、Dockerって具体的にどう動いてるんですか?」

村上先輩がホワイトボードに図を描き始めた。

「いい質問だ。Dockerはクライアント・サーバーモデルで動いている。 ターミナルで docker コマンドを打つと、裏側で Docker デーモンというサーバーが 実際の処理を行っているんだ」

「つまり、コマンドを打つ側と実行する側は別なんですね」

「その通り。さらに、イメージを保存・配布するレジストリという仕組みもある。 この3つの関係を理解すれば、Dockerの全体像が見えてくるよ」


Docker のアーキテクチャ概要

Docker は クライアント・サーバーモデル で構成されています。

┌────────────────┐     REST API      ┌────────────────┐
│                │  ───────────────→  │                │
│  Docker Client │                   │  Docker Daemon │
│  (docker CLI)  │  ←───────────────  │  (dockerd)     │
│                │                   │                │
└────────────────┘                   └───────┬────────┘
                                            │
                                            │ pull/push
                                            ↓
                                    ┌────────────────┐
                                    │                │
                                    │   Registry     │
                                    │ (Docker Hub等)  │
                                    │                │
                                    └────────────────┘

3つの主要コンポーネント

コンポーネント役割具体例
Docker Clientユーザーがコマンドを入力するインタフェースdocker build, docker run
Docker Daemonコンテナの作成・管理を行うバックグラウンドプロセスdockerd
Registryイメージを保存・配布するリポジトリDocker Hub, Amazon ECR, GitHub Container Registry

Docker Client

Docker CLI(コマンドラインインタフェース)は、Docker Daemon に REST API 経由でリクエストを送信します。

bash
# これらのコマンドはすべて Docker Daemon への API リクエストに変換される
docker build -t myapp .           # イメージをビルド
docker run -d -p 3000:3000 myapp  # コンテナを起動
docker ps                          # 実行中のコンテナを一覧表示
docker stop <container_id>         # コンテナを停止

通信の流れ

ユーザー → docker run myapp
            ↓
Docker Client → POST /containers/create (REST API)
            ↓
Docker Daemon → コンテナを作成・起動
            ↓
結果を返す → ユーザーに表示

Docker Daemon (dockerd)

Docker Daemon は、コンテナのライフサイクル全体を管理するプロセスです。

主な責務

  1. イメージの管理: ビルド、プル、プッシュ
  2. コンテナの管理: 作成、起動、停止、削除
  3. ネットワークの管理: コンテナ間通信の設定
  4. ボリュームの管理: データの永続化

containerd と runc

Docker Daemon の内部は、さらに細かいコンポーネントに分かれています。

┌──────────────────────────────────┐
│          Docker Daemon            │
│  ┌────────────────────────────┐  │
│  │       containerd            │  │
│  │  ┌──────────────────────┐  │  │
│  │  │       runc            │  │  │
│  │  │  (コンテナを実際に起動)  │  │  │
│  │  └──────────────────────┘  │  │
│  └────────────────────────────┘  │
└──────────────────────────────────┘
コンポーネント役割
Docker Daemon上位のAPI処理、イメージ管理
containerdコンテナのランタイム管理(OCI準拠)
runc実際にLinux名前空間とcgroupsを設定してコンテナを起動

Registry(レジストリ)

レジストリは、Docker イメージを保存・配布する場所です。

Docker Hub

Docker Hub は、デフォルトの公開レジストリです。

bash
# Docker Hub からイメージを取得
docker pull nginx:1.25

# Docker Hub にイメージをプッシュ
docker push myuser/myapp:1.0

主なレジストリサービス

レジストリ特徴
Docker Hubデフォルト。公開イメージが豊富
Amazon ECRAWSのプライベートレジストリ
Google Artifact RegistryGCPのレジストリ
GitHub Container RegistryGitHubと統合されたレジストリ
Azure Container RegistryAzureのプライベートレジストリ

イメージの命名規則

[レジストリ]/[名前空間]/[リポジトリ]:[タグ]

例:
docker.io/library/nginx:1.25      # Docker Hub の公式イメージ
ghcr.io/myorg/myapp:latest        # GitHub Container Registry
123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:v1.0  # Amazon ECR

Docker オブジェクト

Docker が管理する主要なオブジェクトを整理しましょう。

オブジェクト説明
イメージコンテナの設計図(読み取り専用テンプレート)nginx:1.25, node:20-alpine
コンテナイメージから作成された実行インスタンス稼働中のWebサーバー
ボリュームデータを永続化する仕組みデータベースファイル
ネットワークコンテナ間の通信を制御する仕組みbridge, host, overlay

Docker のインストール確認

Docker がインストールされているか確認してみましょう。

bash
# Docker のバージョン確認
docker version

# Docker の詳細情報
docker info

# Docker Daemon が動作しているか確認
docker ps

docker version の出力例:

Client:
 Version:           24.0.7
 API version:       1.43
 Go version:        go1.21.3
 OS/Arch:           linux/amd64

Server: Docker Engine - Community
 Engine:
  Version:          24.0.7
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.21.3
  OS/Arch:          linux/amd64

まとめ

ポイント内容
アーキテクチャクライアント・サーバーモデル(CLI + Daemon + Registry)
Docker ClientユーザーコマンドをREST APIに変換
Docker Daemonコンテナ・イメージ・ネットワーク・ボリュームを管理
Registryイメージの保存・配布場所(Docker Hub等)
内部構造containerd + runc でコンテナを実行

チェックリスト

  • Docker のクライアント・サーバーモデルを理解した
  • Docker Client、Daemon、Registry の役割を説明できる
  • containerd と runc の関係を理解した
  • レジストリの種類を把握した

次のステップへ

次のセクションでは、Docker イメージとコンテナの関係を深く掘り下げます。 イメージのレイヤー構造や、コンテナのライフサイクルを学びましょう。


推定読了時間: 30分