什么是容器数据卷
挂载方式
方式一、直接使用命令-v参数来挂载
docker run -it -v 主机目录:容器内目录
特点:
宿主机和容器内目录内容进行同步,即使容器关闭,内容依旧同步。
比如配置文件通过数据卷同步,只需要在宿主机修改配置文件,而不需要进入容器内部修改,修改后的配置自动同步到容器内。
测试
[root@localhost ~]# docker run -it -v /home/ceshi:/home/ centos /bin/bash
启动起来后 通过docker inspect 容器id 来查看是否挂载成功
示例:MySQL实战
拉取mysql镜像
docker pull mysql:5.7
docker hub官网查询mysql镜像的设置选项
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
启动mysql容器
-p 端口映射
-d 后台运行
-v 数据卷挂载,可以有多个挂载 挂载容器内mysql配置文件和data数据到宿主机
-e 环境配置 此命令配置mysql的密码
[root@localhost ceshi]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
通过Navicat连接mysql,新建数据库test,可在宿主机的mysql目录下发现数据新增test文件夹。
即使删除mysql容器,宿主机的文件也会存在,从而实现了容器内数据的持久化到宿主机。
具名挂载、匿名挂载
数据卷基础知识
-P 随机分配端口
-v 挂载数据卷
- 如果没有指定docker所在的宿主机文件目录 那么默认映射宿主机目录为 /var/lib/docker/volumes/卷名字/_data 下面;如果指定宿主机路径,那么挂载点就是此目录。
- 命令中-v参数【 -v a : b 】,
- a 以/开头,那么就代表此时是宿主机路径,是路径挂载
- a不是 / 开头,那么就认定是一个名字,是具名挂载
- 没有a,只有b,那么是匿名挂载。
- 具名挂载、匿名挂载都是挂载到宿主机的/var/lib/docker/volumes/卷名字/_data 目录。具名挂载就是将挂载的卷起一个名字,匿名挂载卷名字为一串随机字符串。
两个数据卷常见命令
- docker volume ls 查看docker挂载的所有数据卷
- docker volume inspect 数据卷名字【随机字符串id或具名名字】 查看数据卷挂载的相关信息。“Mountpoint”即在主机上上分配的挂载路径。
[root@fang2 tomcat]# docker volume inspect 3692bed5abc5f3d11549e0d7bb1827faab6db3b5c10842464bc2a0f3b2435d66 [ { "CreatedAt": "2022-03-12T20:27:15+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/3692bed5abc5f3d11549e0d7bb1827faab6db3b5c10842464bc2a0f3b2435d66/_data", "Name": "3692bed5abc5f3d11549e0d7bb1827faab6db3b5c10842464bc2a0f3b2435d66", "Options": null, "Scope": "local" } ]
实操验证
如下所示,所有宿主机的数据卷都有一个名字,具名挂载的就是具体名字,匿名的就是串随机串;宿主机卷的存放位置指定或者local目录( /var/lib/docker/volumes)
方式二、使用Dockerfile来挂载
下面是一个完成数据卷映射的小例子
(1)编写、构建Dockerfile,生成镜像
Dockerfile就是用来构建docker镜像的构建文件,为命令脚本。
通过下面的脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令一层。
所有命令必须大写。文件名字可以任意,建议Dockerfile
#文件内容 :指令 参数 。 指令都是大写。每个命令就是镜像的一层。
FROM centos
VOLUME ["volume01","volume92"]
#匿名挂载 宿主机目录为/var/lib/docker/volumes/随机分配的卷名字/_data
#docker容器目录为volume01 volume02
CMD echo "---------------end-------------"
CMD /bin/bash
如下命令构建镜像
docker build -f ./DockFile -t kuangshen/centos .
(1)-f参数指定dockfile文件路径
(2)-t target 生成镜像名
(3). 保存到当前当前路径下
注意:镜像名前面不能有/开头。上面镜像名为kuagnshen/centos
(2)生成容器
下图为生成镜像启动容器后,可发现容器内生成了卷文件件名。其和外部宿主机肯定相关联。
(3)检查容器 可发现完成数据卷映射
docker inspect fe
查看容器
注:如果Dockerfile没有挂载卷,一般情况下,启动镜像时会命令行挂载: -v 卷名:容器内路径 完成映射。
数据卷容器
volumes-from实现多个容器间数据共享
实例
(1)启动第一个容器。按住ctrl,依次按p,然后按q,不是同时按,退出当前容器。
docker run -it --name docker01 kuagnshen/centos
(2)容器二继承容器一的数据卷
此时容器一和容器二的数据卷内容一样。
容器一volume01数据卷新建内容,容器二此数据卷同步变化。容器二volume02数据卷新建内容,容器一此数据卷同步变化。
docker run -it --name docker02 --volumes-from docker01 kuagnshen/centos
(3)此时启动容器三,继承容器二。
容器一二三 volume01数据卷内容也是同步的。
此时删除掉容器一。容器二、容器三内容并没有消失。
docker run -it --name docker03 --volumes-from docker02 kuagnshen/centos
总结
由上可知,volumes-from建立的容器数据卷之间的共享,是拷贝的概念,不是共享的概念。
如果共享一块空间的话,删除容器一时,此共享空间就删除了,那么容器二三数据卷内容应该就会消失。 拷贝的话,任何一个容器数据卷新建内容,就会同步拷贝到和她有关系容器的数据卷中。
实战