Docker容器之间能够相互连接,利用这一特性,我们可以把数据库与应用本身分离开来,比如Django应用放在一个容器内,而MySQL数据库放在另外一个容器内。本文将介绍如何在Docker容器中部署MySQL数据库,且被Django所在的容器调用。
Step1:拉取MySQL基础镜像
docker pull mysql:5.7
Step2:新建Docker网络
两个容器在同一个Docker网络下,就可以通过网络通信了。使用以下命令创建了一个名为docker-net的网络。
docker network create -d bridge docker-net
Step3:运行MySQL基础镜像,并且连接上新建的网络
docker run --name mysql -d --network docker-net --network-alias mysql -p 3307:3306 -v E:mysql_dataconf:/etc/mysql/conf.d -v E:mysql_datadata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --lower_case_table_names=1
参数解释:
- --network docker-net :连接上docker-net网络
- --network-alias mysql :在网络上给容器起别名为mysql,方便其他容器调用,别名即为该容器的IP地址
- -p 3307:3306 :将容器的3306端口映射到宿主机的3307端口,方便在宿主机上操作数据库,比如备份和还原数据库
- -v E:mysql_datadata:/var/lib/mysql :将容器内的数据文件挂载到宿主机下,用于数据持久化
- -e MYSQL_ROOT_PASSWORD=123456 :设置MySQL的root用户密码为123456
- --lower_case_table_names=1 :识别数据库表名不区分大小写(不同于Windows系统,Linux系统下数据库表名是严格区分大小写的)
这里额外提一点,为什么需要数据持久化?如果不进行数据持久化,Docker容器被删除后,数据就随之消失了。而通过挂载的方式将容器内的数据存储到宿主机,下次运行容器时,该数据依旧可用。
Step4:修改Django的设置文件,运行Django容器并连接上MySQL容器所在的网络
修改Django内的settings.py文件,将连接数据库时的host修改为MySQL容器的网络别名,比如例子中的mysql。带上--network docker-net参数运行Django容器即可。
docker run --name django -d --network docker-net -p 9999:5000 django