Apple Silicon Mac に x86-64 な Docker 環境を UTM で構築する
※追記
舌の根も乾かぬうちに Lima で圧倒的に手軽に実現できました。 Lima 版もご笑覧ください。
背景
Intel Mac の新品購入がそのうち無理になることが予見されるなかで、とはいえ x86-64 なコンテナで開発してんのにどうすんだよって答えが放置されたままな気がしています。
QEMU を基盤技術としている UTM を使うと、Apple Silicon Mac に、ARM64以外のCPUアーキテクチャのVMを立てることができます。UTMは、Apple Silicon向けのパッチ適用済みのQEMUがバンドルされているため、lima, podman machine と比較すると、わちゃわちゃせず即利用できます。
Ubuntu の作例はググるといくつかありますが、ちょっと食傷気味なので、 Fedora CoreOS でやってみました。 Fedora CoreOS は現状 x86-64 版しか公式には存在しておらず、かつ、docker と podman の両方がバンドルされており、なんかいろいろ都合がよさそうです。
準備
UTM自体はGitHubで開発されているOSSです。御布施のため(?)、Apple Storeでも購入することができます。どちらでも同じようです。UTMは汎用のVM基盤ソフトのため、docker, docker-composeは別途でインストールが必要です。
brew install utm docker docker-compose
UTM で x86-64 な Fedora CoreOS を立てる
UTM に VM を立てる手順は以下あたりを参考にしてください。
差異は以下です。
- Architecture は x86-64
- Memory は好きなだけ
とにかく立ち上がったら、Fedora CoreOS の構築は以下のように。
脇道: VM内にガチャガチャやる前に
ただし UTM の窓からVM内ににコピペができないので、↑に先立って、手元MacからSSHで入れるようにします。
UTM で起動した Fedora CoreOS のウィンドウで、VM内にSSH公開鍵を置きます。
mkdir ~/.ssh
curl https://github.com/${GITHUB_USER_NAME}.keys -o ~/.ssh/authorized_keys
このVMのIPアドレス、Linuxユーザー名などは、
ip a
id
そしたら Mac から好みのターミナルでSSHで作業できます。
脇道: ignition ファイルのホスティング
ignition.yaml は、gist.github.com や、dotfiles に置いてもよいでしょう。ignition.ign も gist に置いてよさそうです。ローカル環境限定ですし。
脇道: ストレージ名
インストール先デバイス名は、サンプルでは /dev/sda ですが、当然ですが慣習的なサンプルで、
sudo coreos-installer install /dev/sda --ignition-file ignition.ign
UTMに作ったときのストレージサイズから、lsblk して出てきたデバイス名で、名前を探してください
2375 を LISTEN させる
docker コマンドと docker daemon の通信はTCPで、ポート 2376 はTLS暗号通信、2375は平文通信です。
きちんと構築したり、minikubeのようなツールでは、起動時にTLSの証明書まわりもハンドリングしてくれています。今回はチマチマ手作業しており、証明書を生成すんのも面倒くせえので、2375の平文通信してしまいます。所詮ローカル環境なので。
Fedora CoreOS にバンドルされてる docker の設定ファイルは、 /etc/sysconfig/docker
です。ここに -H=0.0.0.0:2375
を追記することで、ポート LISTEN をリッスンしてくれるようになります。
[core@localhost ~]$ cat /etc/sysconfig/docker
# /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS="--selinux-enabled \
--log-driver=journald \
--live-restore \
--default-ulimit nofile=1024:1024 \
--init-path /usr/libexec/docker/docker-init \
--userland-proxy-path /usr/libexec/docker/docker-proxy \
-H=0.0.0.0:2375 -H=unix:///var/run/docker.sock \
"
[core@localhost ~]$
↑のファイル変更を systemd に読み込ませます。
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker
きちんと 2375 構えてるか確認してみます。よさそうですね。
[core@localhost ~]$ netstat -ntap | grep 2375
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::2375 :::* LISTEN -
[core@localhost ~]$
手元 Mac から docker コマンドで叩いてみる
今回平文なので、環境変数は DOCKER_HOST だけでよいです。以下で見慣れた光景になればオッケーでしょう。IPアドレスは私の手元でたまたまVMに割り当たったIPです。
set -gx DOCKER_HOST "tcp://192.168.64.3:2375"
docker ps -a
docker info
手元 Mac から docker-compose してみる
docker コマンドが使えるようになれば、docker-compose コマンドも利用できます。例として phpMyAdmin + MariaDB な docker-compose.yml を手元に転がして、 DOCKER_HOST
のIPアドレスの、phpMyAdminのポートをウェブブラウザで開けたら、動作としては大丈夫ですね。
まとめ
構築のクセが極めて強いですが、Apple Silicon Mac に、x86-64 な Docker な VM を作れるのはとても強い利点に思いました。しかしまあ書いといて何ですが、これだったら UTM で x86-64 で Ubuntu 20.04 で立てたほうが、素直に構築できると思います。作例も多いですし。
Discussion
Fedora CoreOSのaarch64版は34.20210821.3.0 から公式にリリースされるようになってます。
また、Podman machineはFedora CoreOSで動作します。HomebrewでM1パッチ対応のQEMUが配信されるようになったのでM1 Macでも手軽にPodmanを始めるようになると思います。
ありがとうございます。
野良な手順で入れていた qemu を一掃して、
brew install qemu lima podman
でコケずに入るようになりましたし、limactl start default
も通るようになりました。podman machine はまだのようですが、遠からず届きそうですね。