🐙

Apple Container 入門チュートリアル

に公開

Apple Silicon Mac をお使いの開発者向けに、Apple の新しいコンテナ技術を実際に体験できるチュートリアルです。従来のコンテナ技術とは一線を画す革新的なアプローチを、実践を通して学んでいきましょう。

Apple Container とは

Apple Container は、Apple Silicon Mac 専用に開発された新しいコンテナ技術です。最大の特徴は、各コンテナが独自の軽量 Linux 仮想マシンで動作する「VM-per-Container」アーキテクチャです。これにより、従来のコンテナ技術では実現困難だった強固なセキュリティと高いパフォーマンスを両立しています。

Apple のコンテナ技術は、実際には2つのプロジェクトから構成されています。apple/containerization は Swift で書かれたフレームワークで、コンテナ技術の核となる低レベル機能を提供します。一方、apple/container は実際に開発者が使用するコマンドラインツールです。普段使うのは container コマンドですが、内部では containerization フレームワークが Apple Silicon の性能を最大限に引き出しています。

従来のコンテナ技術では、複数のコンテナが同一の OS カーネルを共有していました。しかし Apple Container では、各コンテナが完全に独立した Linux VM で動作するため、一つのコンテナに問題が発生しても他に影響しません。さらに、Apple Silicon の仮想化支援機能により、VM の起動時間は1秒未満という驚異的な速度を実現しています。

始める前の準備

Apple Container を使用するには、以下の環境が必要です。

要件 詳細
ハードウェア Apple Silicon Mac (M1/M2/M3/M4)
OS macOS 15 以上(macOS 26 Beta 1 推奨)
メモリ 8GB 以上(16GB 推奨)
ストレージ 10GB 以上の空き容量

Intel Mac では動作しないため、必ず Apple Silicon Mac をご用意ください。

インストール

GitHub リリースページ から最新の署名済みインストーラーをダウンロードし、パッケージファイルをダブルクリックしてインストールします。管理者パスワードの入力が必要です。

初期設定

インストール後、ターミナルで以下のコマンドを実行してシステムを起動します。

container system start

初回起動時には Linux カーネルのダウンロードが行われる場合があります。完了したら、動作確認を行いましょう。

container system status
container list --all

基本操作を覚える

まずは簡単なコンテナを実行して、Apple Container の基本操作を覚えましょう。

Hello World

最初に、定番の Hello World コンテナを実行してみます。

container run hello-world

このコマンドにより、軽量 Linux VM が起動し、Hello World メッセージが表示されます。起動の速さに驚かれるかもしれません。

インタラクティブなコンテナ

次に、Ubuntu コンテナでインタラクティブなシェルを起動してみましょう。

container run -it ubuntu:latest bash

コンテナ内で lsps auxuname -a などのコマンドを実行して、独立した Linux 環境であることを確認できます。exit で終了します。

バックグラウンド実行

Web サーバーをバックグラウンドで実行してみます。

container run -d --name web nginx

実行中のコンテナを確認します。

container list

Apple Container の特徴として、各コンテナには専用の IP アドレスが自動的に割り当てられます。コンテナの詳細情報を確認してみましょう。

container inspect web

IP アドレスを確認したら、ブラウザで http://[IP アドレス] にアクセスするか、以下のコマンドでアクセスできます。

curl http://web.test/

Apple Container では、コンテナ名に .test ドメインを付けることで、DNS 名でのアクセスが可能です。

実践:Vapor Web API を作る

Swift 開発者にとって身近な Vapor フレームワークを使って、実際の Web API を作成してみましょう。

Swift 環境の準備

まず、Swift の公式イメージを使って開発環境を準備します。

container run -it --name swift-dev swift:5.9 bash

コンテナ内で Swift のバージョンを確認します。

swift --version

Vapor プロジェクトの作成

新しいターミナルタブを開き、作業ディレクトリを作成します。

mkdir vapor-demo
cd vapor-demo

Swift コンテナを使って Vapor プロジェクトを初期化します。

container run --rm \
  --volume $(pwd):/app \
  --workdir /app \
  swift:5.9 \
  swift package init --type executable

Package.swift ファイルを編集して Vapor を依存関係に追加します。

