上一章我们成功搭建了容器化的 Django 项目,用到的数据库为默认的 Sqlite。Sqlite 虽然简单易用,但是线上部署时通常会选择更高效、更可靠的数据库,比如 MySQL。
本章将在上一章的基础上,修改并构建 Docker + Django + MySQL 的容器项目。
Docker-compose
我们在学习面向对象的编程语言时,会想方设法把功能独立的模块给独立出来,方便复用和维护。
容器也是一样的。虽然理论上可以把所有组件塞到同一个容器中去,但更好的做法是各模块在单独容器中,只要保持必要的通信就可以了。
也就是说,本教程中现在需要两个容器了:
- 名称叫 app 的 Django 容器
- 名称叫 db 的 MySQL 容器
所以如何构建 MySQL 镜像?别担心,这么常用的镜像官方已经帮你构建好了,只需要把它从仓库拉取到本地就可以了。
修改上一章写的 docker-compose.yml
,增加 MySQL 容器:
version: "3"
services:
app:
restart: always
build: .
command: bash -c "python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
db:
image: mysql:5.7
volumes:
- "./mysql:/var/lib/mysql"
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=mypassword
- MYSQL_DATABASE=django_app
app
容器的 command
指令做了修改,让其在运行前先执行数据迁移;新增了配置 depends_on
,意思是此容器需要等待 db
容器启动完毕才能够启动。
分析一下新添加的 db
容器:
image
:从仓库拉取 MySQL 5.7 。最新版本为 MySQL 8,不过很坑的是新版本修改了用户登录的验证方法,导致很容易出现无法通过身份验证的问题。教程为了简单起见选用 5.7 版本。后期会在