LoginSignup
5
4

More than 1 year has passed since last update.

Dockerで作成したMySQLに接続できなかった時の解決方法

Last updated at Posted at 2021-01-17

これまで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の設定に注意!(それだけ!でした。笑)

docker-compose.yml
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ユーザーとしてログインできるようになるので、違うコンテナからのログインも受け付けられるということなんだと思います。

参考

5
4
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
5
4