🎃

Apple Silicon Mac に x86-64 な Docker 環境を UTM で構築する

2021/09/19に公開約3,700字2件のコメント

※追記

舌の根も乾かぬうちに 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のポートをウェブブラウザで開けたら、動作としては大丈夫ですね。

https://hub.docker.com/r/phpmyadmin/phpmyadmin/

まとめ

構築のクセが極めて強いですが、Apple Silicon Mac に、x86-64 な Docker な VM を作れるのはとても強い利点に思いました。しかしまあ書いといて何ですが、これだったら UTM で x86-64 で Ubuntu 20.04 で立てたほうが、素直に構築できると思います。作例も多いですし。

参考

Discussion

Fedora CoreOSのaarch64版は34.20210821.3.0 から公式にリリースされるようになってます。

https://builds.coreos.fedoraproject.org/browser?stream=stable&arch=aarch64

また、Podman machineはFedora CoreOSで動作します。HomebrewでM1パッチ対応のQEMUが配信されるようになったのでM1 Macでも手軽にPodmanを始めるようになると思います。

ありがとうございます。

HomebrewでM1パッチ対応のQEMUが配信されるようになった

https://formulae.brew.sh/formula/qemu

野良な手順で入れていた qemu を一掃して、 brew install qemu lima podman でコケずに入るようになりましたし、 limactl start default も通るようになりました。

podman machine はまだのようですが、遠からず届きそうですね。

https://formulae.brew.sh/formula/podman
❯ brew install podman
Updating Homebrew...
==> Downloading https://ghcr.io/v2/homebrew/core/podman/manifests/3.3.1
Already downloaded: /Users/sasasin/Library/Caches/Homebrew/downloads/50122293d751946a1a9af5eeea8c5fa919a2a60823db667334428ac61eeccff3--podman-3.3.1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/podman/blobs/sha256:a4f84427f1f207d67376b51cd9ca9c0a07b1f20e2bc82b7d6d1ae0beadc4d
Already downloaded: /Users/sasasin/Library/Caches/Homebrew/downloads/9059295ca8d031221c7d56dbc03216a3e10e67e61858fbdc4415692f00c69a7d--podman--3.3.1.arm64_big_sur.bottle.tar.gz
==> Pouring podman--3.3.1.arm64_big_sur.bottle.tar.gz
==> Caveats
fish completions have been installed to:
  /opt/homebrew/share/fish/vendor_completions.d
==> Summary
🍺  /opt/homebrew/Cellar/podman/3.3.1: 170 files, 39.9MB

❯ podman machine init
Error: due to missing upstream patches, Apple Silicon is not capable of running Podman machine yet
ログインするとコメントできます