Macbook Pro M1(Apple Silicon) で Dockerを動かす


はじめに

  • M1用のDocker for Mac のPreview版に関する記事です。
  • 正式版が出た場合は一切役に立たない可能性があります。
  • M1のDockerでMySQL、その他で起動しない問題に遭遇したら約に立つかもしれません。

準備

※英語わかんなくてもなんとかなります。

追記)
docker blogでPreview7が公開されました。
https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/

以下はPreview5入手時の手順。

  1. DockerのDeveloper Preview Programに参加する
  2. Docker Community Slackに参加する
  3. Developer Preview Program の案内メールが来るのでDocker Community SlackのDisplay Nameを伝える
    • #dev-preview-programに招待される
  4. #dev-preview-programのpin付けされているメッセージを読んでDokcerのPreview5を入手する
    • ここのメッセージに注意事項もセットで記載されてます

インストール

  • dmgファイルを実行
  • いつもの手順でApplicationsへ入れる(PREVIEWマーク付いてる!)

コンテナ起動

  • Docker.appを実行
    • 特に問題発生せず

その他

  • あっけなく動いてしまった
  • 時間かかるのはPreview版を入手するところまで
  • 動かないイメージはちらほら(手元で使ってたものは3割動かなかった)

追記

amd64のエミュレーションを機能させる

amd64のimageを使っていても動くはずと思っていましたが、Preview版では動きませんでした。
この問題はPreview5でもPreview7でも対処が必要です。(正式版ではきっと改善されるはず。)
対処方法はimageを指定する際にバージョンではなくハッシュを指定するだけです。

ちなみに以下のようにdocker hubにamd64とarmの両方が用意されている場合もうまくいかないケースがありました。
その場合も対処方法としては利用したいバージョンのハッシュもしくはplatformをセットで指定するだけです。

MySQL 5.6系の起動チェック

MySQL5.6系のリビジョン違いで動かないケースがあるので参考情報として残しておきます。

ハッシュ指定 OK

最初に知ったのはこの方法。


WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
2020-12-17 17:30:36+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-17 17:30:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-12-17 17:30:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-17 17:30:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

恒例(?)のパスワード要求まで辿りつけます。

バージョン指定 OK

取得したいアーキテクチャを明記すればOK。

  • 実行コマンド
    • docker run --rm --platform linux/amd64 -it mysql:5.6.47
  • 実行結果
Unable to find image 'mysql:5.6.47' locally
5.6.47: Pulling from library/mysql
Digest: sha256:852b5dee257c9c23ce410b7d005f9d8f04efa9998059780cd5a358d866c53dea
Status: Downloaded newer image for mysql:5.6.47
2020-12-26 12:04:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-26 12:04:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-12-26 12:04:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.47-1debian9 started.
2020-12-26 12:04:59+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

バージョン指定 NG

バージョン指定で起動しようとするとarmのimageを探しにいってしまいエラーになる。

  • 実行コマンド
    • docker run --rm -it mysql:5.6.47
  • 実行結果
Unable to find image 'mysql:5.6.47' locally
5.6.47: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.

バージョン指定 NG

※8.0系はバージョン指定で起動できます。

  • 実行コマンド
    • docker run --rm -it mysql:5.6.46
  • 実行結果

Unable to find image 'mysql:5.6.46' locally
5.6.47: Pulling from library/mysql
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
See 'docker run --help'.

ハッシュ指定 NG

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
2020-12-17 17:26:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
2020-12-17 17:26:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
runtime: failed to create new OS thread (have 2 already; errno=22)
fatal error: newosproc

runtime stack:
runtime.throw(0x524da0, 0x9)
    /usr/local/go/src/runtime/panic.go:527 +0x90
runtime.newosproc(0xc82002e000, 0xc82003dfc0)
    /usr/local/go/src/runtime/os1_linux.go:150 +0x1ab
runtime.newm(0x555ce8, 0x0)
    /usr/local/go/src/runtime/proc1.go:1105 +0x130
runtime.main.func1()
    /usr/local/go/src/runtime/proc.go:48 +0x2c
runtime.systemstack(0x5c4300)
    /usr/local/go/src/runtime/asm_amd64.s:262 +0x79
runtime.mstart()
    /usr/local/go/src/runtime/proc1.go:674

goroutine 1 [running]:
runtime.systemstack_switch()
    /usr/local/go/src/runtime/asm_amd64.s:216 fp=0xc820028770 sp=0xc820028768
runtime.main()
    /usr/local/go/src/runtime/proc.go:49 +0x62 fp=0xc8200287c0 sp=0xc820028770
runtime.goexit()
    /usr/local/go/src/runtime/asm_amd64.s:1696 +0x1 fp=0xc8200287c8 sp=0xc8200287c0

docker-composeの場合

docker-composeを使っていて
docker-compose up -d --no-deps --build service-name

移行アシスタントでデータを移行してきている場合

docker volumeの削除

※特に不具合ない場合は削除不要。

  • docker volume ls で不具合が起きているvolumeを確認
  • docker volume rm xxxx で対象のvolumeを削除( 事前に 対象のvolumeを使用している containerは削除しておく)

補足

ハッシュ調べたいときは以下のページでtag(バージョン)を検索。
https://hub.docker.com/_/mysql?tab=tags&page=1&ordering=last_updated