LinuxでDocker-OSXを使ってmacOSを構築:高パフォーマンスなiOSアプリ開発のための「ショートカット」

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

クイックスタート – 数分でmacOSを起動

Ubuntu、Fedora、あるいはその他のLinuxディストリビューションを使用していて、Safariで表示を確認するためにmacOS環境が急ぎで必要ですか?あるいは、Macを持たずにSwiftコードを試しにビルドしてみたいですか?このコマンドを試してみてください。Dockerがインストール済みで、KVMがサポートされていることを前提としています。

docker run -it \
    --device /dev/kvm \
    -p 50922:22 \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:auto

上記のコマンドは、macOS Catalinaのイメージ(約2.3GB)を自動的にプルし、Linuxデスクトップ上にインターフェースを起動します。VirtualBoxでISOファイルの構成に1時間かける代わりに、コーヒーを飲んでいる間に完了します。非常に便利だと思いませんか?

なぜDocker-OSXは開発者にとって「最適解」なのか?

以前は、Hackintoshといえば、ディスクパーティションの分割やEFIの編集といった非常に面倒な作業を連想しました。VirtualBoxを使用すると、パフォーマンスが低く、ストレスを感じるほどラグが発生することが一般的でした。

Docker-OSXは、これらの悩みを根本から解決します。QEMUKVM(Kernel-based Virtual Machine)のパワーを組み合わせつつ、Docker内にきれいにパッケージ化されています。特に価値があると感じる3つのポイントを紹介します:

  • ネイティブに近いパフォーマンス: KVMにより、CPUが直接パススルーされます。タイピングやアプリの起動がVirtualBoxよりも明らかにスムーズで、ビルド速度も約30%向上します。
  • Infrastructure as Code(IaC)形式の管理: コマンド一行で、クリーンなmacOS環境を削除して再作成したり、複製したりできます。
  • X11フォワーディングの統合: macOSのウィンドウがLinuxデスクトップ上の通常のアプリケーションのように表示され、違和感なく操作できます。

Proxmox VE(12台の仮想マシンを管理)で運用している私のホームラボシステムでは、常にDocker-OSX専用のLinuxノードを1つ用意しています。これは、自動化スクリプトのテストや、本番展開前のJenkins用ビルドエージェントとして理想的なプレイグラウンドです。

システム要件(事前準備)

仮想マシンをスムーズに動作させ、「リンゴループ」などのエラーを避けるために、以下の条件を満たす必要があります:

1. BIOSで仮想化を有効にする

BIOS/UEFI設定に入り、Intel VT-xまたはAMD-Vを探して有効(Enable)にしてください。その後、次のコマンドで確認します:

kvm-ok

「KVM acceleration can be used」と表示されれば準備完了です。このコマンドがない場合は、cpu-checkerパッケージをインストールしてください。

2. Dockerとサポートライブラリのインストール

UbuntuまたはDebianの場合、以下のコマンドで環境を構築します:

sudo apt update
sudo apt install qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager docker.io -y
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
sudo usermod -aG kvm $USER

ヒント: 権限設定を有効にするために、一度ログアウトしてから再度ログインすることを忘れないでください。

各macOSバージョンの詳細なインストール手順

ニーズに合わせて適切なバージョンを選択してください。作者のsickcodesは、High Sierraから最新のVenturaやSonomaまで、あらゆる「ツール」を揃えています。

macOS Montereyのインストール(最新のXcodeサポートのため)

最新のiOSアプリをビルドすることが目的であれば、Monterey以降が必要です。以下のコマンドは、40GBの仮想ディスクを作成し、インストールプロセスを開始します:

docker run -it \
    --device /dev/kvm \
    -e "RAM=6" \
    -e "CORES=4" \
    -p 50922:22 \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:monterey

各パラメータの簡易説明:

  • RAM=6: RAMを6GB割り当てます(最低4GBを推奨)。
  • CORES=4: 仮想マシンに割り当てるCPUコア数。
  • -p 50922:22: LinuxマシンのターミナルからMacを操作するためのSSHポートフォワーディング。

重要な注意:インストール画面が表示されたら、まずディスクユーティリティ(Disk Utility)で仮想ディスク(通常はQEMU HARDDISK)をAPFS形式にフォーマットしてから、「macOSを再インストール」をクリックする必要があります。

快適に使うためのパフォーマンス最適化

インストールは完了しましたが、長期的に安定して作業するために、以下の3つのステップを実行することをお勧めします。

1. データの永続化(Persistence)

デフォルトではコンテナを削除すると、macOS内のデータはすべて失われます。ファイルや設定を保持するには、ホストマシンのディレクトリを仮想マシンのディスクとしてマウントします:

docker run -it \
    --device /dev/kvm \
    -v /home/user/macos_data:/var/lib/libvirt/images \
    -p 50922:22 \
    sickcodes/docker-osx:auto

2. iPhone/iPadを仮想マシンに接続する

これは私が非常に気に入っている機能です。iPhone上でアプリを直接デバッグするには、lsusbでデバイスIDを確認し、実行コマンドにパラメータを追加します。最も簡単な方法は環境変数を使用することです:

# 特定のUSBデバイスをパススルーする例
-e "EXTRA=-device usb-host,hostbus=1,hostport=3"

3. CI/CD用のヘッドレスモード(画面なし)

ビルドサーバーとしてのみ使用する場合、リソースを消費するGUIは必要ありません。DISPLAY変数を削除してバックグラウンドで実行します:

docker run -d \
    --device /dev/kvm \
    -p 50922:22 \
    sickcodes/docker-osx:auto

この状態では、ssh -p 50922 user@localhostを実行するだけで、Macのターミナルを操作できます。

実務での経験と重要な注意点

Docker-OSXを業務で1年以上使用してきた経験から、いくつかのアドバイスがあります:

  • 個人のiCloudの使用は控える: Docker-OSXはシリアル番号を偽装してiMessageなどを使用できますが、Appleにメインアカウントをロックされるリスクは現実に存在します。テストにはクローンのApple IDを作成するのがベストです。
  • NVMe SSDを優先する: 通常のSSDとNVMeでは、macOSのロード速度が明らかに違います。NVMeであれば、仮想マシンは20秒足らずでメイン画面まで起動します。
  • ネットワークエラー: 仮想マシンがネットワークに繋がらない場合は、bridge-utilsを確認してください。DockerがLinuxシステムのiptablesルールと競合することがあります。

初期設定はコマンド操作が多く、少し面倒に感じるかもしれません。しかし、一度稼働してしまえば、従来の仮想マシンよりもはるかに安定しており高速であることがわかります。このソリューションのおかげで、小さなビルドタスクのためだけにMac Miniを買い足す必要がなくなり、かなりのコストを節約できました。

ぜひ積極的に試してみてください。docker pull時にエラーが出たり、リンゴロゴで止まってしまったりした場合は、下のコメント欄に残していただければサポートします。

Share: