2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【MySQL】コンテナ名をホスト名として使用して『Unknown MySQL server host 'db' (8)』エラーが出た場合とは...

Posted at

概要

  • 以下のエラーが出ました(=MySQLサーバーへの接続に失敗)。
  • 本記事ではこのエラーの解決方法を記します。
mysql.connector.errors.DatabaseError: 2005 (HY000): Unknown MySQL server host 'db' (8)

エラー内容

  • Dockerでは、デフォルトのネットワーク設定において、コンテナ名をホスト名として使用できる、とのことで、'DB_HOST'の環境変数にはDockerコンテナの名前dbを設定しました。
docker-compose.yaml
version: '3'
services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: xxxx
      MYSQL_ROOT_HOST: '%'
    ports:
      - 3306:3306

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      PMA_USER: xxxx
      PMA_PASSWORD: xxxx
    ports:
      - 8080:80
    depends_on:
      - db
import mysql.connector

# ローカルDBの接続情報
db_host = os.environ['DB_HOST']
db_port = os.environ['DB_PORT']
db_user = os.environ['DB_USER']
db_password = os.environ['MYSQL_ROOT_PASSWORD']
db_name = os.environ['DB_NAME']

db_connection = mysql.connector.connect(
    host=db_host,
    port=db_port,
    user=db_user,
    password=db_password,
    database=db_name
)

db_cursor = db_connection.cursor()
  • ただし、これだと以下のエラー。
mysql.connector.errors.DatabaseError: 2005 (HY000): Unknown MySQL server host 'db' (8)

解決方法

  • 環境変数DB_HOSTdbからlocalhostにしたら解決しました。
  • 今回、自分がローカル用に実行していたPythonのコードは、ホストマシン上のPython実行環境でした。一方、MySQLサーバーはDockerコンテナ内で実行されています。
    • host='db'と指定した場合:Pythonはホストマシン上の名前解決システムを使用して、dbというホスト名を解決しようとする→しかし、ホストマシン上の名前解決システムはDockerコンテナ内のホスト名を知ることができない→エラー
    • host='localhost'と指定した場合:Pythonは自身が実行されているホストマシンを指すホスト名localhostを使用→ホストマシン上のMySQLサーバーに接続→localhostを正しく解決し、接続が成功
  • つまり、Pythonのコードが実行されている環境(ホストマシン)からは、Dockerコンテナ内のホスト名を直接解決することはできないということ、でした。そのため、ホストマシン上のローカルホスト(localhost)を使って接続する必要があったのです。

備忘録

  • 途中、以下のエラーも同じような経緯で発生しました。上記の対応をしたらなくなりました。
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'db:3306' (8 nodename nor servname provided, or not known)
2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?