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に参加する
    - https://www.docker.com/community/get-involved/developer-preview
1. Docker Community Slackに参加する
    - https://www.docker.com/docker-community
1. Developer Preview Program の案内メールが来るのでDocker Community SlackのDisplay Nameを伝える
    - #dev-preview-programに招待される
1. #dev-preview-programのpin付けされているメッセージを読んでDokcerのPreview5を入手する
    - ここのメッセージに注意事項もセットで記載されてます

---

# インストール

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72156/8c9296e8-4fc9-bf78-8fd9-7b050379a5ec.png)

# コンテナ起動

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

# その他

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

# 追記

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

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

ちなみに以下のようにdocker hubにamd64とarmの両方が用意されている場合もうまくいかないケースがありました。
その場合も対処方法としては利用したいバージョンのハッシュもしくはplatformをセットで指定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72156/6c0b5d16-43dd-8190-eb0f-3d4f691f9d43.png)

## MySQL 5.6系の起動チェック

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

### ハッシュ指定 OK

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

- 実行コマンド
    - 5.6.47をハッシュで指定
        - https://hub.docker.com/layers/mysql/library/mysql/5.6.47/images/sha256-7d4df6c491e9b844b8c594c5607cea7465b42bd3d51db3d93359b3e8d06f1518?context=explore
    - `docker run --rm -it mysql@sha256:7d4df6c491e9b844b8c594c5607cea7465b42bd3d51db3d93359b3e8d06f1518`
- 実行結果

```text

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`
- 実行結果

```text
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`
- 実行結果

```text
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`
- 実行結果

```text

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

- 実行コマンド
    - 5.6.46をハッシュで指定
        - https://hub.docker.com/layers/mysql/library/mysql/5.6.46/images/sha256-cb0ea262eb3261fc5c5b2fa8b08b95c642e1ec112736def5f41eb9b85f914c5f?context=explore
    - `docker run --rm -it mysql@sha256:cb0ea262eb3261fc5c5b2fa8b08b95c642e1ec112736def5f41eb9b85f914c5f`
- 実行結果

```text
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は削除しておく)
    - MySQLのバージョン変えた場合にうまく起動しない場合は実施。
        - 参考: https://qiita.com/astrsk_hori/items/6ca1ff27c911673ff7cc

## 補足

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