【问题标题】:Docker-Compose can't connect to MySQLDocker-Compose 无法连接到 MySQL
【发布时间】:2020-02-12 08:57:34
【问题描述】:

我正在尝试使用 docker 将 Django 项目与 MySQL 连接。

我在升级 docker-compose 时遇到问题。它说下一个错误:

super(Connection, self).init(*args, **kwargs2) django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

我正在使用端口 3307,我应该在本地创建第一个新的数据库架构吗?或者我该怎么做,因为我的默认端口是 3306,但如果我尝试使用它,它说它很忙。

我的代码在这里:

Dockerfile


FROM python:3.7
ENV PYTHONUNBUFFERED 1
ENV LANG=C.UTF-8
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN apt-get update
RUN pip install -r requirements.txt
ADD . /code/


Docker 编写


    version: '2'

services:
  app:
    container_name: container_app
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    command: bash -c "python3 manage.py migrate && python manage.py shell < backend/scripts/setup.py && python3 manage.py runserver 0.0.0.0:8000"
    links:
      - db
    depends_on:
      - db
    ports:
      - "8000:8000"
  db:
    container_name: container_database
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_HOST: 'host.docker.internal'
      MYSQL_DATABASE: 'container_develop'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3307:3307"

settings.py:


DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_develop',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 3307,
        'CHARSET': 'utf8',
        'COLLATION': 'utf8_bin',
        'OPTIONS': {
            'use_unicode' : True,
            'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
        },
    }
}

问题是我在任何地方都没有数据库,所以我在本地使用它,我是否必须将数据库上传到服务器然后使用服务器提供给我的端口? 有没有办法从 docker 本地使用它?还是安装到docker?所以我可以将那个 docker 分享给朋友,他可以使用同一个数据库?

【问题讨论】:

    标签: mysql django python-3.x docker docker-compose


    【解决方案1】:

    在“db”部分,在您的 docker-compose 中:

    ports:
      - "3307:3306"
    

    【讨论】:

    • 感谢您的回答@Nico,我仍然有同样的错误:django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
    • @Adiii 似乎找到了解决方案
    【解决方案2】:

    @Nico 回答我从容器外部修复了您的服务可访问性,这意味着如果尝试从主机访问它应该可以工作。

    但是在服务到服务的通信过程中会出现错误。您不应该在服务中使用发布端口来服务通信,或者换句话说,您必须在服务中使用容器端口来服务通信。

    将连接的端口从3307更改为3306

    DATABASES = {
        'default' : {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'database_develop',
            'USER': 'root',
            'PASSWORD': 'password',
            'HOST': 'db',
            'PORT': 3306,
            'CHARSET': 'utf8',
            'COLLATION': 'utf8_bin',
            'OPTIONS': {
                'use_unicode' : True,
                'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
            },
        }
    }
    

    【讨论】:

    • 谢谢@Adiii 它有效!现在我有这个错误:数据库 | 2019-10-15 16:35:09 13 [警告] 用户 'root'@'172.19.0.1' 的访问被拒绝(使用密码:否)我应该做些什么特别的来解决它?谢谢
    • 什么意思?我在 docker-compose 和设置中有相同的传递
    • 如果问题仍然存在,请尝试添加 command: --default-authentication-plugin=mysql_native_password 。我可以验证连接
    • var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'db', user : 'root', password : 'password', database : 'container_develop' }); 在 nodejs 中对我有用
    • 谢谢伙计!它可以工作,但现在我使用 docker system prune --all 重新启动了 docker,现在我正在尝试使用 docker build 再次构建它。我在 dockerfile 中遇到下一个错误(收到意外的 HTTP 状态:503 服务不可用)。你知道为什么吗?谢谢大佬!