macOSでLimaを使う:QEMUとVZ FrameworkでLinux仮想マシンを構築してDocker Desktopを無料で置き換える方法

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

macOSのDocker Desktop:実際の問題と多くの人が脱却したい理由

macOSでソフトウェア開発をしてDockerコンテナを使う必要があるなら、おそらくDocker Desktopを使っているでしょう。しかし2022年から、Docker Desktopは従業員250人以上または年収$10M以上の企業向けに有料モデルへ移行しました。これが多くのチームが代替手段を探し始めた最初の理由です。

コストの問題に加え、Docker Desktopはリソース消費の多さでも知られています。MacBook Mシリーズでは、Docker Desktopが内部でLinux VMを動かしており、そのVMはコンテナが何も動いていない状態でも2〜4GBのRAMを占有します。M1 Proで実測したところ、Docker Desktopのアイドル時のRAM使用量は3.2GBでした。16GBのマシンでは、バックグラウンドだけで20%のリソースが消費されることになります。

macOS上のDocker Desktop代替ソリューションの比較

現在、いくつかの人気の選択肢があり、それぞれ異なる思想を持っています:

  • Colima:内部でLimaを動かすコンパクトなラッパーで、Docker Desktopの置き換えを最速で実現することに特化しています。インストールしてすぐ使えて、設定もほとんど不要です。
  • Lima:ColimaがベースにしているLayer本体。はるかに柔軟で、Dockerだけでなく任意のLinuxディストリビューションを実行でき、VMの細かい設定や、用途に応じてVZ Framework(Apple Virtualization)またはQEMUを使い分けることができます。
  • OrbStack:UIが美しく高速ですが、クローズドソースで無料版には制限があります。本質的には商用ソフトウェアです。
  • Podman Desktop:Docker engineの代わりにPodmanを使用し、CLIは互換性がありますが、Dockerエコシステムのツールの一部はまだ完全にはサポートされていません。

Limaと他の選択肢の比較分析

評価基準 Lima Colima OrbStack Docker Desktop
完全無料 ✅ MIT ✅ Apache 2 ⚠️ 無料版は制限あり ⚠️ 個人は無料
パフォーマンス(Apple Silicon) ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
VMのカスタマイズ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐
初期セットアップの容易さ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
複数ディストリビューションのサポート 主にUbuntu/Fedora ❌ Ubuntuのみ

Limaは、環境を完全にコントロールしたい、商用ツールに依存したくない、異なるディストリビューションの複数VMを異なる目的で動かす必要があるという場合に最も適しています。

LimaのしくみとQEMU・VZ Framework

Lima(Linux Machines)は2つのハイパーバイザーバックエンドをサポートしています:

  • QEMU:エミュレーション+KVM方式のアクセラレーション。Intel MacおよびApple Siliconで動作します。互換性が高く安定していますが、やや速度は落ちます。
  • VZ(Apple Virtualization Framework):AppleネイティブのAPI。macOS 13以降のApple Siliconでのみ利用可能です。大幅に高速でオーバーヘッドが低い反面、エミュレーションの柔軟性は劣ります。

MシリーズのMacでmacOS 13以降を使うなら、VZを強くお勧めします。同じハードウェアでQEMUに比べてboot速度が約3倍速くなります。

LimaはmacOSからVMへのディレクトリ共有のために9pマウント(QEMU)とvirtiofマウント(VZ)もサポートしています。virtiofはフロントエンドビルドのようなI/O負荷の高いワークロードで特に、9pより大幅に高速です。

macOSにLimaをインストールする

必要条件

  • macOS 13 Ventura以降(VZ Frameworkを使用するため)
  • Homebrewがインストール済みであること
  • VM image用に約2GBのディスク容量

HomebrewでLimaをインストール

# Limaをインストール
brew install lima

# バージョン確認
limactl --version
# lima version 1.x.x

はじめてのVM作成 — VZ FrameworkでUbuntu

LimaはYAMLファイルでVMを定義します。多数のテンプレートが用意されているほか、自分で自由に設定を書くこともできます:

# 利用可能なテンプレート一覧を表示
limactl start --list-templates

# デフォルトのUbuntu VMを作成(QEMUを使用)
limactl start

# VZ Frameworkを使ってUbuntu VMを作成(Apple Siliconでは高速)
limactl start --vm-type vz --mount-type virtiofs ubuntu

初回実行時にLimaはイメージをダウンロード(Ubuntuは約700MB)し、その後VMが自動的に起動します。この処理はネットワーク速度によって2〜5分かかります。

# VMの状態を確認
limactl list

# 出力例:
# NAME      STATUS     SSH             VMTYPE    ARCH      CPUS    MEMORY    DISK
# default   Running    127.0.0.1:60022 vz        aarch64   4       4GiB      100GiB

# VMにSSH接続
limactl shell default

# またはショートカットコマンドで接続
lima

YAMLファイルでVMをカスタマイズ

CPUやRAM、マウントポイントを制御するために独自の設定ファイルを作成します:

# ~/lima-dev.yaml
vmType: vz
os: Linux
arch: aarch64

# リソースの割り当て
cpus: 4
memory: 8GiB
disk: 60GiB

# VZ Frameworkのオプション
rosetta:
  enabled: true   # Apple SiliconでRosetta経由でx86_64バイナリを実行
  binfmt: true

