Apple M1 上の Docker は、x86_64向けのイメージも動く

公開:2020/12/24
更新:2020/12/24
5 min読了の目安(約4700字TECH技術記事

この記事は「イエソド アウトプット筋 トレーニング 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性能が大きく落ちることがわかりました。ただ、落ちすぎなので、ベンチマークの取り方がおかしいかも知れません。

時間があるときに、検証していきたいと思います。