一、Docker部署mysql
1.拉取mysql镜像
2.在未设置卷挂载的情况下启动MySQL容器
3.Navicat客户端连接mysql,并创建库,创建表
4.删除mysql容器,再启动,发现新创建的库和表丢失
Docker容器删除会造成容器内数据的丢失,所以我们需要想一个方法让容器内的数据能够持久化,由此出现了docker数据挂载的机制二、Docker卷挂载机制
其基本原理是将宿主机上的文件或者目录与容器内的文件或者目录进行挂载关联,实现实时读写持久化
docker挂载语法有两种,-v和–mount,个人比较喜欢–mount,主要是因为它各个参数清晰
–mount有三个参数:
1.type:挂载类型,分为bind和volume
bind所指定的挂载路径一定要提前创建好,可以自定义路径
volume:卷,是由Docker创建并管理,由docker分配挂载路径
卷相关的命令有:
创建卷:docker volume create 卷名
查看卷:docker volume inspect 卷名
可以看到卷的具体挂载路径
删除卷:docker volume rm 卷名
2.src:指定挂载路径
3.dst:指定容器内被挂载的路径
docker挂载相关可看这个地址,我觉得描述的非常详细
三、重新部署mysql,指定挂载路径
1.创建卷并查看卷的具体路径
2.进入卷路径
此时卷路径下数据为空,因为我们还没启动mysql容器
3.指定卷挂载路径并启动容器
docker run -d --name my_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --mount src=mysql_data,dst=/var/lib/mysql mysql:5.7
src:挂载卷名称
dst:mysql的数据目录
4.客户端连接数据库并创建数据库表,观察容器的数据目录和宿主机的卷目录数据文件是否一致
容器内mysql数据目录文件:
宿主机挂载卷目录的数据文件:
容器的数据文件和挂载目录的数据文件一致,已达到持久化,库和表信息都已经持久化,即使容器删除后,也可以恢复库表数据信息。
四、在验证数据挂载的过程中,发现MySql容器是有默认的目录挂载设置的
mysql容器启动时,如果不指定挂载目录,会自动生成一个默认的卷,用来进行数据挂载,卷的名称是随机的,如上图
在学习了dockerfile后,才知道,mysql默认的卷挂载是在dockerfile中通过VOLUME命令指定了被挂载的目录(容器内的/var/lib/mysql目录被挂载),如下图,这个和上面默认生成的随机volume就对上了,真的有种恍然大悟的感觉