Docker Desktop を使わずに、Mac で x86 の Docker イメージのビルドをする手順を書いています。
以下の環境を想定しています。
- 実運用しているコンテナランナー(KubernetesやECSなど)のCPUアーキテクチャーが x86_64 (linux/amd64) である
- Apple Silicon (ARM) の Mac で開発しており、その Mac で本運用イメージをクロスアーキテクチャービルドしている
- Docker Desktop を使っているが、使用料が重いのでやめたい
- GUI は不要
ベストプラクティスとしては、「Colima + Rosetta2」だと思いますので、その方法を書きます。
- x86_64 (linux/amd64) をクロスアーキテクチャービルドしない場合、Rosetta2 は不要です。逆に、する場合は Rosetta2 を使わないと(QEmuを使うと)は十分なパフォーマンスが出せないので、必須です。
- Rosetta2 を使うことで、Docker Desktop と遜色ないパフォーマンスでクロスアーキテクチャの運用ができます。
(写真: Unsplash / Eduardo Garcia)
ダイジェスト
brew install colima
colima start \
--cpu 4 \
--memory 4 \
--disk 100 \
--arch aarch64 \
--vm-type vz \
--vz-rosetta \
--mount-type virtiofs
colima ls
docker context ls
docker context use colima
docker run hello-world
docker run --rm --name nginx -p 80:80 nginx:alpine
代替アプリ
Docker Desktop 以外の選択肢です。
- Rancher Desktop (GUI)
- Podman Desktop (GUI)
- Orbstack (有料)(GUI)
- Finch
- Colima
- Lima
基本的に、Finch も Colima も、コアは Lima です。 Rancher Desktop もバックエンドは Lima です。
そのため、最小構成としては Lima をそのまま使えばいいのですが、「mac で Docker」に特化した CLI を提供しているのが Colima であり、Docker を使う分には余計な選択肢が無い分混乱しにくいので、本件の用途に限定するのであれば Colima が使いやすいと思います。
現在の docker context の確認
% docker context ls
docker
コマンド ( docker cli ) の向き先が、どの Docker コンテキストに向いているかが確認できます。
解説: Docker Context | Docker ドキュメント
Docker desktop をやめる場合は、
- Docker desktop 以外の context を作る
- docker cli のコンテキストを、先ほど作った context に向ける
というのが大きな流れになります。
言いたいこととしては、Docker desktop をアンインストールせずとも、複数 docker 環境を切り替えて動作確認できるということです。
補足として、本格的に切り替える場合は、Docker desktop を使われている場合は docker cli も Docker desktop に付属しているものを使っているはずなので、別の docker cli に切り替える必要があります。( brew でインストールできます )
切り替え手順
Colima のインストール
brew install colima
仮想マシンの起動
colima start \
--cpu 4 \
--memory 4 \
--disk 100 \
--arch aarch64 \
--vm-type vz \
--vz-rosetta \
--mount-type virtiofs
Apple Silicon 搭載Mac で、x86 のイメージをビルドする場合、--vz-rosetta
を必ず指定します。
なお、Rosetta ではなく QEmu でエミュレーションすることもできますが、Rosetta に比べて遅く、選択する理由がありません。
仮想マシンの状態の確認
colima ls
Docker context も自動的に作られます。
docker context ls
docker context の切り替え
docker context use colima
動作検証
docker run hello-world
docker run --rm --name nginx -p 80:80 nginx:alpine
Docker desktop を今まで使っていた場合、現段階で Context (バックエンド) の切り替えが完了しました。
動作速度に問題も無く、十分実用的な挙動をしていると思います。
docker desktop のアンインストール
/Applications/Docker.app/Contents/MacOS/uninstall
rm -rf ~/Library/Group\ Containers/group.com.docker
以下、必要に応じて実行。実行すると docker context の設定が消えてしまうので、colima start をやりなおす等の対応が必要になります。
rm -rf ~/.docker
brew で docker cli をインストールする
brew install docker
brew link docker
この段階で、 Docker desktop から Colima への切り替えが完了しています。
docker-buildx のインストール
brew でインストールした docker は、 buildx 相当の機能が使えません。
例えば、 docker build --ssh defualt ...
の --ssh
オプションが使えません。
これらを使えるようにするため、 docker-buildx
の CLI をインストールします。
brue install docker-buidx
使い方:
docker-buildx build --ssh default ...
といった感じで、buildx
相当の機能が使えるようになります。
補足: Lima を使う場合
今回の要件であれば Colima が最適だと思いますが、Lima の CLIも試しに使ってみたので、内容を書いておきます。
インストール
brew install lima
Lima で docker 用の仮想マシンを起動する
limactl create \
--name lima-with-rosetta \
--cpus 4 \
--memory 4 \
--vm-type vz \
--rosetta \
--mount-type virtiofs \
template://docker
Colima の場合とやってることは同じです。(おそらく Colima は内部的にこれ↑をやっている?)
実行すると、メニューが表示されます。
Proceed with the current configuration
を選ぶと、ただちに仮想マシンが起動します。
Open an editor to review or modify the current configuration
を選択すると、エディターが起動し、テンプレートを元にした仮想マシンの設定を細かく設定することができます。
また、今回は テンプレートを指定して起動していますが、細かく設定したテンプレートを YAML ファイルで用意しておいて、それを元に仮想マシンを起動することもできます。
docker context の作成と採用
docker context create \
--docker "host=unix://${HOME}/.lima/lima-with-rosetta/sock/docker.sock" \
--description "Lima with Rosetta" \
lima-with-rosetta
docker context use lima-with-rosetta
動作検証
docker run hello-world
docker run --rm --name nginx -p 80:80 nginx:alpine
補足: QEmu で x86 の仮想マシンを起動する
実行する意味はほぼありませんが、Rosetta がいかに速いかが実感できます。
brew install qemu # 多くの依存ライブラリがインストールされる
limactl start \
--arch x86_64 \
--cpus 4 \
--memory 4 \
--name=lima-ubuntu-amd64
limactl ls
動作検証
lima 上で bash を起動する
LIMA_INSTANCE=lima-ubuntu-amd64 lima bash
uname -a
cat /proc/cpuinfo
QEmu での x86_64 エミュレーションがされている
Docker cli ではなく 仮想マシン内の nerdctl で Docker イメージを起動してみる
LIMA_INSTANCE=lima-ubuntu-amd64 lima nerdctl run hello-world
LIMA_INSTANCE=lima-ubuntu-amd64 lima nerdctl run --rm --name nginx -p 80:80 nginx:alpine