moby/moby
主な特徴
- モジュラー: 明確に定義された機能とAPIを持つ多数のコンポーネントが連携
- バッテリー同梱が交換可能: 完全なコンテナシステム構築に十分なコンポーネントを含むが、ほとんどのコンポーネントは別実装で交換可能
- 使いやすいセキュリティ: 使いやすさを犠牲にせずにセキュアなデフォルトを提供
- 開発者フォーカス: APIは強力なツール構築のために機能的で便利に設計
リポジトリ解析: moby/moby
基本情報
- リポジトリ名: moby/moby
- 主要言語: Go
- スター数: 70,218
- フォーク数: 18,783
- 最終更新: 2025年以降
- ライセンス: Apache License 2.0
- トピックス: コンテナエコシステム、Docker、オープンソース、コンテナランタイム
概要
一言で言うと
Dockerがソフトウェアコンテナ化を可能にし、加速するために作ったオープンソースプロジェクト。コンテナベースのシステムを組み立てるための「レゴセット」のようなツールキットコンポーネントを提供。
詳細説明
Mobyはコンテナ愛好家やプロフェッショナルが実験し、アイデアを交換できる場所を提供するオープンプロジェクト。コンテナビルドツール、コンテナレジストリ、オーケストレーションツール、ランタイムなどのコンポーネントを含み、他のツールやプロジェクトと組み合わせてビルディングブロックとして使用できる。Docker製品のアップストリームとして使用されている。
主な特徴
- モジュラー: 明確に定義された機能とAPIを持つ多数のコンポーネントが連携
- バッテリー同梱が交換可能: 完全なコンテナシステム構築に十分なコンポーネントを含むが、ほとんどのコンポーネントは別実装で交換可能
- 使いやすいセキュリティ: 使いやすさを犠牲にせずにセキュアなデフォルトを提供
- 開発者フォーカス: APIは強力なツール構築のために機能的で便利に設計
使用方法
インストール
前提条件
- Go 1.21以上
- Git
- Make
- Docker(セルフホスティングのビルドのため)
インストール手順
# 方法1: Docker DesktopまたはMirantis Container Runtimeの使用(推奨)
# Docker Desktop: https://www.docker.com/products/docker-desktop/
# MCR: https://www.mirantis.com/software/mirantis-container-runtime/
# 方法2: ソースからビルド
# リポジトリのクローン
git clone https://github.com/moby/moby.git
cd moby
# ビルド
make binary
# またはDockerコンテナ内でのビルド
make shell
# コンテナ内で
hack/make.sh binary
基本的な使い方
Hello World相当の例
package main
import (
"context"
"fmt"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/client"
)
// Mobyクライアントを使ったコンテナ一覧表示
func main() {
apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
}
defer apiClient.Close()
containers, err := apiClient.ContainerList(context.Background(), container.ListOptions{All: true})
if err != nil {
panic(err)
}
for _, ctr := range containers {
fmt.Printf("%s %s (status: %s)\n", ctr.ID, ctr.Image, ctr.Status)
}
}
実践的な使用例
// コンテナの作成と実行
import (
"context"
"io"
"os"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/api/types/image"
"github.com/moby/moby/client"
)
func createAndRunContainer() error {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
return err
}
// イメージのpull
reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", image.PullOptions{})
if err != nil {
return err
}
io.Copy(os.Stdout, reader)
// コンテナ作成
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "alpine",
Cmd: []string{"echo", "hello world"},
}, nil, nil, nil, "")
if err != nil {
return err
}
// コンテナ起動
if err := cli.ContainerStart(ctx, resp.ID, container.StartOptions{}); err != nil {
return err
}
return nil
}
高度な使い方
// CSIプラグインを使用したクラスタボリュームの管理
// Docker Swarmモードでのサービス作成
import (
"github.com/moby/moby/api/types/swarm"
)
func createSwarmService(cli *client.Client) error {
service := swarm.ServiceSpec{
Annotations: swarm.Annotations{
Name: "my-nginx",
},
TaskTemplate: swarm.TaskSpec{
ContainerSpec: &swarm.ContainerSpec{
Image: "nginx:alpine",
},
},
Mode: swarm.ServiceMode{
Replicated: &swarm.ReplicatedService{
Replicas: &[]uint64{3}[0],
},
},
}
_, err := cli.ServiceCreate(context.Background(), service, types.ServiceCreateOptions{})
return err
}
// rootlessモードでの実行
// dockerd-rootless-setuptool.sh install
// systemctl --user start docker
// export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクトの概要、原則、Dockerとの関係
- CONTRIBUTING.md: 貢献方法、セキュリティ問題の報告方法
- api/README.md: Engine APIの説明、Swagger定義の使用方法
- client/README.md: Goクライアントの使用方法
- docs/cluster_volumes.md: CSIプラグインを使用したクラスタボリュームの説明
- TESTING.md: テスト方法の詳細
- 公式サイト: https://docs.docker.com/
サンプル・デモ
- contrib/: 様々なサンプルスクリプトやツール
- contrib/check-config.sh: カーネル設定チェックスクリプト
- contrib/dockerd-rootless.sh: rootlessモードでの実行
チュートリアル・ガイド
- Docker公式ドキュメント
- Mobyプロジェクトの貢献者ガイド
- APIドキュメント(Swagger定義から自動生成)
技術的詳細
アーキテクチャ
全体構造
Mobyはモジュラーアーキテクチャを採用し、コンポーネントの交換可能性を重視。クライアント-サーバーアーキテクチャで、dockerdデーモンがAPIを提供し、docker CLIやサードパーティアプリケーションがクライアントとして接続。
ディレクトリ構成
moby/
├── api/ # Engine API定義(Swagger)
│ ├── types/ # クライアントとサーバーで共有される型定義
│ └── swagger.yaml # API仕様
├── client/ # Goクライアントライブラリ
├── daemon/ # dockerdデーモンの実装
│ ├── cluster/ # Swarmモード関連
│ ├── config/ # 設定管理
│ └── container/ # コンテナ管理
├── cmd/ # コマンドラインツール
│ └── dockerd/ # dockerdエントリポイント
├── layer/ # レイヤー管理(イメージレイヤー)
├── image/ # イメージ管理
├── distribution/ # レジストリとの通信
├── libnetwork/ # ネットワーク機能
└── oci/ # OCI仕様の実装
主要コンポーネント
-
Docker Daemon (dockerd): コンテナのライフサイクル管理
- 場所:
daemon/ - 役割: APIサーバー、コンテナ管理、イメージ管理、ネットワーク管理
- インターフェース: HTTP/REST API
- 場所:
-
Go Client: Docker APIのGoクライアント
- 場所:
client/ - 役割: Docker CLIやサードパーティアプリからのAPI呼び出し
- インターフェース: Docker Engine API
- 場所:
-
libnetwork: ネットワークサブシステム
- 場所:
libnetwork/ - 役割: CNM(Container Network Model)の実装
- 依存: daemon
- 場所:
-
OCI実装: Open Container Initiative仕様の実装
- 場所:
oci/ - 役割: OCIランタイム仕様とイメージ仕様のサポート
- 依存: containerd, runc
- 場所:
技術スタック
コア技術
- 言語: Go (1.21+)
- コンテナランタイム: containerd, runc
- 主要ライブラリ:
- containerd: コンテナランタイム
- runc: OCIランタイム実装
- libnetwork: ネットワーク管理
- buildkit: イメージビルド
- swarmkit: オーケストレーション
開発・運用ツール
- ビルドツール: Make, Docker (self-hosting builds)
- テスト:
- 単体テスト: go test
- 統合テスト: integration-cli
- E2Eテスト: 実際のDockerコマンドを使用
- CI/CD: GitHub Actions、Jenkins
- デプロイ:
- バイナリ配布
- パッケージマネージャー経由(apt, yum, brew等)
設計パターン・手法
- プラグインアーキテクチャ: ストレージドライバ、ネットワークドライバなどがプラグイン可能
- レイヤードアーキテクチャ: API層、ビジネスロジック層、ランタイム層の分離
- CSI (Container Storage Interface): ストレージプロバイダの統一インターフェース
- CNI (Container Network Interface): ネットワークプラグインの標準化
データフロー・処理フロー
- クライアント(docker CLIまたはAPIクライアント)
- Docker Engine API (REST)
- dockerdデーモン
- containerd (コンテナライフサイクル管理)
- runc (OCIランタイムで実際のコンテナ作成)
- Linuxカーネル機能 (namespaces, cgroups, capabilities)
API・インターフェース
公開API
Docker Engine API
- 目的: コンテナ、イメージ、ネットワーク、ボリュームの管理
- 仕様: OpenAPI (Swagger) 2.0
- エンドポイント例:
- GET /containers/json - コンテナ一覧
- POST /containers/create - コンテナ作成
- POST /images/create - イメージpull
# API使用例
curl --unix-socket /var/run/docker.sock \
http://localhost/v1.45/containers/json
設定・カスタマイズ
dockerd設定
// /etc/docker/daemon.json
{
"debug": true,
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"insecure-registries": ["myregistry:5000"]
}
拡張・プラグイン開発
Dockerプラグインシステムを使用:
- ストレージドライバプラグイン
- ネットワークドライバプラグイン
- ログドライバプラグイン
- CSIプラグイン(クラスタボリューム用)
パフォーマンス・スケーラビリティ
パフォーマンス特性
- コンテナ起動時間: 秒単位(overlay2ストレージドライバ使用時)
- イメージレイヤーキャッシュによる高速化
- 並列ビルドサポート(BuildKit)
- マルチステージビルドキャッシュ
スケーラビリティ
- Docker Swarmモードで数千ノードまでスケール
- ノードあたり数百のコンテナをサポート
- マルチプラットフォーム対応(Linux, Windows, macOS)
- ARMアーキテクチャサポート
制限事項
- Docker SwarmはKubernetesと比較して機能が限定的
- WindowsコンテナはLinuxコンテナと比べて機能制限あり
- カーネルのバージョン要件(特定の機能には新しいカーネルが必要)
評価・所感
技術的評価
強み
- 成熟したエコシステムと大規模なコミュニティ
- モジュラーアーキテクチャによる高い拡張性
- OCI標準への準拠
- 幅広いプラットフォームサポート
- 安定したAPIと後方互換性
- rootlessモードによるセキュリティ向上
改善の余地
- オーケストレーション機能(Swarm)はKubernetesに比べて機能が限定的
- Windowsコンテナの機能格差
- ネイティブなマルチテナンシーサポートの欠如
向いている用途
- アプリケーションのコンテナ化
- マイクロサービスアーキテクチャ
- CI/CDパイプライン
- 開発環境の標準化
- カスタムコンテナプラットフォームの構築
向いていない用途
- 大規模なコンテナオーケストレーション(Kubernetesが適切)
- マルチテナント環境での強固な分離が必要な場合
- リアルタイム性が極めて重要なシステム
総評
Mobyはコンテナ技術のデファクトスタンダードとしての地位を確立し、コンテナエコシステムの発展に大きく貢献している。モジュラーアーキテクチャにより、様々な用途に対応できる柔軟性を持ち、Docker製品だけでなく多くのコンテナベースのソリューションの基盤となっている。特に開発者やエンジニアにとっては、コンテナ技術を深く理解し、カスタマイズするための優れたプラットフォームである。Apache 2.0ライセンスにより商用利用も容易で、幅広い採用が進んでいる。