お問い合わせ
Docker MySQL接続できない原因を全部解説【Windows・Mac対応】

Docker MySQL接続できない原因を全部解説【Windows・Mac対応】

Jay-Piy wabi_motion

Docker MySQL接続できない原因を全部解説【Windows・Mac対応】

DockerでMySQLに接続できない原因と解決策をWindows・Mac両対応で解説。ポートフォワーディング・bind-address・ymlミスなどよくある原因をチェックリスト付きでまとめました。

はじめに:Docker × MySQLで詰まるのはあなただけじゃない

「DockerでMySQLコンテナを起動したのに、なぜか接続できない…!」

エンジニアなら一度はぶつかる壁です。コンテナは起動しているのにエラーが出る、ログを見てもよくわからない、そもそも何が動いているのかわからない。そんな状況、経験したことがある方も多いのではないでしょうか。

筆者はLinux LPIC Level 3を保有しており、業務でもLinux環境を扱っています。そのベースがあったおかげで、Dockerの概念自体はそれほど難しく感じませんでした。ただ、「理解していること」と「実際に構築できること」は別の話です。ymlファイルのミスで起動しない、ネットワーク設定が噛み合わないといったトラブルは、筆者自身もAIとやりとりしながら解決しました。笑

AIを使えば構築自体はすぐできます。ただ、何がどう動いているかを理解していないと、エラーが出たときに詰みます。この記事では、Docker × MySQLで接続できない原因と解決策を、Windows・Mac両対応でまとめます。

そもそもDockerとMySQLの関係を整理する

接続できない原因を理解するために、まずDockerの仕組みを軽く整理しておきましょう。

Dockerはコンテナという独立した実行環境を作ります。MySQLコンテナはホストOS(WindowsやMac)とは別のネットワーク空間で動いています。つまり「コンテナが起動している」=「ホストから自由に接続できる」ではないのです。

ホストOS(Windows / Mac)
 ↕ ポートフォワーディング設定が必要
Dockerネットワーク
 ↕
MySQLコンテナ(3306番ポートで待ち受け)

この構造を頭に入れておくだけで、トラブルシュートがかなり楽になります。

Docker MySQL接続できない:よくある原因5選

① ポートフォワーディングの設定漏れ

最も多い原因です。docker-compose.ymlで以下の設定がないと、ホストからMySQLに接続できません。

services:
  db:
    image: mysql:8.0
    ports:
      - "3306:3306"  # ← これがないと詰む

3306:3306は「ホストの3306番ポートをコンテナの3306番ポートに転送する」という意味です。この1行がないだけで「接続できない沼」にハマります。

② MySQLのbind-addressがlocalhostのみ

MySQLのデフォルト設定ではbind-address=127.0.0.1(localhost)になっており、外部からの接続を拒否します。Dockerネットワーク経由の接続も「外部」扱いになるため、以下の設定が必要です。

# my.cnf
[mysqld]
bind-address = 0.0.0.0

または、docker-compose.ymlのcommandで指定する方法もあります。

services:
  db:
    image: mysql:8.0
    command: --bind-address=0.0.0.0

③ MySQLの初期化が完了していない

コンテナを起動してすぐに接続しようとすると、MySQLの初期化が終わっていなくて接続できないことがあります。

# コンテナのログを確認する
docker logs コンテナ名

# 以下が表示されれば初期化完了
# ready for connections.

焦って何度も接続を試みるより、ログを確認して初期化完了を待つのが正解です。

④ ymlファイルのインデント・記述ミス

筆者が実際によくやるやつです。笑。YAMLはインデントに厳格で、スペース1つのズレで動かなくなります。

# NG例(インデントがズレている)
services:
db:           ← ここがズレているとエラー
  image: mysql:8.0

# OK例
services:
  db:
    image: mysql:8.0

エラーメッセージが意味不明に見えるときは、まずymlのインデントを疑ってください。AIに「このymlのエラーを直して」と投げると一発で解決することも多いです。

⑤ Windowsのファイアウォールがブロックしている

Windows特有の問題です。Dockerの通信をWindowsのファイアウォールがブロックするケースがあります。

確認手順:
1. Windows Defender ファイアウォール → 詳細設定
2. 受信の規則 → 新しい規則
3. ポート → TCP → 3306 → 接続を許可する

Docker MySQL接続できない:確認コマンド一覧

原因を絞り込むための確認コマンドをまとめます。

# コンテナが起動しているか確認
docker ps

# コンテナのログを確認(エラーの原因はここに出る)
docker logs コンテナ名

# ポートが正しくマッピングされているか確認
docker port コンテナ名

# コンテナ内に入ってMySQLに直接接続してみる
docker exec -it コンテナ名 mysql -u root -p

# ネットワーク設定を確認
docker network ls
docker network inspect ネットワーク名

「接続できない」と焦ったときは、まずdocker logsを確認するのが鉄則です。エラーの原因のほとんどはここに書いてあります。

Mac環境での注意点

MacでDockerを使う場合、Windowsとは少し異なる点があります。

# Mac特有の注意点

# host.docker.internalでホストOSに接続できる
# (Windows・Macどちらも使える)
host: host.docker.internal

# localhostではなくhost.docker.internalを使う
mysql -h host.docker.internal -u root -p

筆者はMac上でWindowsを立てた環境でDockerを触った経験がありますが、ネットワークのレイヤーが増えるほど「どこで詰まっているか」の特定が難しくなります。基本の構成を理解した上で試すのが大切です。

docker-compose.yml サンプル(コピペで使えるやつ)

接続できない原因を全部潰した設定例です。

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: mysql_container
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    command: --bind-address=0.0.0.0

volumes:
  mysql_data:
# my.cnf
[mysqld]
bind-address = 0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[client]
default-character-set = utf8mb4

文字コードの設定(utf8mb4)も入れておくと、日本語を扱う際の文字化けを防げます。地味に大事なポイントです。

AIを使った構築のリアルな話

正直に言うと、Docker環境の構築はAIに頼りながらやるのが今の時代の正解だと思っています。

AIを使えば構築自体は驚くほどすぐできます。ただ「何がどう動いているかを理解していないと、エラーが出たときに詰みます。」ymlファイルのエラーなど、割と頻繁に発生しますが、理解があればAIとの会話でほぼ解決できます。

筆者はLinux LPIC Level 3を持っており、コンテナやネットワークの概念は業務経験から理解していたため、トラブルシュートには困りませんでした。ただ、その前提がなかったとしても、エラーメッセージをそのままAIに投げれば解決策が返ってきます。「AIに頼る」と「仕組みを理解する」はどちらかではなく、両方やるのが最強です。

まとめ:Docker MySQL接続できないときのチェックリスト

接続できないときは以下を順番に確認してください。

  • ✅ docker-compose.ymlにポートマッピング(3306:3306)が設定されているか
  • ✅ bind-addressが0.0.0.0になっているか
  • ✅ docker logsでMySQLの初期化が完了しているか
  • ✅ ymlのインデントにミスがないか
  • ✅ Windowsの場合、ファイアウォールがポートを許可しているか
  • ✅ Macの場合、host.docker.internalで接続を試みたか

「接続できない」の原因のほとんどは、設定の抜け漏れか、ネットワークの仕組みへの理解不足です。焦らず一つずつ確認していけば必ず解決できます。AIとうまく付き合いながら、快適なDocker環境を構築してください。

最後までお読みいただき、誠にありがとうございました。

ITエンジニアとして働きながら、AI・映像制作・AWSについて実体験をもとに発信しています。少しでも参考になれば嬉しいです。

他の記事もぜひ読んでみてください。