Docker を使って MySQL コンテナを起動した後、ローカルホストの MySQL サーバーに接続しようとした際に、以下のエラーメッセージに遭遇することがあります。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
このエラーは、 MySQL サーバーに接続しようとしているが、指定されたソケットファイルが見つからない、もしくはアクセスできないことを示しています。この記事では、このエラーの原因と解決方法について詳しく解説します。
原因
このエラーの主な原因として考えられるのは次の通りです。
- MySQL サーバーが起動していない: MySQL サーバーが起動していないか、起動に失敗している可能性があります。
- 接続先の誤り: Docker コンテナからローカルホスト(
127.0.0.1
またはlocalhost
)に接続しようとしていますが、コンテナ内から見たローカルホストはホストマシンとは異なるため、接続ができません。 - ネットワーク設定の問題: Docker コンテナとホスト間、または他のコンテナ間のネットワーク設定に問題がある可能性があります。
- ソケットファイルの問題: ソケットファイルのパスが正しくないか、 MySQL サーバーが異なる場所にソケットファイルを配置している可能性があります。
解決方法
1. MySQL サーバーの起動確認
まず、 MySQL サーバーが正しく起動しているかを確認します。コンテナ内で以下のコマンドを実行して、 MySQL サーバーが稼働しているかを確認します。
docker exec -it <mysql_container_name> mysqladmin -uroot -p status
<mysql_container_name>
は、 MySQL コンテナの名前に置き換えてください。もし MySQL サーバーが起動していない場合は、以下のコマンドで再起動を試みます。
docker restart <mysql_container_name>
2. 正しいホストに接続する
Docker コンテナからホストマシンの MySQL サーバーに接続するには、localhost
や127.0.0.1
ではなく、ホストマシンのIPアドレスを使用する必要があります。以下の手順でホストマシンのIPアドレスを確認し、接続先を修正します。
- ホストマシンのIPアドレスを確認します。
ifconfig # Linux/Macの場合
ipconfig # Windowsの場合
- MySQL 接続コマンドにホストマシンのIPアドレスを指定します。
mysql -h <host_ip> -u root -p
3. Docker ネットワークの確認と修正
Docker コンテナ間で MySQL に接続する場合、同じネットワークに接続されていることを確認する必要があります。 Docker Compose を使用している場合は、docker-compose.yml
ファイルでネットワーク設定を確認します。
例: docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: user
MYSQL_PASSWORD: password
networks:
- mynetwork
app:
image: myapp
depends_on:
- db
environment:
DB_HOST: db
DB_USER: user
DB_PASSWORD: password
networks:
- mynetwork
networks:
mynetwork:
この設定により、app
サービスからdb
サービスに接続できるようになります。
4. ソケットファイルのパスを確認
MySQL が使用しているソケットファイルのパスが正しいか確認します。デフォルトでは、/var/run/mysqld/mysqld.sock
が一般的ですが、設定によって異なる場合があります。
MySQL 設定ファイルの確認
MySQL の設定ファイルmy.cnf
を確認し、socket
オプションの設定を確認します。
cat /etc/mysql/my.cnf | grep socket
出力例:
socket = /var/run/mysqld/mysqld.sock
もし異なるパスが設定されている場合は、そのパスを使用して接続を試みます。
5. 確認用の docker-compose.yml例
以下は、 Django アプリケーションと MySQL コンテナを設定するためのサンプルのdocker-compose.yml
です。この設定ファイルを使用すると、 Docker コンテナ間で MySQL に正しく接続できるようになります。
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: user
MYSQL_PASSWORD: password
networks:
- mynetwork
ports:
- "3306:3306"
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
environment:
DB_HOST: db
DB_NAME: mydatabase
DB_USER: user
DB_PASSWORD: password
networks:
- mynetwork
networks:
mynetwork:
この設定により、 Django アプリケーションが MySQL データベースに接続できます。
まとめ
Docker から MySQL に接続できない場合、以下のポイントを確認することが重要です。
- MySQL サーバーが起動しているか: サーバーが正常に動作しているか確認。
- 正しいホストに接続しているか:
localhost
ではなくホストマシンのIPアドレスを使用。 - Docker ネットワークの設定が正しいか: コンテナ間のネットワーク接続を確認。
- ソケットファイルのパスが正しいか: MySQLのソケットファイルのパスを確認。
これらのステップを踏むことで、ERROR 2002 (HY000)
の問題を解決し、 Docker 環境から MySQL に正常に接続できるようになります。
コメント