user5006803
user5006803

Reputation:

Error using Django with Docker - "Can't connect to MySQL server on '127.0.0.1' (111)")

I am trying to use Docker with Django but I get error - db_1 | error: database is uninitialized and password option is not specified db_1 | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)"). When I am using my app without Docker it works. Any suggestions?

My Dockerfile:

FROM python:3
 ENV PYTHONUNBUFFERED 1
 RUN mkdir /code
 WORKDIR /code
 ADD requirements.txt /code/
 RUN pip install -r requirements.txt
 ADD . /code/

My docker-compose.yml:

version: '3'

services:
  db:
    image: mysql
  web:
    build: .
    command: python3 Project/myVirtual/backend/pri/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

I have changed docker-compose.yaml to:

version: '3'

services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: ""
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
  web:
    build: .
    command: python3 virtualPRI/PRI/backend/pri/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

but at this moment proces has blocked on

db_1   | 2017-06-13T05:16:16.457122Z 0 [Note] End of list of non-natively partitioned tables

or sometimes I still get web_1 | django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)")

manage:py:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pri.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)

Upvotes: 4

Views: 3975

Answers (1)

stanleyxu2005
stanleyxu2005

Reputation: 8241

127.0.0.1 (111) means MySQL refuses your connect request. I assume MySQL server and Django are not running in the same Docker instance, are they?

If MySQL is running somewhere else, you should make sure you configured the MySQL connection correctly in Django's config file.

Solution 1: You can allow remote access to MySQL (but I don't encourage you do this), by changing the binding address of MySQL from 127.0.0.1 to 0.0.0.0. and update the MySQL DB connection settings properly.

In Linux you can comment out these lines from /etc/my.cnf (The location can be different)

skip-networking
bind-address = 127.0.0.1

For more detailed instruction, see also https://dev.mysql.com/doc/refman/5.5/en/can-not-connect-to-server.html

Solution 2: (Inspired by the comment of @programerq) You can run MySQL in host OS or in another Docker instance. As MySQL is bound to 127.0.0.1 by default, you can map MySQLMachine:MySQLPort to DjangoDocker:MySQLPort when you start your Django Docker instance. So that Django can still connect to 127.0.0.1 to MySQL without noticing that MySQL is actually running somewhere else.

I did some port mapping in a Docker cluster project before, you can check the commands I ran, or check the official Docker document.

Hope these ideas can be helpful, cheers.

Upvotes: 1

Related Questions