# macOSからVMへのディレクトリマウント
mounts:
  - location: "~/projects"
    mountPoint: /projects
    writable: true
    9p:
      securityModel: mapped-xattr
  - location: "~/.ssh"
    mountPoint: /home/user.linux/.ssh
    writable: false

# 自動ポートフォワード(LimaがVM内のリスニングポートを検出)
portForwards:
  - guestPort: 3000
    hostPort: 3000
  - guestPort: 8080
    hostPort: 8080

# 初回プロビジョニング時にパッケージをインストール
provision:
  - mode: system
    script: |
      #!/bin/bash
      apt-get update
      apt-get install -y git curl build-essential
  - mode: user
    script: |
      #!/bin/bash
      # ユーザー環境のセットアップ
      echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
# カスタム設定ファイルからVMを起動
limactl start ~/lima-dev.yaml

# dev VMに接続
limactl shell lima-dev

LimaにDockerを統合 — Docker Desktopを完全に置き換える

LimaにはDockerのテンプレートが用意されており、Lima VM内でDocker Engineを動かすことができます:

# Docker engine付きのLima VMを作成(dockerテンプレート)
limactl start template://docker

# またはVZ Frameworkを使用
limactl start --vm-type vz --mount-type virtiofs template://docker

VMが起動したら、macOS上でLimaを指すDockerコンテキストを設定します:

# LimaソケットへのDockerコンテキストを作成
docker context create lima-docker \
  --docker "host=unix:///Users/$USER/.lima/docker/sock/docker.sock"

# Limaコンテキストに切り替え
docker context use lima-docker

# Dockerが正常に動作しているか確認
docker info
docker run --rm hello-world

これ以降、macOSのターミナルで実行するdockerコマンドはすべてLima VM内のDocker Engineを経由して実行されます。もうDocker Desktopは不要です。

LimaでDocker Composeを使う

# macOSにDocker Composeプラグインをインストール(VMへのインストール不要)
brew install docker-compose

# 通常通りcomposeを実行
cd ~/projects/my-app
docker compose up -d

# コンテナを確認
docker compose ps

複数のLima VMの管理 — 実際のワークフロー

私のhomelabではProxmox VEで12台のVMとコンテナを管理しており、それがサーバーサイドのメインテスト環境です。普段使いのMacBookでは、サーバーにSSHせずにLinux環境を素早くテストするためのツールとしてLimaが欠かせません。通常は2〜3台のLima VMを並行して運用しています。1台はDockerを動かし、もう1台はProxmoxにdeployする前にLinuxスクリプトをテストするために使います。

# すべてのVMを表示
limactl list

# VMを停止(RAMを解放するが、VMは削除しない)
limactl stop default

# VMを完全に削除
limactl delete my-test-vm

# VMの設定をクローン
limactl edit default  # YAMLエディタを開く

# 特定のVMを起動
limactl start docker

# インタラクティブなSSHなしでVM内でコマンドを実行
limactl shell docker -- docker ps -a
limactl shell docker -- bash -c "cd /projects && ls -la"

VMのスナップショットとバックアップ

# VMのスナップショット(macOS 14以降のVZバックエンドのみ対応)
limactl snapshot save default my-snapshot-before-test

# スナップショット一覧を表示
limactl snapshot list default

# スナップショットを復元
limactl snapshot restore default my-snapshot-before-test

# スナップショットを削除
limactl snapshot delete default my-snapshot-before-test

よくあるトラブルシューティング

VMが起動しない

# 詳細ログを表示
limactl start --debug ubuntu 2>&1 | tail -50

# 実行中のVMのログを確認
cat ~/.lima/default/serial.log | tail -30

ディレクトリのマウントに書き込み権限がない

# VM内のマウントを確認
limactl shell default -- mount | grep projects

# YAMLにwritable: trueが設定されているか確認
# virtiofを使う場合は、~/.lima/default/lima.yamlに以下を追加:
# mounts:
#   - location: ~/projects
#     writable: true

Dockerソケットに接続できない

# ソケットが存在するか確認
ls -la ~/.lima/docker/sock/docker.sock

# 必要に応じてDockerコンテキストをデフォルトにリセット
docker context use default

# その後、Limaコンテキストを再作成
docker context create lima-docker \
  --docker "host=unix://$HOME/.lima/docker/sock/docker.sock"

まとめ:LimaはDocker Desktopの本当の代替になるか?

MacBook M2でLima + Dockerコンテキストを数ヶ月使った結果、一言で答えるなら:はい、完全に代替できます。VZ FrameworkでのVMの起動時間は約5〜8秒、アイドル時のRAM使用量は約400MBで、dockerコマンドはすべて普通に動作します。

唯一のデメリットは、初期セットアップがDocker Desktopより数ステップ多く手作業が必要なことです。しかし一度やってしまえば後は忘れられます。設定すればVMはmacOSと一緒に自動起動し、Dockerコンテキストも設定済みです。

よりシンプルにDockerだけ使いたいなら、Colimaの方が良い選択肢です。ColimaはLimaをラップして設定ステップを減らしています。一方、複数のディストリビューションを動かしたい、多様なLinux環境をテストしたい、またはより細かいコントロールが必要な場合は、Limaがあなたに必要なツールです。

Share: