05 容器数据卷

什么是容器数据卷

挂载方式 

 方式一、直接使用命令-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建立的容器数据卷之间的共享,是拷贝的概念,不是共享的概念。

如果共享一块空间的话,删除容器一时,此共享空间就删除了,那么容器二三数据卷内容应该就会消失。 拷贝的话,任何一个容器数据卷新建内容,就会同步拷贝到和她有关系容器的数据卷中。

 实战

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fang·up·ad

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值