Docker的镜像是只读的,但是容器是可写的,我们可以将数据写入到容器,不过一旦容器删除数据将会丢 失,那么有什么办法能将数据进行持久化存储呢?
——在宿主机上开辟一块地方,存储内容和docker容器的存储内容一样
一、Data Volume
Data Volume本质上是Docker主机文件系统中的目录或文件,能够直接被挂载到容器的文件系统中,容器可以读写Volume中的数据,Volume数据可以被永久的保存,即使容器已经被销毁停止运行。
二、三种挂载方式
【具名挂载】和【匿名挂载】这两种方式不常用,这两种方式Docker会自动在主机的/var/lib/docker/volumes下生成一个目录
如果把容器删除了,需要重新从宿主机拿到容器,直接再次执行挂载命令即可
1、指定路径挂载——宿主机和容器中路径均给出
docker run -p 33306:3306 -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
解释:
容器启动时通过 -v 参数将 docker 主机上的/my/own/datadir目录挂载到容器里/var/lib/mysql目录
宿主机的文件夹(/my/own/datadir) 和 容器中的文件夹(/var/lib/mysql)产生映射
参数:
-
-v:--Volume,数据持久化
这里不用自己新建文件夹/my/own/datadir /var/lib/mysql,没有的话会自动创建的
-
-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
- -e 后面跟的环境变量,每个不同的镜像可能不一样,可以去官网查询
- 这里后面跟的是密码
结果查看:宿主机挂载的文件内容和容器内部的内容一样
1、进入容器内部,bin/bash没有,使用bin/sh
挂载目标路径可以放两(多)个位置——使用两(多)个-v 参数
docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh
2、具名挂载——宿主机路径中 只给出名字,不在前面加/
docker run -p 33306:3306 -v chenyang_mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
挂载结果:
docker/volumes文件夹下产生一个chenyang_mysql文件夹
3、匿名挂载
只给出容器里的路径,不给出宿主机的路径
docker run -p 33306:3306 -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
挂载结果
实际挂载到了宿主机的/var/lib/docker/volumes路径下——位于某个volume中,根据时间可以区分
4、结果查看
-
查看所有匿名volume
docker volume ls
-
查看数据卷信息
docker volume inspect chenyang_mysql