Docker 容器数据卷篇(三)

Docker 容器数据卷

什么是容器数据卷

docker的理念回顾:

将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!

就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!

所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!

为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

  • 作用

    卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:

    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

  • 特点

    1、数据卷可在容器之间共享或重用数据

    2、卷中的更改可以直接生效

    3、数据卷中的更改不会包含在镜像的更新中

    4、数据卷的生命周期一直持续到没有容器使用它为止

所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据卷

  • 方式一:容器中直接使用命令来添加 -v

    挂在

    # 命令
    docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
    
    # 测试
    [root@rlj home]# docker run -it -v /home/test:/home centos /bin/bash
    

    查看数据卷是否挂载成功 docker inspect 容器id

    测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P1SWKeWA-1641997610927)(image/image-20210815190042491.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PDKLynHw-1641997610928)(image/image-20210815190129174.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePeFGtKq-1641997610928)(image/image-20210815190145965.png)]

    测试容器停止退出后,主机修改数据是否会同步!

    1. 停止容器

    2. 在宿主机上修改文件,增加些内容

    3. 启动刚才停止的容器

    4. 然后查看对应的文件,发现数据依旧同步!ok

  • 使用docker 安装mysql

    思考:mysql 数据持久化的问题

    # 
    [root@rlj home]# docker pull mysql:5.7
    # 启动容器 -e 环境变量
    # -v 卷挂载
    [root@rlj home]# 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:5.7
    
    # 使用navicat测试 能否链接 3310
    
    # 查看本地 /home/mysql 目录
    
    # 删除mysql容器
    [root@rlj mysql]# docker rm -f mysql01 # 删除容器,然后发现远程连接失败!
    mysql01
    # 数据库还在
    
  • 通过Docker File 来添加 了解

    DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。

    测试

    # 1、我们在宿主机 /home 目录下新建一个 docker-test-volume文件夹
    [root@rlj home]# mkdir docker-test-volume
    [root@rlj home]# ls
    docker-test-volume  f1  mysql  test  www
    
    # 说明:在编写DockerFile文件中使用 VOLUME 指令来给镜像添加一个或多个数据卷
    VOLUME["/dataVolumeContainer1","/dataVolumeContainer2","/dataVolumeContainer 3"]
    # 出于可移植和分享的考虑,我们之前使用的 -v 主机目录:容器目录 这种方式不能够直接在 DockerFile中实现。
    # 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有宿主机上都存在这样的特定目录.
    
    # 2、编写DockerFile文件
    [root@rlj docker-test-volume]# vim dockerfile
    [root@rlj docker-test-volume]# cat dockerfile 
    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "------end-----"
    CMD /bin/bash
    
    # 3、build后生成镜像,获得一个新镜像 mbry/centos
    [root@rlj docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile -t mbry/centos .  # 注意最后有个.
    
    # 4、启动容器
    [root@rlj docker-test-volume]# docker run -it  mbry/centos  /bin/bash
    [root@ece1f51bb655 /]# ls -l
    total 56
    lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
    drwxr-xr-x   2 root root 4096 Aug 15 11:24 dataVolumeContainer1 # 数据卷目录
    drwxr-xr-x   2 root root 4096 Aug 15 11:24 dataVolumeContainer2 # 数据卷目录
    drwxr-xr-x   5 root root  360 Aug 15 11:24 dev
    
    # 问题:通过上述步骤,容器内的卷目录地址就已经知道了,但是对应的主机目录地址在哪里呢?
    # 5、我们在数据卷中新建一个文件
    [root@ece1f51bb655 /]# cd dataVolumeContainer1
    [root@ece1f51bb655 dataVolumeContainer1]# touch container.txt
    [root@ece1f51bb655 dataVolumeContainer1]# exit
    exit
    
    # 6、查看下这个容器的信息
    [root@rlj docker-test-volume]# docker inspect mbry/centos
    
    # 查看输出的Volumes
    "Volumes": {
        "/dataVolumeContainer1": {},
        "/dataVolumeContainer2": {}
    },
    
    # 7、这个卷在主机对应的默认位置
    [root@rlj _data]# pwd
    /var/lib/docker/volumes/ed99be46cc0e1223b220fa4efd8e8123d1e2939c150415d80827fb6db3d0f787/_data
    [root@rlj _data]# ls
    container.txt
    
    

    注意:如果访问出现了 cannot open directory: Permission denied

    解决办法:在挂载目录后多加一个 --privileged=true参数即可

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwmlf87t-1641997610928)(image/image-20210815192251687.png)]

