Coima + Rosetta 2 で、Apple Silicon 上で x86_64 の Docker イメージをビルドする (Docker desktop やめる)


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 以外の選択肢です。

基本的に、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 をやめる場合は、

  1. Docker desktop 以外の context を作る
  2. 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 のアンインストール

Uninstall | Docker Docs

/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
現在未評価

コメント

コメントを投稿
コメントするには TORICO-ID にログインしてください。
ログイン コメント利用規約