container
Create and run Linux containers as lightweight virtual machines on Apple silicon Macs.
container は、Apple Silicon Mac 上で Linux コンテナを軽量 VM として作成・実行する CLI ツール。Swift で書かれ、OCI 互換のコンテナイメージを pull / build / push できる。低レベル実装はオープンソースの Containerization Swift パッケージが担う。
従来の「1 台の Linux VM の中に多数のコンテナを載せる」方式ではなく、コンテナ 1 つにつき 1 つの軽量 VM を起動する。VM 単位の分離・必要なホストデータだけのマウント・共有 VM より少ないメモリ消費と、コンテナ並みの起動時間を狙う設計。
共有 VM 方式(従来)
- Linux VM 1 台に全コンテナ
- 将来使う可能性のあるデータを先に VM へマウント
- コンテナ間は同一 VM 内で名前空間分離
container 方式
- コンテナごとに独立した軽量 VM
- 必要なホストパスだけ各 VM にマウント
- VM レベルの分離で攻撃面を縮小
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-vmnet | vmnet ベースの仮想ネットワーク |
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)
- ハードウェア: 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 前はマイナーバージョンで破壊的変更があり得る(パッチ間は比較的安全)。
| 操作 | コマンド例 | メモ |
|---|---|---|
| 実行 | 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|status | apiserver のライフサイクル |
各コンテナは軽量 VM 上で動くため、container run のリソース指定は VM への割り当てと考える。詳細なサブコマンド一覧は公式の command-reference.md と API ドキュメント を参照。
docs/tutorials/start-here.md— Web サーバーイメージの build / run / push チュートリアルdocs/how-to.md— メモリ・CPU・ボリューム・マルチプラットフォーム等の How-todocs/technical-overview.md— 設計思想と macOS 連携の詳説
| 技術 | 用途 |
|---|---|
| Virtualization framework | Linux VM とデバイス管理 |
| vmnet | コンテナ用仮想ネットワーク |
| XPC | apiserver とヘルパー間 IPC |
| Launchd | apiserver / ヘルパーのサービス管理 |
| Keychain | レジストリ認証情報 |
| Unified Logging | アプリケーションログ |
イメージの pull / push は標準 OCI レジストリと互換。Dockerfile から build したイメージも、他の OCI 対応ランタイムで実行できる。
メモリのホスト返却
Virtualization framework のメモリバルーニングは部分的なサポートのみ。コンテナ VM 内で Linux が解放したページは、現状ホスト macOS へ返却されない。メモリ集約型ワークロードを多数走らせる場合は、コンテナの再起動が必要になることがある。
macOS 15 での制限
- ネットワーク分離: vmnet がコンテナ間通信を提供できず、コンテナ同士はネットワーク上で分離される
- 複数ネットワーク: 全コンテナがデフォルト vmnet に接続。
container networkサブコマンド不可。--networkはエラー - IP アドレス: 最初のコンテナ起動時にネットワークが作られるため、network ヘルパーと vmnet のサブネット不一致で通信不能になることがある(通常 CIDR
192.168.64.1/24)
- GitHub: apple/container — CLI 本体リポジトリ
- GitHub: apple/containerization — 低レベル Swift パッケージ
- Releases — 署名付きインストーラ
- API Documentation — Swift DocC
- OCI Image Spec — イメージ形式標準