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