Docker---容器数据卷

2021-11-15 15:46:10 浏览数 (1)

容器数据卷

  • 简介
    • 是什么
    • 能干嘛
    • 详解
    • 特点
  • 容器内添加数据卷的方式
    • 直接命令添加
      • 命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
        • 通过docker inspect命令,查看是否绑定成功---HostConfig底下的Binds
      • 检测是否实现了宿主机和容器之间的数据共享
      • 容器停止退出后,主机修改后数据是否同步
      • 命令带权限
    • DockerFile方式添加
      • 根目录下新建mydocker文件夹并进入
      • 在DockerFile中使用`VOLUME指令`给进行添加一个或多个数据卷
      • File构建
      • build后生成镜像
      • run 容器
      • 容器内的卷目录地址,如果不填写对应的主机目录地址,在主机中也有有对应的数据卷与之绑定
      • 注意
      • 执行docker ps命令,出现 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"问题
  • 容器数据卷volumes-from
    • 总体介绍
    • 容器间传递共享(volumes-from)
      • 案例演示
      • 结论:容器之间配置信息的传递,数据卷的生命周期一致持续到没有容器使用它为止

简介

是什么

类似redis里面的rdb和aof,用来做数据持久化操作的

能干嘛

容器的持久化

容器间继承加共享数据

详解

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

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

特点

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

容器内添加数据卷的方式

直接命令添加

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

未执行命令前,主机里面没有对应的目录,但是执行完命令后,主机里面创建的对应的目录,新建并运行的容器中也创建了指定的目录

可以看出 -v命令: 如果没有指定的目录的话,会新建一个

docker inspect命令,以json字符串形式查看当前容器内部细节

通过docker inspect命令,查看是否绑定成功—HostConfig底下的Binds

HostConfig 的BInds显示主机的myDataVolume目录与容器中dataVolumeCintainer目录绑定在了一起


检测是否实现了宿主机和容器之间的数据共享

在宿主机的myDataVolume目录下面新建一个文件

去容器里面绑定的目录下查看是否存在指定新建的文件

存在,实现了宿主机和容器之间的数据共享

容器向文件中写入数据

宿主机查看,发现了新增的数据


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

容器启动过程中,同步了一遍主机的数据,优点类似redis的rdb和aof


命令带权限

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

这里ro表示只可以宿主机对容器数据卷进行读写操作,而容器里面对于数据卷的操作只能够是只读的,不可以增删改

以只读的方式启动容器,切换到opt目录下面,创建dhy.txt文件,成功

下面切换到dataVolumeContainer目录下面,尝试创建文件

提示只读,说明只读的权限只针对于和宿主机绑定的共享目录

宿主机在对应的myDataVolume目录下创建文件成功

容器查看,可以得到对应的文件


DockerFile方式添加

根目录下新建mydocker文件夹并进入

在DockerFile中使用VOLUME指令给进行添加一个或多个数据卷

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"];

说明:

出于可移植性和分享的考虑,用-v主机目录这种方法不能够直接在Dockerfile中实现

由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录


File构建

编写可执行的dockerfile脚本

代码语言:javascript复制
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished, ----------------success1"
CMD /bin/bash

新建一个Dockerfile文件,并将上面的脚本放入其中

build后生成镜像

docker build -f /mydocker/Dockerfile -t zzyy/centos .(最后结尾有一个点)

获得一个新镜像zzyy/centos

run 容器

docker run -it zzyy/centos

容器里面已经新建了两个数据卷


容器内的卷目录地址,如果不填写对应的主机目录地址,在主机中也有有对应的数据卷与之绑定


注意

Docker挂载主机目录Docker访问出现cannot open directory…Permission denied

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


执行docker ps命令,出现 "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"问题

代码语言:javascript复制
“Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?”

此时已确定Docker本身已经安装正常。

问题原因是因为docker服务没有启动,所以在相应的/var/run/ 路径下找不到docker的进程。

执行 service docker start 命令,启动docker服务,返回

docker start/running, process 2662

此时进程启动成功,再执行docker ps,问题解决



容器数据卷volumes-from

总体介绍

上面新建的镜像 zzyy/centos为模板并运行容器dc01/dc02/dco3

他们已经具有容器卷: /dataVolumeContainer1 /dataVolumeContainer2


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

案例演示

先启动一个父容器dco1,在dataVolumeContainer2新增内容

dco2和dco3继承dco1

命令: --volumes-from

dco2继承至dco1

docker run -it --name dco2 --volumes-from dco1 zzyy/centos

此时看到dco2下面的数据卷中存在dco1_add.txt

并且dco2在当前共享数据卷下面新建一个dco2_add.ttx

dco3继承至dco1,并在共享数据卷下面新建dco3_add.txt

此时回到dco1,可以看到三个不同容器创建的文件,即完成了容器间的数据共享

如果此时删除dco1,数据卷的共享是否会受到影响?

此时进入dco2,发现当前共享数据卷没有受到任何影响,然后我们再新建一个update_dco2.txt,看看是否dco3也可以看到新建的文件,即检验数据卷是否还可以共享

数据卷依然可以共享

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


0 人点赞