【问题标题】:Mysql is not connecting DockerMysql 没有连接 Docker
【发布时间】:2020-10-09 11:53:05
【问题描述】:

我正在尝试在实时服务器上连接 mysql docker 容器,但它不工作

我的 docker-compose 文件是

  db:
    image: mysql:5.7
    restart: always
    env_file:
      - ./app/app/.env
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
    - "3302:3306"

我的 env 文件就像

MYSQL_PORT=3306 
MYSQL_DATABASE=mydb
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_ROOT_PASSWORD=root 

我的 Django settings.py 是

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

gitlab CI 上的错误日志是

Creating test database for alias 'default'...
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection
    return Database.connect(**conn_params)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/__init__.py", line 130, in Connect
    return Connection(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

【问题讨论】:

  • 你安装mysqlclient了吗?
  • @ViLuWi 我想是的,因为它在 requirment.txt 文件中为mysqlclient==2.0.1
  • 您的意思是指定端口 3302 吗? Django 也是在容器中运行还是直接在主机上运行?
  • @GregCowell 我已经编辑并添加了完整的 yml 文件。请看一下
  • 您提到了 CI 设置,并且日志消息显示“测试数据库”;您显示的 docker-compose.yml 文件是实际启动应用程序,还是其他?

标签: django docker gitlab


【解决方案1】:

在您的 docker-compose 文件中,您将端口 3306 映射到 3302。

这意味着你的数据库正在监听 3306(在环境文件中配置),但是从容器外部,这个端口被重定向到端口 3302。

您的 Django 应该在端口 3302 上连接到您的数据库,示例“setting.py”如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': mydb,
        'USER': root,
        'PASSWORD': root,
        'HOST': db,
        'PORT': 3302,
    }
}

【讨论】:

  • 请问您能指出我需要更改的地方吗?请举个例子?
  • 我在 docker-compose ports: - "3306:3306" 中执行此操作仍然无法正常工作
  • 我的 docker-compose 文件应该是什么?可以和我发的一样吗?
  • 容器间连接忽略ports:;您始终连接到服务的标准端口(对于 MySQL,端口 3306)。
  • 可以从主机访问MySql服务器吗?所以你的 Django 应用程序在哪里! mysql -u root -p -h db -P 3302 -D mydb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2019-08-04
  • 2020-09-18
  • 2018-10-02
相关资源
最近更新 更多