Dockerアーキテクチャ

Docker Engine、containerd、runc の関係

アーキテクチャ全体像

docker CLI

ユーザーインターフェース。REST APIでdockerdと通信

↓ Docker API (REST)
Docker Engine (dockerd)

デーモンプロセス。イメージ管理、ネットワーク、ボリューム管理

↓ gRPC
containerd

コンテナランタイム。コンテナのライフサイクル管理

runc

OCI準拠のローレベルランタイム。実際にコンテナを起動

Linux Kernel

namespace(分離)、cgroups(リソース制限)、Union FS

コンポーネント詳細

Docker Engine (dockerd)

  • • Docker APIを提供するデーモン
  • • イメージのビルド、プル、プッシュ
  • • ネットワーク作成・管理
  • • ボリューム管理
  • • containerdにコンテナ操作を委譲

containerd

  • • CNCF卒業プロジェクト
  • • コンテナのライフサイクル管理
  • • イメージの保存・配布
  • • Kubernetesでも直接使用可能(CRI)
  • • Docker非依存で動作可能

runc

  • • OCI(Open Container Initiative)準拠
  • • 実際にコンテナプロセスを生成
  • • namespace、cgroups を設定
  • • コンテナ起動後は終了(shim が引き継ぐ)

Linuxカーネル機能

Namespace(分離)

  • pid: プロセスID
  • net: ネットワーク
  • mnt: マウントポイント
  • uts: ホスト名
  • ipc: プロセス間通信
  • user: ユーザー/グループID

cgroups(リソース制限)

  • cpu: CPU使用量制限
  • memory: メモリ制限
  • blkio: ディスクI/O制限
  • devices: デバイスアクセス
  • pids: プロセス数制限

イメージレイヤー構造

Container Layer(書き込み可能)
Layer: COPY app/ /app
Layer: RUN npm install
Layer: COPY package.json
Base Image: node:20-alpine

各レイヤーは読み取り専用。Copy-on-Write で効率的に管理。

Union File System

複数のレイヤーを重ね合わせて単一のファイルシステムとして見せる技術。 overlay2 がデフォルトのストレージドライバ。

確認コマンド

1# Docker情報
2docker info
3docker version
4
5# イメージのレイヤー確認
6docker history nginx:latest
7
8# コンテナの詳細情報
9docker inspect <container_id>
10
11# containerd直接操作(ctr)
12ctr images list
13ctr containers list
14
15# namespace確認(要root)
16lsns
17
18# cgroups確認
19cat /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes

SRE/インフラ観点

Docker vs containerd

  • • Kubernetes 1.24以降はdockershim廃止
  • • containerd または CRI-O を直接使用
  • • 開発環境ではDockerが便利(docker build等)

トラブルシューティング

  • • dockerd ログ: journalctl -u docker
  • • containerd ログ: journalctl -u containerd
  • • ストレージ確認: docker system df