匿名和具名挂载

# 匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls

# 具名挂载
-v 卷名:/容器内路径
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx

# 查看挂载的路径
[root@rlj home]# docker volume inspect nginxconfig
[
    {
        "CreatedAt": "2021-08-15T19:32:46+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
        "Name": "nginxconfig",
        "Options": null,
        "Scope": "local"
    }
]

# 如何确实是剧名挂载还是匿名挂载,还是指定路径挂载
不是/开始就是卷名,是/开始就是目录名
-v 容器路径 # 匿名挂载
-v 卷名:容器路径 # 具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载


# 改变文件的读写权限
# ro: readonly
# 指定容器对我们挂载
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

我们使用上一步的镜像:mbry/centos 为模板,运行容器 docker01,docker02,docker03,他们都会具有容器卷

"/dataVolumeContainer1" 
"/dataVolumeContainer2"

我们来测试下,容器间传递共享

1、先启动一个父容器docker01,然后在dataVolumeContainer2新增文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myz6ZWEY-1641997610929)(image/image-20210815193942451.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50IZJ7SK-1641997610930)(image/image-20210815194119344.png)]

2、创建docker02,docker03 让他们继承docker01 --volumes-from

[root@rlj test]# docker run -it --name docker02 --volumes-from docker01 mbry/centos
[root@3a216af3855d /]# cd /dataVolumeContainer2
[root@3a216af3855d dataVolumeContainer2]# ls
docker01.txt  
[root@3a216af3855d dataVolumeContainer2]# touch docker02.txt
[root@3a216af3855d dataVolumeContainer2]# ls
docker01.txt  docker02.txt  
[root@3a216af3855d dataVolumeContainer2]# 

[root@rlj test]# docker run -it --name docker03 --volumes-from docker01 mbry/centos
[root@3a216af3855d /]# cd /dataVolumeContainer2
[root@3a216af3855d dataVolumeContainer2]# ls
docker01.txt  docker02.txt
[root@3a216af3855d dataVolumeContainer2]# touch docker03.txt
[root@3a216af3855d dataVolumeContainer2]# ls
docker01.txt  docker02.txt  docker03.txt
[root@3a216af3855d dataVolumeContainer2]# 

3、回到docker01发现可以看到 02 和 03 添加的共享文件

[root@rlj test]# docker attach docker01
[root@d4971287f681 dataVolumeContainer2]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 11:39 docker01.txt
-rw-r--r-- 1 root root 0 Aug 15 11:41 docker02.txt
-rw-r--r-- 1 root root 0 Aug 15 11:42 docker03.txt
[root@d4971287f681 dataVolumeContainer2]# 

4、删除docker01,docker02 修改后docker03还能不能访问

[root@rlj test]# docker rm -f docker01
docker01
[root@rlj test]# docker attach docker03
[root@3a216af3855d dataVolumeContainer2]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 11:39 docker01.txt
-rw-r--r-- 1 root root 0 Aug 15 11:41 docker02.txt
-rw-r--r-- 1 root root 0 Aug 15 11:42 docker03.txt

5、删除docker02 ,docker03还能不能访问

也能

6、新建docker04继承docker03,然后再删除docker03,看下是否可以访问!

也能

[root@rlj test]# docker run -it --name docker04 --volumes-from docker03 mbry/centos

[root@cdbc297ef49a /]# 
[root@cdbc297ef49a /]# cd dataVolumeContainer2 
[root@cdbc297ef49a dataVolumeContainer2]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 11:39 docker01.txt
-rw-r--r-- 1 root root 0 Aug 15 11:41 docker02.txt
-rw-r--r-- 1 root root 0 Aug 15 11:42 docker03.txt

[root@cdbc297ef49a dataVolumeContainer2]# read escape sequence
[root@rlj test]# docker rm -f docker03
docker03
[root@rlj test]# docker attach docker04
[root@cdbc297ef49a dataVolumeContainer2]# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 11:39 docker01.txt
-rw-r--r-- 1 root root 0 Aug 15 11:41 docker02.txt
-rw-r--r-- 1 root root 0 Aug 15 11:42 docker03.txt
[root@cdbc297ef49a dataVolumeContainer2]# [root@

得出结论:

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

存储在本机的文件则会一直保留!

问题: 效果类似与 vue的双向绑定, 那么这是怎么实现的呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值