一.简介

docker部署应用时,为什么建议把应用程序重要数据存储在容器之外,不存储容器内?因为容器其实是在镜像的最上面添加了一层读写层,容器运行过程中产生的数据保存在读写层的话,如果容器删除了,那么最上面的读写层也就删除了,产生的数据也就ss删除了。如何解决?宿主机上创建一个存储空间,然后容器挂载上使用就可以了,就像软连接一样。

docker应用程序数据本地持久化_本地存储

二.挂载类型

docker官方提供三种不同的方式来实现将宿主机的存储空间挂载到容器中。

volumes

docker安装完成后,宿主机会默认生成/var/lib/docker/volumes存储目录;

bind mounts

自定义存储目录,可以在宿主机上创建任意目录;

tmpfs

存储在宿主机的内存中

docker应用程序数据本地持久化_docker_02

volumes演示示例:

#查看
docker volume ls
#创建
docker volume create mysql-vol
#查看详细信息:创建时间、文件路径等
docker volume inspect mysql-vol
#创建容器过程中挂载,src(或source)宿主机目录,默认路径/var/lib/docker/volumes,dst(或target)容器目录
docker run -itd --name web_mysql  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --mount src=mysql-vol,dst=/var/lib/mysql mysql
#或
docker run -itd --name web_mysql  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --mount source=mysql-vol,target=/var/lib/mysql mysql
#或
docker run -itd --name web_mysql  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql-vol:/var/lib/mysql mysql

bind mounts演示示例:多了一个type=bind,挂载宿主机已存在目录

#创建
mkdir -p /data/mysql/
#创建容器过程中挂载,使用bind mount自定义路径/data/
docker run -itd --name web_mysql  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql mysql

删除数据卷

#删除数据卷,以mysql-vol为例
docker rm mysql-vol
#若被占用,就先停掉容器删除容器
docker stop mysql镜像ID
docker rm  mysql容器ID

注意:

1.如果宿主机无自定义的源文件路径,会报错bind source path does not exist: /data/mysql/,那就创建mkdir -p /data/mysql

2.宿主源和目的容器目录中都有文件的话,目的容器目录中的文件就没了,只保留源宿主目录里面的文件,慎用。