django.db.utils.OperationalError:(2002年,“无法连接到'db'上的MySQL服务器(115)”))

时间:2019-10-24 18:21:03

标签: python django docker docker-compose mariadb

已经有人问过这个问题,但是没有一个答案对我有帮助。这是我的配置。我运行带有两个服务的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'
    }
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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