【问题标题】:django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
【发布时间】:2020-02-21 03:12:00
【问题描述】:

这已经被问过了,但没有一个答案对我有帮助。这是我的配置。我使用两个服务运行 docker-compose,一个 django 中的 Web 应用程序和一个 mariadb 中的数据库。我可以使用这个精确的配置正常连接到我的本地数据库,只需将 settings.py 中的主机更改为 localhost。当我运行docker-compose up 时,Web 服务在尝试连接数据库后立即停止,并返回此错误。

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

Dockerfile

FROM python:3.7

RUN mkdir /app

COPY requierments.txt /app/

WORKDIR /app

RUN pip install -r requierments.txt

COPY . /app/

docker-compose.yml

version: '3'

services:
  db:
    image: mariadb:10.2
    expose:
      - 3306
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: 'django_backend'
      MYSQL_USER: 'django'
      MYSQL_PORT: '3306'
      MYSQL_PASSWORD: 'mysql1234pass'
      MYSQL_ROOT_PASSWORD: 'password'

  web:
    build: .
    image: backendblockchain_web
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db
    command:
      - /bin/bash
      - -c
      - |
        sleep 10
        python3 manage.py migrate
        python3 manage.py runserver 0.0.0.0:8000

setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_backend',
        'USER': 'django',
        'PASSWORD': 'mysql1234pass',
        'HOST': 'db',
        'PORT': '3306'
    }
}

【问题讨论】:

  • 运行docker ps查看数据库的容器名称并将其用作Django的数据库主机。
  • 用服务名还不够?每次我做 docker-compuse up 时,容器的名称都会改变,除非我指定一个。
  • 它应该保持不变,类似于folder_db_1,但您也可以在 YAML 中设置静态主机名。服务名称不是 DNS 解析的一部分。

标签: python django docker docker-compose mariadb


【解决方案1】:

聚会有点晚了,但如果您连接到端口33060,请更改为端口3306

花了整整一个小时才发现它暴露了两个端口。

【讨论】:

    【解决方案2】:

    您的WEB 容器在数据库启动并运行之前启动,您需要使用其中一个methods 等待它,或者首先使用docker-compose up db 手动启动您的数据库

    【讨论】:

    • 谢谢,这就是问题所在,我想,并在启动 Web 服务时添加了sleep 10,但仍然失败。等待来自 db 服务的ready for connections 进行迁移是解决方案。谢谢
    • 你能帮忙吗,我使用了 docker-compose.yml 文件作为你的文件,但得到了同样的错误。您是如何在 docker-compose.yml 中添加“准备连接”的?请帮忙。谢谢
    【解决方案3】:

    确保您的 db docker 映像运行良好。检查正在运行的 db 容器的日志。我可以在我的 docker-compose 文件中成功使用 MariaDB:

    db:
    image: mariadb
    ports:
      - 3306:3306
    environment:
      MYSQL_USER: "****"
      MYSQL_PASSWORD: "****"
      MYSQL_DATABASE: "*****"
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
    

    【讨论】:

    • 谢谢,我已经做到了,容器启动正常,创建数据库,用户......似乎没有问题那里有问题
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2021-06-25
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2021-03-31
    • 2019-12-29
    相关资源
    最近更新 更多