LoginSignup
68
39

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-12

はじめに

  • 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マーク付いてる!)

image.png

コンテナ起動

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

その他

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

追記

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

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

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

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

68
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
39