一、Docker部署mysql

1.拉取mysql镜像

docker修改磁盘挂载位置 docker 磁盘挂载_docker修改磁盘挂载位置


2.在未设置卷挂载的情况下启动MySQL容器

docker修改磁盘挂载位置 docker 磁盘挂载_docker_02


3.Navicat客户端连接mysql,并创建库,创建表

docker修改磁盘挂载位置 docker 磁盘挂载_docker修改磁盘挂载位置_03


4.删除mysql容器,再启动,发现新创建的库和表丢失

docker修改磁盘挂载位置 docker 磁盘挂载_docker修改磁盘挂载位置_04


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.创建卷并查看卷的具体路径

docker修改磁盘挂载位置 docker 磁盘挂载_mysql_05


2.进入卷路径

docker修改磁盘挂载位置 docker 磁盘挂载_docker修改磁盘挂载位置_06


此时卷路径下数据为空,因为我们还没启动mysql容器

3.指定卷挂载路径并启动容器

docker修改磁盘挂载位置 docker 磁盘挂载_mysql_07

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.客户端连接数据库并创建数据库表,观察容器的数据目录和宿主机的卷目录数据文件是否一致

docker修改磁盘挂载位置 docker 磁盘挂载_Docker_08


容器内mysql数据目录文件:

docker修改磁盘挂载位置 docker 磁盘挂载_docker_09


宿主机挂载卷目录的数据文件:

docker修改磁盘挂载位置 docker 磁盘挂载_mysql_10


容器的数据文件和挂载目录的数据文件一致,已达到持久化,库和表信息都已经持久化,即使容器删除后,也可以恢复库表数据信息。

四、在验证数据挂载的过程中,发现MySql容器是有默认的目录挂载设置的

docker修改磁盘挂载位置 docker 磁盘挂载_docker_11


mysql容器启动时,如果不指定挂载目录,会自动生成一个默认的卷,用来进行数据挂载,卷的名称是随机的,如上图

在学习了dockerfile后,才知道,mysql默认的卷挂载是在dockerfile中通过VOLUME命令指定了被挂载的目录(容器内的/var/lib/mysql目录被挂载),如下图,这个和上面默认生成的随机volume就对上了,真的有种恍然大悟的感觉

docker修改磁盘挂载位置 docker 磁盘挂载_Docker_12