DescubreApple

Apple, Mac, iPhone, iPad

macOS

Apple SiliconのMacBookでDocker Desktopを重くさせずに使う方法

M1、M2、M3チップのMacでDocker Desktopを最大限に活用するための実践ガイド:VirtioFSの設定、Rosetta 2、メモリ、そしてDockerでは力不足なときのOrbStackやColimaといった代替案。

Cómo usar Docker Desktop en MacBook con Apple Silicon sin que se ralentice
Como Usar Docker Desktop En Macbook Con Apple Silicon Sin Que Se Ralentice

Apple SiliconのMacBookでコンテナを扱っているなら、Docker Desktopが必ずしも快適に動くわけではないことはご存じでしょう。起動が遅く、メモリを大量に消費し、そこそこ大きなイメージをビルドするとファンが回り始めます。そしてイメージがlinux/amd64の場合、状況はさらに悪化します。このガイドでは、M1、M2、M3のMacでDocker Desktopを実用的に使えるようにする方法、調整すべき設定、Dockerが最適解ではないと判断すべきケース、そして検討に値する代替ツールを解説します。

ここで紹介する内容はすべて、macOS Sequoia 15.1とDocker Desktop 4.35の組み合わせ、18 GBのRAMを搭載したMacBook Pro M3 Pro、そして16 GBのMacBook Air M2で検証しています。基本的な考え方はM1でも同様に当てはまります。

Apple SiliconでDocker Desktopが遅くなる理由

DockerはmacOSでネイティブには動作しません。これまでも一度もありません。Dockerには Linux カーネルが必要ですが、macOSにはそれがありません。そこでDocker Desktopは、Appleの仮想化フレームワーク(Apple SiliconではVirtualization.framework)を使って軽量なLinux仮想マシンを起動し、その内部でDockerのデーモンを実行しています。

つまり、常に仮想化レイヤーが存在し、さらにmacOSのファイルシステムと仮想マシンのファイルシステムを橋渡しする仕組みも存在します。従来、そのブリッジが最大のボトルネックでした。

さらにlinux/amd64イメージを加えると事情はさらに複雑になります。あなたのMacはARM64です。x86_64のコンテナを起動すると、DockerはRosetta 2またはQEMUを通じてそれをエミュレートします。アーキテクチャ全体をエミュレートするにはコストがかかり、負荷にもよりますが30%から60%ほど性能が低下します。

事前要件

  • macOS 13 Ventura以降(VirtioFSを安定して使うならSequoia推奨)。
  • Docker Desktop 4.25以降。4.35ではリソースマネージャーが大幅に改善されています。
  • M1、M2、M3(またはそれ以降)のチップを搭載し、同時に複数のコンテナを扱うなら最低16 GBのRAMが必要です。
  • Rosetta 2がインストール済みであること:softwareupdate --install-rosetta --agree-to-license。

Apple SiliconのMacにDocker Desktopをインストールする

docker.comからApple Silicon版のインストーラーをダウンロードします。ビルドは Intel 版と Apple Silicon 版の2種類があるので注意してください。間違えてIntel版を入れると、すべての処理がRosetta経由になり、理由もなく性能が落ちてしまいます。

アプリを/Applicationsにドラッグし、起動して特権ネットワークのアクセス許可を承認したら、メニューバーにクジラのアイコンが現れるまで待ちます。

Dockerを遅くしないための重要な設定

この記事の8割はここにあります。実際に効果がある設定は以下のとおりです。

ファイルシステムとしてVirtioFSを有効にする

VirtioFSはgRPC-FUSEに代わるものです。macOS側からマウントしたボリュームの読み書きが2倍から5倍ほど高速になります。現在はデフォルト値ですが、古いインストールから移行した場合はgRPC-FUSEのままになっていることがあります。

設定場所:Docker Desktop → Settings → General → Virtual Machine Options → VirtioFS。

変更後はDockerを再起動してください。ローカルフォルダからnode_modulesやvendorをマウントしているNode、PHP、Pythonのプロジェクトで違いがはっきりわかるはずです。

AppleのVirtualization Frameworkを使う

同じ画面で、Use Virtualization framework(QEMUではなくAppleのもの)をオンにします。これはMシリーズチップのハードウェアアクセラレーションを活かせる方式です。

