Apple M1 上の Docker は、x86_64向けのイメージも動く
この記事は「イエソド アウトプット筋 トレーニング Advent Calendar 2020」13日目の記事です。でも今はクリスマス25日0:00です。ごめんなさい。
前置き
Apple M1上で動作するDocker Desktop for MacのTech Previewがリリースされましたが、何がどこまでできるのか、そもそもARM64向けのイメージしか動かないかとか、あまり記事がなかったので書いてみます。
Apple M1向けDocker Desktop for Macは、ARM64向けイメージだけでなく、
x86_64向けのDockerイメージも問題無く動きます。
Web開発する上で、CIでビルドされたイメージをdocker pull
して動かすぐらいなら、正直支障が無いです。
ただ、体感上はそこまで気にならないですが、x86_64向けのイメージは、ベンチマーク上は全然性能出てないので、まだまだこれからかも知れません。
また、Dockerの設定を少しいじって再起動すると、Dockerそのものが起動しなくなったり、たまに挙動不審になったりするので、そのへんはまだTech Previewということで。ただ、変なことしなければだいたい動きます。開発にもなんとなく使えています。
本文
つい先日、2020年12月16日に、Apple Silicon上で動く Docker Desktop for Mac が、Tech Previewとして一般公開されました。それまでも、 Docker Developer Preview Program 上で、配布されテストされていましたが、それが一般公開された形です。
Download and Try the Tech Preview of Docker Desktop for M1
上記リンクの下の方にある「Here is the Download!」と書かれているところから、ダウンロードできます。
ダウンロード後、stable版と同じように、.dmgファイルを開き、ApplicationフォルダにDockerアプリケーションをドラッグアンドドロップでインストールして開くと、Apple M1の搭載されたMac上でDocker Desktopが利用できるようになります。
なんか、マインクラフトっぽい。
細かい注意点は「Apple M1 Tech Preview」、にいろいろ書かれていますが、自分の場合、
-
host.docker.internal
がデフォルトで有効になっていない
ぐらいしかはまりどころはなかったです。
docker-compose
から起動しているイメージで、 host.docker.internal
を使っていたので、 docker-compose.yml
の該当サービスに対して、下記を追記しました。
extra_hosts:
- "host.docker.internal:host-gateway"
動かしてみる
docker pull
時に、指定したDockerイメージに、ARM64プラットフォーム向けにビルドされたものがあればそれを、なければx86_64プラットフォームのものが選択されてpullされます。
また、 --platform linux/amd64
のように指定すれば、強制的にそのプラットフォームのイメージを起動したり取得したりするようになります。
下記は、ubuntu
イメージを指定して、それぞれのプラットフォーム向けのイメージを動かしているところです。uname -a
を実行して、それぞれのプラットフォーム向けのKernelが動作していることが確認できました。
ARM64
$ docker run -it --rm --platform linux/arm64/v8 ubuntu uname -a
Linux 4c85f6340539 4.19.104-linuxkit #1 SMP PREEMPT Sat Feb 15 00:49:47 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
x86_64
$ docker run -it --rm --platform linux/amd64 ubuntu uname -a
Linux 3a031e732d0f 4.19.104-linuxkit #1 SMP PREEMPT Sat Feb 15 00:49:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
ベンチマーク
動いたなら、ベンチマークということで、sysbenchを利用して簡単にベンチマークを取ってみました。
MacBook Air (M1,2020) CPU 8コア メモリ 16GBのモデルです。
ベンチマーク用ということで、DockerもCPU8コア、メモリ4GB利用するように設定してあります。
その上で、ubuntuのイメージを利用しつつ、下記の様なコマンドで、CPU、メモリ、ファイルシステムの性能を調査してみました。
sysbench --threads=8 cpu run
sysbench --threads=8 memory run
sysbench --threads=8 --file-test-mode=rndrw --verbosity=0 fileio prepare
sysbench --threads=8 --file-test-mode=rndrw fileio run
結果
ランダムI/Oのディスク性能はほぼ変わらなかったのですが、CPU性能は数値的に約35倍もの差が出てしまいました。当然ARM64用のイメージの方が速いです。
sysbenchのCPUベンチは、システムコールが入らない単純な数値計算で、エミュレーションとはいえ、ここまで性能に差がでるのは何かしらおかしい気がするので、今後時間があるときに調べてみようと思います。
詳細
必要なところ以外、省いてあります。
ARM64
# uname -a
Linux adae0ab05f97 4.19.104-linuxkit #1 SMP PREEMPT Sat Feb 15 00:49:47 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
sysbench 1.0.18 (using system LuaJIT 2.1.0-beta3)
# sysbench --threads=8 cpu run
CPU speed:
events per second: 46268.59
# sysbench --threads=8 memory run
Total operations: 55383646 (5537940.83 per second)
54085.59 MiB transferred (5408.15 MiB/sec)
# sysbench --threads=8 --file-test-mode=rndrw fileio run
File operations:
reads/s: 117.27
writes/s: 78.02
fsyncs/s: 346.74
Throughput:
read, MiB/s: 1.83
written, MiB/s: 1.22
x86_64
# uname -a
Linux c3a5fa4a33f6 4.19.104-linuxkit #1 SMP PREEMPT Sat Feb 15 00:49:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
sysbench 1.0.18 (using system LuaJIT 2.1.0-beta3)
# sysbench --threads=8 cpu run
CPU speed:
events per second: 1317.31
# sysbench --threads=8 memory run
Total operations: 17150839 (1714533.85 per second)
16748.87 MiB transferred (1674.35 MiB/sec)
# sysbench --threads=8 --file-test-mode=rndrw fileio run
File operations:
reads/s: 117.41
writes/s: 77.79
fsyncs/s: 346.38
Throughput:
read, MiB/s: 1.83
written, MiB/s: 1.22
まとめ
Apple Silicon向けの、Docker Desktop for Macは、x86_64のイメージもエミュレーションで動作します。触っている限りでは、docker-compose
でARM64、x86_64のイメージが混在している状況でも、通信で問題が起きる事もありません。
また、簡易的にsysbenchを利用してベンチマークをとってみましたが、x86_64のエミュレーションではCPU性能が大きく落ちることがわかりました。ただ、落ちすぎなので、ベンチマークの取り方がおかしいかも知れません。
時間があるときに、検証していきたいと思います。
Discussion