MacBookAir（Apple M1 チップ）でMySQLのDockerイメージ・コンテナを起動したい。

INDEX
[1. やりたいことを確認する。](#1-やりたいことを確認する)
[2. 課題（エラーの状況、不明点、エラーログ）を確認する。](#2-課題エラーの状況不明点エラーログを確認する)
[3. 調査する（ググる、ドキュメントを読む）](#3-調査するググるドキュメントを読む)
[4. 調査結果からの考察、対策を実行する。](#4-調査結果からの考察対策を実行する)

## 1. やりたいことを確認する。

- Docker について、MySQL:5.6 イメージのコンテナを起動したい。
- 使用PCは、SES出向先の支給の **MacbookAir（M1チップ）**

## 2. 課題（エラーの状況、不明点、エラーログ）を確認する。

SES出向先の支給のMacbookAir（M1チップ）で、いつも通り、mysql:5.6のイメージのコンテナを起動しようとしていた。

```bash
$ docker-compose up -d --build

〜略〜

 => ERROR [internal] load metadata for docker.io/library/mysql:5.6                                                                                                                                                                                                         2.4s
------
 > [internal] load metadata for docker.io/library/mysql:5.6:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:20575ecebe6216036d25dab5903808211f1e9ba63dc7825ac20cb975e34cfcae: not found
ERROR: Service 'db' failed to build : Build failed
```

あれ、エラー！…起動していない。

```bash
$ docker-compose ps
Name   Command   State   Ports
------------------------------
```

## 3. 調査する（ググる、ドキュメントを読む）

エラー文の「`[internal] load metadata for docker.io/library/mysql:5.6`」で検索してみる。

### 調査① M1チップ起因っぽい。

> 海外の情報で、「MySQL5.7はM1 Macに対応していないから、MySQL Server5.7を使うといいよ。」というネタを発見しました。
> 
> 
> DBのDockerfileを修正してMySQL Server5.7のイメージを使うようにします。
> 

https://fixel.co.jp/blog/docker-m1mac/

mysql/mysql-server イメージに切り替えればいいみたいだ。

### 調査② mysql イメージと mysql/mysql-server イメージ って何が違うの？

Docker Hub で見比べてみよう。

[mysql - Docker Hub](https://hub.docker.com/_/mysql)

[mysql/mysql-server - Docker Hub](https://hub.docker.com/r/mysql/mysql-server)

ふむふむ、どっちも公式っぽいけど、何が違うのかは…よくわかりません。

> 代替として、mysql公式が用意している、mysql-serverイメージを使います。こちらはarm版もあります。
> 

https://zenn.dev/shinoyu/articles/74ebacbf0e4e55

arm版 というのが肝！…arm って何？

### 調査③ arm って何？

> 2006年からインテル製のCPUをMacに搭載してきたAppleは2020年11月、Armベースの自社開発のチップ「M1チップ」を採用した「MacBook Air」「13インチ MacBook Pro」「Mac mini」をリリースし、その性能とともにPC市場に大きなインパクトを与えた。
> 

https://www.pc-webzine.com/entry/2021/01/armmacapple.html

> **Apple M1**は、AppleがMac及びiPad向けにARMアーキテクチャのライセンスを受けて設計したシステムオンチップ（SoC）である。
> 
引用元：[Apple M1 - Wikipedia](https://ja.wikipedia.org/wiki/Apple_M1)


> **ARMアーキテクチャ** とは、ARMホールディングスの事業部門であるARM Ltdにより設計・ライセンスされているアーキテクチャである。組み込み機器や低電力アプリケーションからスーパーコンピューターまで様々な機器で用いられている。
> 
引用元：[ARMアーキテクチャ - Wikipedia](https://ja.wikipedia.org/wiki/ARM%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)

なるほど。

#### Apple M1 チップは、 ARMアーキテクチャ がベースで、Dockerイメージは mysql/mysql-server にのみ Arm版 があるため、 mysql/mysql-server のイメージを使用する。
ということのようです。

## 4. 調査結果からの考察、対策を実行する

- 編集：docker/mysql/Dockerfile

```diff
- FROM mysql:5.6
+ FROM mysql/mysql-server:5.6

# timezone environment
ENV TZ=Asia/Tokyo

COPY ./docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf
COPY ./docker/mysql/initdb.d /docker-entrypoint-initdb.d

CMD [ "mysqld", "--character-set-server=utf8", "--collation-server=utf8_unicode_ci" ]
```
Dockerイメージからコンテナを作成＆起動してみる。
```bash
$ docker-compose up -d --build

...

Creating sample_db_1 ... done
Creating sample_app_1 ... done
Creating sample_web_1 ... done

$ docker-compose ps
              Name                            Command                       State                   Ports
------------------------------------------------------------------------------------------------------------------
sample_app_1   docker-php-entrypoint php-fpm    Up                      9000/tcp
sample_db_1    /entrypoint.sh mysqld --ch ...   Up (health: starting)   0.0.0.0:3306->3306/tcp
sample_web_1   /docker-entrypoint.sh ngin ...   Up                      0.0.0.0:80->80/tcp
```
Dockerコンテナ起動しました！