Docker Moby Logo

[Docker]Docker から MySQL に接続できない ERROR 2002 (HY000)

Docker を使って MySQL コンテナを起動した後、ローカルホストの MySQL サーバーに接続しようとした際に、以下のエラーメッセージに遭遇することがあります。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

このエラーは、 MySQL サーバーに接続しようとしているが、指定されたソケットファイルが見つからない、もしくはアクセスできないことを示しています。この記事では、このエラーの原因と解決方法について詳しく解説します。

原因

このエラーの主な原因として考えられるのは次の通りです。

  1. MySQL サーバーが起動していない: MySQL サーバーが起動していないか、起動に失敗している可能性があります。
  2. 接続先の誤り: Docker コンテナからローカルホスト(127.0.0.1またはlocalhost)に接続しようとしていますが、コンテナ内から見たローカルホストはホストマシンとは異なるため、接続ができません。
  3. ネットワーク設定の問題: Docker コンテナとホスト間、または他のコンテナ間のネットワーク設定に問題がある可能性があります。
  4. ソケットファイルの問題: ソケットファイルのパスが正しくないか、 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 サーバーに接続するには、localhost127.0.0.1ではなく、ホストマシンのIPアドレスを使用する必要があります。以下の手順でホストマシンのIPアドレスを確認し、接続先を修正します。

  1. ホストマシンのIPアドレスを確認します。
ifconfig  # Linux/Macの場合
ipconfig  # Windowsの場合
  1. 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 に正常に接続できるようになります。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です