从 django app docker 连接到本地 mysql 数据库

Posted

技术标签:

【中文标题】从 django app docker 连接到本地 mysql 数据库【英文标题】:Connect to local mysql database from django app docker 【发布时间】:2020-02-03 20:29:26 【问题描述】:

我正在尝试使用 Docker 对我的 Django 应用程序进行 docker 化,但由于我对 Docker 并没有真正的经验,因此在连接 mysql 数据库时遇到了一些问题。我有几个问题:

    我已经在我的计算机上安装了 mysql 并在本地设置了数据库,我是否也必须使用 mysql 映像并在我的 docker-compose 中创建一个 db 服务? Django 不应该像没有 dockerized 时那样正常连接到 mysql 吗?

    如果数据库托管在服务器上,那么 mysql 是否安装在该服务器上?我必须使用 mysql 映像连接到数据库吗?

这是我的 docker-compose.yml:

version: '3.7'

services:
  web:
    build: ./appchat
    command: python appchat/manage.py runserver
    ports:
      - 8000:8000
      - "3306"
    network_mode: "host"

这里是settings.py中的数据库设置:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'root',
        'NAME': 'company',
        'PORT': '3306',
    

这是我运行 docker-compose 文件时的错误:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

任何帮助将不胜感激。谢谢。

【问题讨论】:

***.com/questions/24319662/… 尝试使用host.docker.internal连接django容器内的mysql 我在 settings.py 中尝试了 'HOST': 'host.docker.internal',仍然出现同样的错误。 【参考方案1】:

应用程序及其数据库可以在同一主机或不同主机上运行,​​也可以在 Docker 中或不在 Docker 中。

如果应用程序及其数据库在不同主机上运行,​​那么在 Docker 中进行设置并没有什么不寻常的地方。使用数据库服务器的 DNS 名称配置您的应用程序。 (我建议通过环境变量传递它,而不是修改 settings.py 文件。)

Docker Compose 语法:

environment:
  MYSQL_HOST: mysql.example.com

如果两者都在同一个 Docker 设置中运行,那么 Docker 会提供一个内部 DNS 设置以供其中一个访问另一个。在 Docker Compose 中,you can use the services: key as a host name;在普通的 Docker 中,you need to manually docker network create 但是这个技巧有效。

简单的 Docker 示例:

docker network create app
docker run --net app --name mysql -v $PWD/mysql:/var/lib/mysql/data mysql
docker run --net app --name app -e MYSQL_HOST=mysql myapp

如果数据库与应用程序运行在同一主机上,但在 Docker 之外,并且主机是运行 Docker 桌面应用程序的 Mac 或 Windows 系统,则there is a special host.docker.internal hostname

docker run -e MYSQL_HOST=host.docker.internal myapp

对于本机 Linux 主机,此快捷方式不存在,您需要找出主机的 IP 地址,但您可以将其视为第一种情况。

【讨论】:

感谢您的解释。起初,当我尝试“host.docker.internal”时,我遇到了关于“caching_sha2_password”的错误,所以我认为它不起作用。但结果'host.docker.internal'是正确的,错误在mysql端,我现在解决了。

以上是关于从 django app docker 连接到本地 mysql 数据库的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Django 应用程序从容器连接到 MySQL docker 容器

无法从本地连接到 mysql docker

如何从 Docker 容器连接到本地 Redis 服务器?

Django 无法在 Docker 设置中连接到 Postgres

从 docker 容器连接到本地 mongodb

从 Table Plus 连接到我的本地 docker 数据库实例