そのすぐ下にあるUse Rosetta for x86_64/amd64 emulationをオンにしてください。これにより、amd64イメージの実行時にQEMUによるエミュレーションの代わりにRosetta 2が使われます。x86_64イメージでの改善は劇的で、amd64版MySQL 8のコンテナでのテストでは、起動時間が40秒から15秒未満に短縮されました。

CPU、メモリ、ディスクのリソースを調整する

設定場所:Settings → Resources → Advanced。

デフォルトではDocker Desktopに控えめな量のリソースしか割り当てられません。16 GBのMacでデータベースを扱うなら、メモリを8 GBまで増やしてください。18 GB以上であれば8〜10 GBが目安です。ただし、総RAMの50%を超えないようにしましょう。macOSにも余裕が必要です。

CPU:システム用に最低2コアは空けておいてください。12コアのM3 Proであれば、Dockerに8コア割り当てても問題ありません。

ディスク:仮想ディスクは必要に応じて拡張されます。適度な上限(通常64 GBで十分です)を設定し、2週間に一度docker system prune -aで古いイメージを削除しましょう。

使っていない機能を無効にする

Settings → Generalで、Send usage statisticsをオフにし、不要であればOpen Docker Dashboard at startupもオフにします。脆弱性解析を行わないならSBOM indexingもオフにしてください。どれも処理サイクルを消費します。

Settings → Kubernetesでは、本当に使うのでなければKubernetesを無効のままにしておきましょう。ローカルのK8sクラスターは、何もしていなくても2 GBのRAMを消費します。

可能な限りARM64イメージを使う

Dockerを最も速く動かす方法は、何もエミュレートしないことです。多くの公式イメージにはすでにlinux/arm64版が用意されています。PostgreSQL、Redis、Nginx、Node、Python、Ruby、Go、そして最近の多くのデータベースがそうです。

pullする前に、利用可能なアーキテクチャを確認してください:

docker manifest inspect postgres:16 | grep architecture

arm64が表示されればそれを使い、プラットフォームを強制しないでください。amd64しかない場合にのみRosettaが必要になります。

特定のプラットフォームを指定するには:

docker run --platform linux/arm64 postgres:16
docker run --platform linux/amd64 mysql:5.7

docker-compose.ymlの各サービスにplatform: linux/arm64を追加しておくと、予期しない問題を避けられます。

Rosetta 2が役立つ場合と役立たない場合

Rosetta 2は、スタティックバイナリや汎用的な計算を行うアプリケーションでは問題なく動作します。古いデータベース、レガシーツール、amd64版しか存在しない企業向けイメージなどでは、Rosettaを有効にすれば困難を乗り越えられます。

Rosettaが苦手な領域:I/O負荷の高い処理、古いJVM(Java 8のamd64版はクラッシュすることがあります)、特殊なシステムコールを行う一部のバイナリ。Rosetta有効時にamd64コンテナで奇妙なエラーが出る場合は、無効にして、そのケースだけQEMUに戻してみてください。

ボリューム使用の最適化

macOSのフォルダをコンテナ内にマウントする操作は、VirtioFSを使っていても依然として最もコストのかかる処理です。ルールは3つです。

  1. 可能であればnode_modules、vendor、.gitをマウントしないこと。これらのディレクトリにはDockerの名前付きボリュームを使いましょう。仮想マシン内に置かれるため、桁違いに高速です。
  2. 厳密な整合性が不要なマウントには:delegatedまたは:cachedを使う。VirtioFSでは以前ほど影響はありませんが、それでも存在します。
  3. 大量のファイル監視を避ける。フレームワークがファイルを変更するたびに再コンパイルするなら、監視するパスを絞り込んでください。

node_modules用の名前付きボリュームの例:

services:
  app:
    build: .
    volumes:
      - .:/app
      - node_modules:/app/node_modules
volumes:
  node_modules:

MacでのDocker Desktopの代替ツール

Docker Desktopは唯一の選択肢ではなく、場合によっては最善でもありません。有力な代替ツールは3つあります。

OrbStack

