自学计划:docker的容器数据卷、数据卷容器

可以前往我的指引页面,里面有更多docker的笔记:https://blog.csdn.net/qq_41672878/article/details/110430104

目录

 

是什么?

能干嘛?

特点

实例操作 :  命令行

实例操作 :  DockerFile 添加

数据卷容器:实际就是容器间传递共享

容器之间传递共享(--volumes-from)


是什么?

先来看看docker的理念

  1. 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  2. 容器之间希望有可能共享数据

为什么呢,docker容器产生的数据,如果不通过doker commit生成新的镜像,使得数据做为镜像得一部分保存下来,那么当容器删除后,数据自然也就没有了,为了能够保存数据在docker中我们使用卷

 

能干嘛?

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

 

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

 

特点

  1. 数据卷可在容器之间共享或者重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

实例操作 :  命令行

 

1 添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

 

容器中

在宿主机中执行,宿主机和容器中都会生成对应的文件
[root@VM-0-12-centos /]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@a45330a279b5 /]# ll
bash: ll: command not found
[root@a45330a279b5 /]# ls
bin  dataVolumeContainer  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@a45330a279b5 /]# 

 

宿主机中

[root@VM-0-12-centos /]# ls
bin  boot  data  dev  etc  home  lib  lib64  lost+found  media  mnt  myDataVolume  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

 

2 查看数据卷是否挂载成功

docker inspect 容器ID

 

3 容器和宿主机之间数据共享

 

宿主机中新建一个文件

 

容器中

 

4 容器停止退出后,主机修改后数据是否同步

会有同步的 

 

5 命令(带权限)

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro镜像名

 

 

实例操作 :  DockerFile 添加

1 宿主机的根目录下新建mydocker 文件夹并且进入

 

2 可在dockerFile中使用volume指令给镜像添加一个或者多个数据卷

 

3 file构建

 

[root@VM-0-12-centos myDataVolume]# pwd
/myDataVolume
[root@VM-0-12-centos myDataVolume]# vim Dockerfile

内容

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1", "dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash

4 build后生成镜像

 

参数说明:

f :指定要使用的Dockerfile路径;
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
. 当前目录
[root@VM-0-12-centos myDataVolume]# docker build -f /myDataVolume/Dockerfile -t twj/centos .
Sending build context to Docker daemon  2.56 kB
Step 1/4 : FROM centos
 ---> 0d120b6ccaa8
Step 2/4 : VOLUME /dataVolumeContainer1 dataVolumeContainer2
 ---> Running in 329acb3cbadb
 ---> 85ca3eeadbd9
Removing intermediate container 329acb3cbadb
Step 3/4 : CMD echo "finished,------success1"
 ---> Running in c1df9c6d0b60
 ---> fa44def09d27
Removing intermediate container c1df9c6d0b60
Step 4/4 : CMD /bin/bash
 ---> Running in 3830aa282fc4
 ---> 3712230f01cc
Removing intermediate container 3830aa282fc4
Successfully built 3712230f01cc

5 run 容器

 

ps:容器内的文件地址已经知道了,那么主机的文件地址在哪呢?

docker inspect 容器ID 通过这个命令查看

没指定的话就是默认,如下图

 

遇到的问题:

如果docker挂载主机目录 docker访问出现 cannot open directory permission denied

 

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

docker run -it -v /myDataVolume:/dataVolumeContainer centos --privileged=true

 

数据卷容器:实际就是容器间传递共享

 

 

容器之间传递共享(--volumes-from)

 

步骤

 

1 先启动一个父容器 dc01

 

[root@VM-0-12-centos ~]# docker run -it --name doc01 twj/centos
[root@312fc585776e /]# ls
bin  dataVolumeContainer1  dataVolumeContainer2  dev  etc  home  lib  lib64  lost+found  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	usr  var
[root@312fc585776e /]# cd dataVolumeContainer2/
[root@312fc585776e dataVolumeContainer2]# pwd
/dataVolumeContainer2
[root@312fc585776e dataVolumeContainer2]# touch dc01_add.txt
[root@312fc585776e dataVolumeContainer2]# ls
dc01_add.txt

