はじめに
Apple社のMacBookがARMベースのCPU、すなわちApple Siliconへと移行して数年が経過した。現在市場に出回っている新製品のCPUはすべてARMアーキテクチャを採用している。この変化は多くの利点をもたらしたが、開発業務においては依然としてホストマシンのCPUがx86系を前提としているケースも少なくない。このような状況を踏まえ、M1 Mac上でx86用のDockerコンテナを実行し、コンテナ内でビルドを行う方法について調査を進めた。
Docker Desktop for Mac、Orbstack、そしてColimaは、M1 Mac上でDocker環境を簡易に構築できるツールである。特にColimaを使用する際に遭遇した思わぬ落とし穴について、その解決法を含めてメモとして記録する。
Colimaでx86_64用Dockerコンテナを実行する
具体的にx86_64用のDockerコンテナを実行するプロセスと失敗について確認する。
Colimaとは
Colimaは、Limaをベースとしたコンテナランタイムである。LimaはLinuxの仮想マシンをmacOS上で簡単に起動できるツールであり、ColimaはこのLimaを利用してDockerコンテナを扱いやすくするための環境を提供する。
- 公式GitHubリポジトリ: https://github.com/abiosoft/colima
- Colimaの使い方に関する参考記事: https://qiita.com/nishikyon/items/ac3eed100eb118c8af22
インストール
Homebrewを使用してColimaをインストールすることができる。以下のコマンドを実行することで簡単にインストールできる。
$ brew install colima
VMを作成
x86_64用のDockerコンテナを実行するためには、ColimaのVMを適切に設定して作成する必要がある。以下の手順でVMを作成することが推奨される。
x86_64アーキテクチャのVMを作成
$ colima start --cpu 8 --memory 12 --disk 160 --arch x86_64 --vm-type=vz --vz-rosetta --mount-type virtiofs
--archにx86_64を指定すると、x86_64用のQEMUを起動し、その結果処理が遅くなる。
このコマンドは、x86_64アーキテクチャ用のVMを作成し、Dockerコンテナの実行環境を準備する。
aarch64アーキテクチャのVMを作成
$ colima start --cpu 8 --memory 12 --disk 160 --arch aarch64 --vm-type=vz --vz-rosetta --mount-type virtiofs
vzとRosettaを使用してaarch64アーキテクチャ用のVMを作成することで、より高速にx86_64用のDockerコンテナを実行することが可能である。
この方法は、ARMアーキテクチャの性能を最大限に活用しつつ、x86_64用のアプリケーションを動作させることができる。
x86_64用Dockerコンテナを実行
以下のコマンドを使用して、x86_64のUbuntu 22.04のデスクトップ版のDockerコンテナを起動することができる。
$ docker run --rm -it --platform=linux/amd64 ubuntu:22.04
このコマンドは、指定されたプラットフォーム(この場合はlinux/amd64)でUbuntu 22.04のコンテナを起動し、対話的なシェルを提供する。これにより、開発者はM1 Mac上でもx86アーキテクチャを必要とするアプリケーションの開発やテストを行うことができるようになる。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.6 0.0 1196696 6452 pts/0 Ss 22:22 0:00 /mnt/lima-rosetta/rosetta /bin/bash
root 10 0.0 0.0 1198840 4864 pts/0 R+ 22:22 0:00 /usr/bin/ps aux
コンテナ内でpsコマンドを実行するとbashコマンドがrosettaを経由して実行されていることが確認できる。
この記事では、M1 Mac上でx86_64用のDockerコンテナを実行するための方法と、それを実現するためのツールであるColimaの使用方法について説明した。この情報が、同様の環境で開発を行っている方々の参考になれば幸いである。