0
0

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.

Python(Django) x Docker x AWSAdvent Calendar 2023

Day 4

【Docker x MySQL】エラー「Can't connect to local MySQL server...」の原因と解決方法

Posted at

概要

Djangoアプリケーションをdocker環境で構築後、コンテナの中に入ってマイグレートやスクリプト実行を行うと以下エラーが発生しました。本記事ではこちらの解決方法を記載します。

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)")

設定ファイルの前提

docker-compose.ymlsettings.pyは以下の通りです。

docker-compose.ymlは以下。

docker-compose.yml
version: '3'
services:
  mysite:
    build:
      context: ../
      dockerfile: ./docker/Dockerfile
    volumes:
      - '../web:/mysite'
    ports:
      - "8080:8000"
    container_name: mysite_django
    tty: true
    working_dir: '/mysite'

  mysql:
    image: mysql:latest
    container_name: mysite_mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      MYSQL_DATABASE: mysite_db
    ports:
      - "3306:3306"
    volumes:
      - mysite-data-volume:/var/lib/mysql

volumes:
    mysite-data-volume:

settings.pyDATABASESは以下。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite_db',
        'USER': 'docker',
        'PASSWORD': 'docker',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command':
                'SET character_set_connection=utf8,collation_connection=utf8_unicode_ci'
        }
    },
}

ちなみに、'127.0.0.1'に変更してみて実行すると、

        'HOST': '127.0.0.1',

同様にCan't connect to...エラーになります。

django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")

原因

原因は、Djangoアプリケーションが探しに行くDBサーバの設定が不適切だったためです。
というより、MySQLサーバーをコンテナで起動させているときのお作法が抜けてしまっていました。

'HOST': 'localhost'(または'127.0.0.1')を使用すると、Djangoアプリケーションは自身のコンテナ内でMySQLサーバーを探そうとしますが、実際にはdocker-compose.yamlで定義している通り、MySQLサーバーは別のコンテナ内(mysql)で動作しています。そのため、接続エラーが発生したのです。

解決方法

mysqlというサービス名をdocker-compose.ymlで定義していますので、このサービス名をDjangoアプリケーションがMySQLサーバーを見つける際のホスト名として指定することで、正しくMySQLに接続できるようになります。具体的には以下の通り。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite_db',
        'USER': 'docker',
        'PASSWORD': 'docker',
        'HOST': 'mysql',  # Dockerコンテナ内でのMySQLサービス名を指定
        'PORT': '3306',
        'OPTIONS': {
            'init_command':
                'SET character_set_connection=utf8,collation_connection=utf8_unicode_ci'
        }
    },
}

これにより、Djangoアプリケーションはmysqlというサービス名で定義されたコンテナ内のMySQLサーバーを正しく参照し、接続できるようになります。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?