MySQL 如何使用docker-compose和MySQL容器
在基于Django的Web应用程序中,MySQL是一个非常流行的数据库,但是在构建Web应用程序时,我们需要正确设置数据库。在这篇文章中,我们将使用Docker Compose来为Django应用程序设置带有MySQL数据库的容器。我们会经历一个简单的例子,在其中我们将用Django编写一个具有MySQL作为后端数据库的CRUD应用程序。在这个过程中,我们将看到如何使用docker-compose和MySQL容器。
阅读更多:MySQL 教程
Docker Compose是什么?
Docker Compose是Docker工具箱的一个更高级别的组件之一,它允许你定义和运行多容器的Docker应用程序。它使用单个YAML文件以简单的方式来定义你的Docker容器。一旦你定义了一个文件,就可以使用一个命令来启动整个应用程序。
准备工作
在启动创建我们的应用程序之前,我们需要一些准备工作。首先,需要安装Docker和Docker Compose。使用以下命令安装Docker和Docker Compose:
sudo apt install docker.io
sudo apt install docker-compose
然后,需要创建一个新的项目目录并在其中创建两个文件:Dockerfile和docker-compose.yml。在这里,我们定位到名为“demo”的目录下并创建文件。
mkdir myproject
cd myproject
touch Dockerfile docker-compose.yml
现在,我们已经准备好开始创建我们的Django应用程序与MySQL后端了!
配置MySQL数据库
要创建一个连接到Django应用程序的MySQL容器,我们需要从MySQL官方Docker镜像中拉取一个镜像。在我们的Dockerfile中,我们将使用这个镜像来配置MySQL容器。
FROM mysql:latest
ENV MYSQL_ROOT_PASSWORD=mysecretpassword
我们定义密码,以便在启动容器时自动设置。在这种环境下,要使用的MySQL的根密码为“mysecretpassword”。
现在,在创建我们的应用程序之前,我们需要配置一个连接到MySQL并创建模型的Django应用程序。
创建Django应用程序
按照惯例,在Django的根目录中创建一个新的Django应用程序。如果你不记得如何创建一个Django应用程序,请仔细阅读官方文档。
django-admin startapp demo
这里我们为我们的应用程序选择了“demo”。在这个应用程序中,我们将创建Django的模型,然后将其连接到数据库。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField(max_length=200)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
在这个模型中,我们定义了Author和Article的两个模型。作者有一个姓名和电子邮件字段。文章有一个标题,内容,以及通过键与作者的关联。在这里,我们使用ForeignKey使文章模型与作者模型相关联。
接下来,我们需要在settings.py文件中配置我们的数据库设置。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'demo_db',
'USER': 'root',
'PASSWORD': 'mysecretpassword',
'HOST': 'mysql',
'PORT': '3306',
}
}
在这里,我们定义了连接到MySQL数据库的凭据。我们需要指定数据库引擎、数据库名称、数据库用户和密码、MySQL容器名称以及MySQL容器的端口号。
现在我们已经完成了我们的Django应用程序的配置和MySQL容器配置。在下一步中,我们将使用Docker Compose来启动我们的应用程序。
使用Docker Compose启动应用程序
在docker-compose.yml文件中,我们可以定义整个应用程序和它的依赖关系,以及启动容器的其他设置。以下是我们的docker-compose.yml文件的内容:
version: '3'
services:
mysql:
build:
context: .
dockerfile: Dockerfile
restart: always
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
volumes:
- ./mysql:/var/lib/mysql
web:
build:
context: .
dockerfile: Dockerfile
command: python manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
depends_on:
- mysql
volumes:
- .:/code
在这个文件中,我们定义了两个容器:mysql和web。
mysql容器使用我们刚才创建的Dockerfile文件来创建MySQL容器,并将环境变量和数据卷设置添加到容器中。
web容器使用我们的Dockerfile文件来创建Django容器,并在容器中运行Python manage.py runserver命令来启动Django应用程序,并将它们绑定到主机端口8000上。
容器的依赖关系是由depends_on参数指定的。在这里,web容器依赖mysql容器,并且必须在mysql容器启动之后启动。这个参数不会等待mysql容器完全启动后再启动web容器。有时,这会导致一个已启动但无法访问的容器。
最后,通过MariaDB的映射卷可以将我们的数据保存在宿主机上。如果容器被删除,数据仍可以被保留,以便下次容器被创建时可以访问这些数据。
现在,我们可以使用Docker Compose命令来启动我们的应用程序。
docker-compose up --build
在启动命令中,我们使用–build参数来构建我们定义的所有容器。
现在,我们已经完成了我们的Django应用程序和MySQL容器的配置。在下一节中,我们将看到我们应用程序的输出。
运行示例
运行我们的应用程序时,我们可以使用以下命令将一个author和一篇article添加到我们的应用程序中。
http POST http://localhost:8000/api/author/ name="test" email="test@test.com"
http POST http://localhost:8000/api/article/ title="test" content="test content" author=1
在这里,我们使用了Httpie工具向我们的Django应用程序提交请求。首先我们添加一个作者,然后我们添加一篇文章,这篇文章是与作者相关联的。
现在,你可以查询在我们的数据库中是否有一篇文章。
http GET http://localhost:8000/api/article/1/
在这个命令中,我们使用了Httpie工具来获取ID为1的文章。结果应该是如下所示:
{
"author": "test",
"content": "test content",
"id": 1,
"title": "test"
}
恭喜!我们已经使用Docker Compose使我们的Django应用程序连接到MySQL容器并构建了一个CRUD应用程序。
总结
在这篇文章中,我们通过Docker Compose创建了一个Django应用程序与MySQL容器相连,展示了一个简单的CRUD应用程序。我们了解了如何使用Docker Compose来启动多个容器和使用MySQL数据库。这个简单的示例可以让我们更好地理解这些概念。现在,你可以开始在自己的应用程序中使用这些概念,并且让他们工作。