はじめに: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環境を構築してください。