1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker×Apple SiliconでMySQLに接続できないときに確認すべきこと

Posted at

はじめに

Apple Silicon(M3)Mac上で Docker を使って開発していて、MySQL コンテナに入ってから mysql に接続できない問題に直面しました。

今回の問題解決を通して、DockerイメージのアーキテクチャとホストPCのアーキテクチャの違いの吸収が必要なことがあること、またMySQLイメージの仕様について理解が深まりました。


発生した問題

  • docker exec -it mysql-container bash で MySQL に入ってから
    mysql -u root -p を実行しても Access denied になって、mysql に接続できない。
    .envdocker-compose.yml にユーザーやパスワードは設定済み。
  • docker-compose down -v を実行すると、 nginx が起動できない。

原因:MySQL の初期化は「最初の1回だけ」

MySQL公式イメージは、初回起動時にだけ以下の環境変数を読み込んで、初期化する仕様になっている。

environment:
  MYSQL_ROOT_PASSWORD: rootpass
  MYSQL_DATABASE: image_hosting
  MYSQL_USER: image_hosting_user
  MYSQL_PASSWORD: image_hosting_pass

一度ボリューム(mysql-data)が作られると、再起動しても初期化処理は実行されない。


解決策:ボリュームごと削除して初期化し直す

docker-compose down -v
docker-compose up -d --build

これで MySQL が初期化され、設定したユーザー・パスワードが反映されるはずだったが、

The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8)

ということで、次の原因を解明する。


原因:アーキテクチャの不一致

Apple Silicon(arm64)Mac上で、Intel(amd64)向けのDockerイメージを起動しようとするとエラーが発生する。


解決策:platformを明示してエミュレート実行

services:
  nginx:
    image: nginx:latest
    platform: linux/amd64
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

platform: linux/amd64 を指定することで、
ARM マシン上でも エミュレーションで amd64 バイナリが実行可能になる。


まとめ

今回の学びを通して

  • dockerを使う場合は、使っているイメージの仕様の理解が大切。
  • ホストPCとLinuxのアーキテクチャが異なる場合は注意が必要。

ということを学びました

ちなみに、以前記載した以下の記事が今回の問題解決に必要な知識の土台になりました。
ということで、コンピュータサイエンス学ぶとDockerのエラーに対応する力が高まるということを実感しました!

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?