INDEX
1. やりたいことを確認する。
2. 課題(エラーの状況、不明点、エラーログ)を確認する。
3. 調査する(ググる、ドキュメントを読む)
4. 調査結果からの考察、対策を実行する。
1. やりたいことを確認する。
- Docker について、MySQL:5.6 イメージのコンテナを起動したい。
- 使用PCは、SES出向先の支給の MacbookAir(M1チップ)
2. 課題(エラーの状況、不明点、エラーログ)を確認する。
SES出向先の支給のMacbookAir(M1チップ)で、いつも通り、mysql:5.6のイメージのコンテナを起動しようとしていた。
$ 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
あれ、エラー!…起動していない。
$ 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のイメージを使うようにします。
mysql/mysql-server イメージに切り替えればいいみたいだ。
調査② mysql イメージと mysql/mysql-server イメージ って何が違うの?
Docker Hub で見比べてみよう。
mysql/mysql-server - Docker Hub
ふむふむ、どっちも公式っぽいけど、何が違うのかは…よくわかりません。
代替として、mysql公式が用意している、mysql-serverイメージを使います。こちらはarm版もあります。
arm版 というのが肝!…arm って何?
調査③ arm って何?
2006年からインテル製のCPUをMacに搭載してきたAppleは2020年11月、Armベースの自社開発のチップ「M1チップ」を採用した「MacBook Air」「13インチ MacBook Pro」「Mac mini」をリリースし、その性能とともにPC市場に大きなインパクトを与えた。
Apple M1は、AppleがMac及びiPad向けにARMアーキテクチャのライセンスを受けて設計したシステムオンチップ(SoC)である。
ARMアーキテクチャ とは、ARMホールディングスの事業部門であるARM Ltdにより設計・ライセンスされているアーキテクチャである。組み込み機器や低電力アプリケーションからスーパーコンピューターまで様々な機器で用いられている。
なるほど。
Apple M1 チップは、 ARMアーキテクチャ がベースで、Dockerイメージは mysql/mysql-server にのみ Arm版 があるため、 mysql/mysql-server のイメージを使用する。
ということのようです。
4. 調査結果からの考察、対策を実行する
- 編集:docker/mysql/Dockerfile
- 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イメージからコンテナを作成&起動してみる。
$ 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コンテナ起動しました!