我正在尝试使用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)")
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
应用程序及其数据库可以在同一主机或不同主机上运行,也可以在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 Desktop应用程序的Mac或Windows系统,则there is a special host.docker.internal
hostname
docker run -e MYSQL_HOST=host.docker.internal myapp
对于本机Linux主机,此快捷方式不存在,您需要找出主机的IP地址,但是您可以将其视为第一种情况。