2 dc02/dc03继承dc01

 

参数: --volumes-from

 

docker run -it --name dc02 --volumes-from dc01 twj/centos
[root@VM-0-12-centos ~]# docker run -it --name dc02 --volumes-from dc01 twj/centos
[root@77bdcc00c66d /]# ls
bin  dataVolumeContainer1  dataVolumeContainer2  dev  etc  home  lib  lib64  lost+found  media	mnt  opt  proc	root  run  sbin  srv  sys  tmp	usr  var
[root@77bdcc00c66d /]# cd dataVolumeContainer2/
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# touch dc02_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# [root@VM-0-12-centos ~]# 
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
77bdcc00c66d        twj/centos          "/bin/sh -c /bin/bash"   About a minute ago   Up About a minute                       dc02
86c67733c59d        twj/centos          "/bin/sh -c /bin/bash"   About a minute ago   Up About a minute                       dc01
[root@VM-0-12-centos ~]# 




[root@VM-0-12-centos ~]# docker run -it --name dc03 --volumes-from dc01 twj/centos
[root@c2241097aa7e /]# cd dataVolumeContainer2/
[root@c2241097aa7e dataVolumeContainer2]# ls
dc01_add.txt  dc02_add.txt
[root@c2241097aa7e dataVolumeContainer2]# touch dc03_add.txt
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c2241097aa7e        twj/centos          "/bin/sh -c /bin/bash"   29 seconds ago      Up 29 seconds                           dc03
77bdcc00c66d        twj/centos          "/bin/sh -c /bin/bash"   2 minutes ago       Up 2 minutes                            dc02
86c67733c59d        twj/centos          "/bin/sh -c /bin/bash"   3 minutes ago       Up 3 minutes                            dc01
[root@VM-0-12-centos ~]# 

这时候,我们进入到dc01,就可以看到,达到了数据共享的目的,有了dc02 和dc03

[root@VM-0-12-centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c2241097aa7e        twj/centos          "/bin/sh -c /bin/bash"   29 seconds ago      Up 29 seconds                           dc03
77bdcc00c66d        twj/centos          "/bin/sh -c /bin/bash"   2 minutes ago       Up 2 minutes                            dc02
86c67733c59d        twj/centos          "/bin/sh -c /bin/bash"   3 minutes ago       Up 3 minutes                            dc01
[root@VM-0-12-centos ~]# docker attach dc01
[root@86c67733c59d dataVolumeContainer2]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt

3 删除dc01,dc02修改后dc03可否访问? 结论: 删除 dc01后,dc02和dc03都不会受影响

 

 

[root@VM-0-12-centos ~]# docker rm -f dc01
dc01
[root@VM-0-12-centos ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c2241097aa7e        twj/centos          "/bin/sh -c /bin/bash"   4 minutes ago       Up 4 minutes                            dc03
77bdcc00c66d        twj/centos          "/bin/sh -c /bin/bash"   6 minutes ago       Up 6 minutes                            dc02
[root@VM-0-12-centos ~]# docker acctch dc02
docker: 'acctch' is not a docker command.
See 'docker --help'
[root@VM-0-12-centos ~]# docker attach dc02
[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt

结论:修改了dc02,dc03也一样会同步

[root@77bdcc00c66d dataVolumeContainer2]# ls
dc01_add.txt  dc02_add.txt  dc03_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# touch dc02_update.txt
[root@77bdcc00c66d dataVolumeContainer2]# ls 
dc01_add.txt  dc02_add.txt  dc02_update.txt  dc03_add.txt
[root@77bdcc00c66d dataVolumeContainer2]# 
[root@77bdcc00c66d dataVolumeContainer2]# [root@VM-0-12-centos ~]# docker attach dc03
[root@c2241097aa7e dataVolumeContainer2]# ls
dc01_add.txt  dc02_add.txt  dc02_update.txt  dc03_add.txt
[root@c2241097aa7e dataVolumeContainer2]# 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值