概要
- 以下のエラーが出ました(=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_HOST
をdb
から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)