从 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 容器