container

Create and run Linux containers as lightweight virtual machines on Apple silicon Macs.

1 — 概要

container は、Apple Silicon Mac 上で Linux コンテナを軽量 VM として作成・実行する CLI ツール。Swift で書かれ、OCI 互換のコンテナイメージを pull / build / push できる。低レベル実装はオープンソースの Containerization Swift パッケージが担う。

Swift実装言語
OCIイメージ互換
1 VMコンテナごと
macOS 26推奨 OS

従来の「1 台の Linux VM の中に多数のコンテナを載せる」方式ではなく、コンテナ 1 つにつき 1 つの軽量 VM を起動する。VM 単位の分離・必要なホストデータだけのマウント・共有 VM より少ないメモリ消費と、コンテナ並みの起動時間を狙う設計。

共有 VM 方式(従来)

  • Linux VM 1 台に全コンテナ
  • 将来使う可能性のあるデータを先に VM へマウント
  • コンテナ間は同一 VM 内で名前空間分離

container 方式

  • コンテナごとに独立した軽量 VM
  • 必要なホストパスだけ各 VM にマウント
  • VM レベルの分離で攻撃面を縮小
2 — アーキテクチャ

CLI はクライアントライブラリ経由で container-apiserver と通信する。container system start で apiserver が Launch Agent として起動し、container system stop で終了する。apiserver は XPC ヘルパーと、コンテナごとのランタイムヘルパーを束ねる。

flowchart TD
  CLI["container CLI"]
  API["container-apiserver\n(Launch Agent)"]
  IMG["container-core-images\n(XPC)"]
  NET["container-network-vmnet\n(XPC)"]
  RT["container-runtime-linux\n(per container)"]
  VM["Linux lightweight VM"]

  CLI -->|"client API"| API
  API --> IMG
  API --> NET
  API -->|"per container"| RT
  RT --> VM
      
コンポーネント役割
container-apiserverコンテナ・ネットワークリソース管理の API。system start/stop のライフサイクル
container-core-imagesイメージ管理 API とローカルコンテンツストア
container-network-vmnetvmnet ベースの仮想ネットワーク
container-runtime-linux個別コンテナ用ランタイム API(コンテナ作成ごとに起動)

Swift パッケージ構成(抜粋)

リポジトリは Swift Package Manager モノレポ。Sources/ 配下に CLI・API サーバー・ビルド・永続化・XPC などが分かれる。

Sources/
├── CLI/                  … コマンドラインエントリ
├── APIServer/            … apiserver 本体
├── ContainerCommands/    … サブコマンド実装
├── ContainerBuild/       … イメージビルド
├── ContainerPersistence/ … 状態永続化
├── ContainerXPC/         … XPC 通信
├── ContainerOS/          … ゲスト OS 連携
├── ContainerResource/    … CPU / メモリ等
├── ContainerPlugin/      … プラグイン拡張
└── Plugins/              … ビルド時プラグイン(例: MachineAPIServer)
3 — はじめ方
  • ハードウェア: Apple Silicon Mac が必須
  • OS: macOS 26 を推奨(Virtualization / vmnet の新機能を利用)。macOS 15 でも動くが機能制限あり(後述)
  • 入手: GitHub Releases の署名付きインストーラ(.pkg)

インストーラ実行後、管理者パスワードで /usr/local 配下に配置される。初回はシステムサービスを起動する。

# サービス起動
container system start

# 例: イメージを pull して実行
container run --rm docker.io/library/alpine:latest uname -a

# 停止
container system stop

アップグレード / アンインストール

アップグレード前は container system stop。最新版は /usr/local/bin/update-container.sh、削除は /usr/local/bin/uninstall-container.sh(-k でユーザーデータ保持、-d で削除)。

開発版: ソースからビルドする場合は BUILDING.md を参照。1.0.0 前はマイナーバージョンで破壊的変更があり得る(パッチ間は比較的安全)。
4 — 主要コマンド
操作コマンド例メモ
実行container run --rm IMAGE CMDデフォルト 1 GiB RAM / 4 CPU。 --memory --cpus で上書き
ボリューム--volume HOST:CONTAINERホストフォルダをコンテナ内パスへマウント
ビルドcontainer build -t TAG -f Dockerfile .builder VM はデフォルト 2 GiB / 2 CPU
builder 調整container builder start --cpus 8 --memory 32g大規模ビルド前にリソースを増やす
マルチアーキcontainer build --arch arm64 --arch amd64 ...Apple Silicon と x86-64 向けイメージ
システムcontainer system start|stop|statusapiserver のライフサイクル

各コンテナは軽量 VM 上で動くため、container run のリソース指定は VM への割り当てと考える。詳細なサブコマンド一覧は公式の command-reference.md と API ドキュメント を参照。

  • docs/tutorials/start-here.md — Web サーバーイメージの build / run / push チュートリアル
  • docs/how-to.md — メモリ・CPU・ボリューム・マルチプラットフォーム等の How-to
  • docs/technical-overview.md — 設計思想と macOS 連携の詳説
5 — macOS 連携
技術用途
Virtualization frameworkLinux VM とデバイス管理
vmnetコンテナ用仮想ネットワーク
XPCapiserver とヘルパー間 IPC
Launchdapiserver / ヘルパーのサービス管理
Keychainレジストリ認証情報
Unified Loggingアプリケーションログ

イメージの pull / push は標準 OCI レジストリと互換。Dockerfile から build したイメージも、他の OCI 対応ランタイムで実行できる。

6 — 制限事項

メモリのホスト返却

Virtualization framework のメモリバルーニングは部分的なサポートのみ。コンテナ VM 内で Linux が解放したページは、現状ホスト macOS へ返却されない。メモリ集約型ワークロードを多数走らせる場合は、コンテナの再起動が必要になることがある。

macOS 15 での制限

  • ネットワーク分離: vmnet がコンテナ間通信を提供できず、コンテナ同士はネットワーク上で分離される
  • 複数ネットワーク: 全コンテナがデフォルト vmnet に接続。container network サブコマンド不可。 --network はエラー
  • IP アドレス: 最初のコンテナ起動時にネットワークが作られるため、network ヘルパーと vmnet のサブネット不一致で通信不能になることがある(通常 CIDR 192.168.64.1/24)
サポート方針: macOS 26 で再現できない macOS 15 固有の問題は、メンテナ側で対応しない方針。本番利用は macOS 26 を前提にする。