将 Django 与 Docker 一起使用时出错 - “无法连接到 '127.0.0.1' (111) 上的 MySQL 服务器”)

Posted

技术标签:

【中文标题】将 Django 与 Docker 一起使用时出错 - “无法连接到 \'127.0.0.1\' (111) 上的 MySQL 服务器”)【英文标题】:Error using Django with Docker - "Can't connect to MySQL server on '127.0.0.1' (111)")将 Django 与 Docker 一起使用时出错 - “无法连接到 '127.0.0.1' (111) 上的 MySQL 服务器”) 【发布时间】:2017-11-14 16:51:36 【问题描述】:

我正在尝试将 Docker 与 Django 一起使用,但出现错误 - 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 的情况下使用我的应用程序时,它可以工作。有什么建议吗?

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

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)

【问题讨论】:

提供docker命令/docker compose文件 @AzatIbrakov 我已经更新了我的帖子。 尝试强制删除容器/图像并重试 您的意思是删除 Dockerfile、docker-compose.yml 并再生成一次?我试过docker rm $(docker ps -aq --filter name=mysql) but still the same 我试过你的docker-compose.yml 没有web 服务,工作正常 【参考方案1】:

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

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

解决方案 1: 您可以允许远程访问 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

解决方案 2: (受@programerq 评论的启发) 您可以在主机操作系统或另一个 Docker 实例中运行 MySQL。由于 MySQL 默认绑定到 127.0.0.1,因此您可以在启动 Django Docker 实例时将 MySQLMachine:MySQLPort 映射到 DjangoDocker:MySQLPort。这样 Django 仍然可以将127.0.0.1 连接到 MySQL,而不会注意到 MySQL 实际上正在其他地方运行。

我之前在一个Docker集群项目中做过一些端口映射,可以check the commands I ran,或者查看Docker官方文档。

希望这些想法能有所帮助,干杯。

【讨论】:

我正在使用mac os,我找到了my.cnf,但没有关于bind-address = 127.0.0.1 的信息,只评论了#skip-networking。 因为 mysql 服务器在一个容器中运行,而产生 Can't connect to MySQL server on '127.0.0.1' (111) 错误消息的代码在另一个容器中,这是预期的错误消息。每个容器都有自己的 127.0.0.1,因为它有自己的网络命名空间。 mysql docker镜像配置为监听所有容器接口,其他容器中的代码可以通过网络服务发现联系到它。 my.cnf 文件无需更改。 @programmerq 好吧,您可以通过 Docker 网络接口公开特定的本地端口。这是个好主意。 @stanleyxu2005 我们如何为 docker-compose 文件配置相同的内容。 MySQL 和 Ubuntu docker 实例分别运行时面临同样的错误。

以上是关于将 Django 与 Docker 一起使用时出错 - “无法连接到 '127.0.0.1' (111) 上的 MySQL 服务器”)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将 __getattr__ 与 Django 模型一起使用?

将 Cookiecutter-Django 应用程序部署到 Heroku 时出错

创建测试数据库时出错 - django、docker、mysql

一起使用 django-storages 和 django-compressor 时尝试压缩静态文件时出错

uwsgi托管Django的坑

将码头与 Repast simphony 一起使用时出错