从Django应用docker

时间:2019-10-06 05:05:59

标签: mysql django docker docker-compose

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

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

  2. 如果数据库托管在服务器上,那么该服务器上是否安装了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)")

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

1 个答案:

答案 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地址,但是您可以将其视为第一种情况。