OrbStackは「速いDocker Desktop」に最も近いツールです。メモリ消費が少なく(Docker Desktopの1.5 GBに対し、起動時は約400 MB)、2〜3秒で起動し、Apple Silicon上で独自の仮想化実装を使います。Dockerのコマンドラインインターフェースとも変更なしで互換性があります。

商用利用は月8ドル、個人利用は無料です。一日中コンテナを扱うなら、節約されるバッテリーだけで元が取れるでしょう。

Colima

Colimaは無料のオープンソースで、コマンドラインで動作します。Limaを使ってLinuxの仮想マシンを起動し、Dockerのソケットを公開します。グラフィカルなインターフェースはありません。

インストール:

brew install colima docker
colima start --cpu 4 --memory 8 --vm-type vz --vz-rosetta

§h221;–vz-rosettaフラグを付けると、amd64向けにRosettaが有効になります。ターミナル中心で作業し、常駐アプリを動かしたくない人に最適です。

Podman

PodmanはRed Hatのアプローチで、デーモンレス、ルートレスであり、エイリアスによってDockerのCLIと互換性があります。Apple Siliconでも問題なく動作しますが、イメージのエコシステムやdocker-composeなどのツールとの統合は、まだ洗練度が劣ります。

RHEL環境で作業している場合や、Kubernetes/OpenShiftの本番環境に揃えたい場合には適しています。

パフォーマンス診断に役立つコマンド

どのコンテナがリソースを消費しているかを確認する:

docker stats

イメージ、コンテナ、ボリュームの実際のサイズを確認する:

docker system df

使われていないものをすべて削除する(注意:コンテナに関連付けられていないイメージも削除されます):

docker system prune -a --volumes

よくある問題と解決方法

macOSのアップデート後にDocker Desktopが起動しない。 サービスを再起動してください:killall Docker && open /Applications/Docker.app。改善しなければ、Troubleshoot → Reset to factory defaultsを実行します。

イメージのビルド中にファンが全開になる。Settings → ResourcesでDockerに割り当てるCPUを減らしてください。それでも改善しなければ、DockerfileのRUNに(npm install、cargo buildのような)並列化されるプロセスがないか確認しましょう。

マウントしたボリュームが非常に遅い。VirtioFSが有効か確認し、重いディレクトリを名前付きボリュームに移すことを検討してください。

amd64コンテナが起動しない。Rosettaがインストールされているか確認してください(arch -x86_64 uname -mの結果がx86_64になるはずです)。それでも失敗する場合、その特定のバイナリはRosetta 2に対応していないので、Rosetta用のオプションを無効にしてQEMUを使ってください。

Docker Desktopがアイドル時に3 GBのRAMを消費する。古いバージョンでは通常のことです。4.30以降にアップデートしてください。動的メモリマネージャーが、アクティブなコンテナがないときにRAMをシステムへ返却します。

FAQ

業務でDocker Desktopを無料で使えますか?従業員250名以上、または年間売上1,000万ドル以上の企業では使えません。個人利用、教育、小規模なスタートアップであれば使えます。詳細はDockerの公式ライセンスを確認してください。

OrbStackに乗り換える価値はありますか?毎日コンテナを使い、Docker Desktopの消費リソースが気になるなら、はい。たまにしか使わないならDocker Desktopで十分です。

Rosetta 2はどのamd64イメージも完璧にエミュレートできますか?いいえ。ほとんどのケースはカバーしますが、古いJVMや複雑なSIMDを使うツールなど、非常に特殊なバイナリでは失敗することがあります。QEMUが代替手段になります。

Mac M3でKubernetesを無理なく動かせますか?可能ですが、Docker Desktopに統合されたKubernetesよりも、minikubeやk3dを使うほうが適しています。どちらも軽量です。WindowsとLinuxを同時に使う開発環境が必要なら、Parallels Desktop 20でMac M3にWindows 11 ARMをインストールする方法も参考になるかもしれません。

快適にDockerを使うには実際どれだけのRAMが必要ですか?16 GBが最低ラインです。スタックにデータベース、バックエンド、フロントエンド、補助サービスなどを同時に含むなら24 GB以上を推奨します。買い替えを検討中なら、決める前にMacBook Pro M4 ProとM4 Maxの比較も確認してみてください。

JG
🇯🇵 JA