Django与Docker错误 – “无法连接到'127.0.0.1'(111)上的MySQL服务器”)

我想用Django使用Docker,但是我得到错误 – 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)") 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)") 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)") 。 当我使用我的应用程序没有Docker它的作品。 有什么build议么?

我的Dockerfile:

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

我的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 

我已经将docker-compose.yaml更改为:

 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 

但此时这个过程已经被阻塞了

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

或者有时我仍然得到web_1 | django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)") 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) 

127.0.0.1 (111)表示MySQL拒绝您的连接请求。 我假设MySQL服务器和Django不在相同的Docker实例中运行,是吗?

如果MySQL正在其他地方运行,则应该确保在Django的configuration文件中正确configuration了MySQL连接。

解决scheme1:您可以允许远程访问MySQL(但我不鼓励您这样做),将MySQL的绑定地址从127.0.0.1更改为0.0.0.0 。 并正确更新MySQL数据库连接设置。

在Linux中,您可以从/etc/my.cnf注释掉这些行(位置可以不同)

 skip-networking bind-address = 127.0.0.1 

有关更详细的说明,另请参阅https://dev.mysql.com/doc/refman/5.5/en/can-not-connect-to-server.html

解决scheme2 🙁 灵感来自@programerq的评论)您可以在主机操作系统或其他Docker实例中运行MySQL。 由于MySQL默认绑定到127.0.0.1 ,因此您可以在启动Django Docker实例时将DjangoDocker:MySQLPort映射到DjangoDocker:MySQLPort 。 所以Django仍然可以连接到127.0.0.1到MySQL,而不会注意到MySQL实际上正在其他地方运行。

我之前在Docker集群项目中做了一些端口映射,可以检查我运行的命令 ,或者检查官方的Docker文档。

希望这些想法能够有所帮助,欢呼。