cat > Package.swift << 'EOF'
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "vapor-demo",
    platforms: [
        .macOS(.v13)
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/vapor.git", from: "4.89.0")
    ],
    targets: [
        .executableTarget(
            name: "vapor-demo",
            dependencies: [
                .product(name: "Vapor", package: "vapor")
            ]
        ),
    ]
)
EOF

メインファイルを作成します。

cat > Sources/main.swift << 'EOF'
import Vapor

let app = Application()
defer { app.shutdown() }

app.get("hello") { req in
    return "Hello from Apple Container!"
}

app.get("api", "users", ":name") { req -> String in
    guard let name = req.parameters.get("name") else {
        throw Abort(.badRequest)
    }
    return "User: \(name)"
}

try app.run()
EOF

API サーバーの起動

Vapor アプリケーションをコンテナで実行します。

container run -d --name vapor-api \
  --volume $(pwd):/app \
  --workdir /app \
  swift:5.9 \
  bash -c "swift package resolve && swift run"

少し待ってから、API にアクセスしてみましょう。

curl http://vapor-api.test:8080/hello
curl http://vapor-api.test:8080/api/users/john

データベースとの連携

PostgreSQL データベースを追加して、より実践的な環境を構築してみます。

container run -d --name postgres \
  --env POSTGRES_PASSWORD=password \
  --env POSTGRES_DB=vapordb \
  postgres:15

Vapor アプリケーションからデータベースに接続する場合、postgres.test:5432 で直接アクセスできます。これは Apple Container の専用 IP アドレス機能により実現されています。

Apple Container の特徴

実際に使ってみて、Apple Container の特徴を体験できたでしょうか。主な特徴をまとめます。

専用 IP アドレス

各コンテナには自動的に専用の IP アドレスが割り当てられ、コンテナ名に .test を付けることで DNS 名でのアクセスが可能です。従来のポートフォワーディング設定は不要で、より直感的なネットワーキングが実現されています。

高速起動

VM-per-Container でありながら、起動時間は1秒未満です。これは Apple Silicon の仮想化支援機能と、最適化された軽量 Linux カーネル、専用初期化システム vminitd の組み合わせにより実現されています。

完全な分離

各コンテナが独立した Linux VM で動作するため、カーネルレベルでの完全な分離が実現されています。一つのコンテナに問題が発生しても、他のコンテナやホストシステムに影響しません。

macOS との統合

Apple Container は macOS のプライバシー機能と統合されており、必要なファイルやディレクトリのみをコンテナに提供できます。また、ファイルシステムの共有も効率的に行われます。

知っておくべきこと

Apple Container を使用する際の制限事項と注意点を理解しておきましょう。

制限事項

Apple Container は Apple Silicon Mac 専用のため、Intel Mac や他のプラットフォームでは動作しません。また、macOS 15 では一部のネットワーク機能に制限があり、コンテナ間通信が不安定な場合があります。macOS 26 Beta 1 以降の使用を推奨します。

リソース使用量

VM-per-Container アーキテクチャのため、各コンテナには VM のオーバーヘッド(50-100MB 程度)が発生します。大量の軽量コンテナを実行する場合は、メモリ使用量に注意が必要です。

トラブルシューティング

問題が発生した場合は、以下のコマンドでログを確認できます。

# システムログの確認
container system logs

# 特定のコンテナのログ
container logs vapor-api

# ブートログの確認
container logs --boot vapor-api

# リソース使用状況の監視
container stats vapor-api

次のステップ

このチュートリアルで Apple Container の基本的な使い方と特徴を体験できました。さらに学習を進めるには、以下のリソースを活用してください。

学習リソース

実践的な活用

Apple Container は、セキュリティが重要なアプリケーション開発、教育・研修環境、CI/CD パイプライン、マイクロサービス開発など、様々な場面で活用できます。特に Apple Silicon Mac での開発において、従来のコンテナ技術では実現困難だった安全性と性能の両立を実現します。

# 最後に、使用したコンテナをクリーンアップ
container stop vapor-api postgres web swift-dev
container remove vapor-api postgres web swift-dev

新しいコンテナ技術の世界へようこそ。Apple Container で、より良い開発体験をお楽しみください。

Discussion