これまでDockerのMySQLイメージを使ったことがなかったのでプロジェクトが始まる前に個人的に環境を一から作成する練習をしていました。Pythonフレームワークのdjangoから接続を試みていたのですが、3日くらいずっと悩まされ続けたのがこれです。。
django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'mysql' (11001)")
3日ほど調べた末に解決したので、その時に見つけた解決方法をまとめました。
環境
- Windows 10
- Docker for Windows
今回のディレクトリ構成
proj/
├ .docker/
│ ├ nginx/
│ │ └ default.conf
│ └ python/
│ ├ Dockerfile
│ └ requirements.txt
├ django_proj (以下略)
├ docker-compose.yml
└ manage.py
解決方法
docker-compose.ymlのmysqlの設定に注意!(それだけ!でした。笑)
version: "3.9"
services:
python:
build: ./.docker/python
command: gunicorn django_proj.wsgi:application --bind 0.0.0.0:8000 --reload
volumes:
- .:/code
expose:
- "8000"
nginx:
image: nginx:1.19
volumes:
- ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./static:/etc/nginx/static
ports:
- "80:80"
depends_on:
- python
mysql:
image: mysql:5.6
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./.docker/db/data:/var/lib/mysql
expose:
- "3306"
environment:
- MYSQL_ROOT_USER=root
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ROOT_HOST=% # この1行が今回のポイントでした
MySQL公式ページに以下の記載がありました。
MYSQL_ROOT_HOST: By default, MySQL creates the 'root'@'localhost' account. This account can only be connected to from inside the container as described in Connecting to MySQL Server from within the Container. To allow root connections from other hosts, set this environment variable. For example, the value 172.17.0.1, which is the default Docker gateway IP, allows connections from the host machine that runs the container. The option accepts only one entry, but wildcards are allowed (for example, MYSQL_ROOT_HOST=172...* or MYSQL_ROOT_HOST=%).
デフォルトではroot@localhostでアカウントを作ってしまうので、rootユーザーとしてログインできるのはlocalhost、すなわち今回の場合はmysqlコンテナ内からのみとなってしまうようです。
なので、MYSQL_ROOT_HOST=%
の記述を追加しておけば、どのIPアドレスからもrootユーザーとしてログインできるようになるので、違うコンテナからのログインも受け付けられるということなんだと思います。