docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)

参考文章:【学习笔记】尚硅谷周阳老师的Docker教程学习笔记。

一 容器数据卷

1. 容器数据卷

(1) 什么是容器数据卷
容器删除后数据自然也就没有了,所以用卷来保存数据。
容器数据卷功能是持久化和数据共享。 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File Syste提供一些用于持续存储或共享数据的特性。

(2) 容器数据卷的特点

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

2. 容器内添加数据卷

(1) 直接命令添加

# 1. 直接命令添加容器数据卷。
命令语法:
docker run -it -v /宿主机绝对路径:/容器内目录[:ro] 镜像名。
若添加:ro,则表示是只读模式,即宿主机可以添加和修改文件,但是容器内不可以。

如果无权限,需要添加--privileged=true选项。
即:
docker run -it -v /宿主机绝对路径:/容器内目录 --privileged=true 镜像名。

# 2. 查看数据卷是否挂载成功,其中Volumes里面有绑定的目录。
docker inspect 容器名

例如以ubuntu为例。

# 1. 获取ubuntu的镜像id
docker images

# 2. 创建容器,并使用-v选项添加容器卷。
docker run -it -v /myhost:/mycontainer ubuntu
ls / 		# 此时看到容器中确实有/mycontainer目录。

# 3. 退出容器
Ctrl+P+Q

# 4. 此时在宿主机同样有新建的/myhost目录,它与/mycontainer类似是共享目录的关系。
ls /

# 5. 查看是否挂载成功。
# 注意,ubuntu与centos返回的json串有点区别。ubuntu看Mount字段,下面看到宿主机与容器的目录是绑定成功的,并且容器对该目录有权限,即RW为true。
docker inspect 694caf735838

docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第1张图片

查看是否挂载成功。
docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第2张图片

如果我们按照上面的步骤,但是在创建容器时,添加了:ro选项,那么我们是在容器中是没有写权限的,但是在宿主机是有的。

docker run -it -v /myhost1:/mycontainer1:ro ubuntu

ls /

# 退出容器
Ctrl+P+Q

ls /

# 查看是否挂载成功。
docker inspect 容器ID或者容器名

docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第3张图片
docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第4张图片

centos操作的话,可以inspect返回的是这种json串格式:

docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第5张图片

此时在容器中想创建文件,因为添加了ro只读权限,也无法成功创建文件,即使想使用chmod也不行。只能在宿主机添加。
docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第6张图片

(2) dockerFile添加
下面以最简单的docker命令写成dockerFile文件的例子进行演示。

# 1. 宿主机的根目录下新建mydocker文件夹并进入。
mkdir /mydocker
cd /mydocker

# 2. dockerFile文件构建。
vim dockerFile

添加如下内容,下面的解释可以不拷贝:
FROM ubuntu
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
# 解释:
# FROM ubuntu:代表我们新建的镜像依赖于这个基础镜像。
# VOLUME:代表要在容器添加的数据卷路径,可以同时添加多个。但是与命令直接创建不一样,dockerFile创建无法指定宿主机的路径,这是因为考虑到不同服务器移植的问题。
# 	例如镜像从虚拟机1拷贝到虚拟机2,那么由于它们的路径不是必然存在相同的路径,例如虚拟机1的宿主机路径是/h1,2的是/h2,那么很明显会出现不匹配,
#	所以dockerFile的VOLUME关键字不支持写宿主机的路径,而是由docker自己分配。
# CMD就是单纯的执行命令。
# 所以上面的dockerFile等价于命令:
# docker run -it -v docker分配的宿主机地址1:/dataVolumeContainer1 -v docker分配的宿主机地址2:/dataVolumeContainer2 ubuntu
# 然后再执行了两条命令。

# 3. buildcdockerFile生成新的镜像。
# -f:指定dockerFile的文件名路径,若没指定,则默认在当前路径寻找名为Dockerfile的文件,找不到就报错。 
# -t:即tag,构建的镜像标记名称,指镜像名。
# 末尾的点:可认为是在当前路径下build,不能缺少,否则会报缺少参数。
docker build -f /mydocker/dockerFile -t tyy/ubuntu .
docker images	# 可以看到多了一个tyy/ubuntu镜像。

# 4. 运行容器,容器内自带两个容器数据卷,对应的宿主机的目录默认,可以通过docker inspect查看。
docker run -it tyy/ubuntu
ls /		# 此时在容器中可以看到/dataVolumeContainer1,"/dataVolumeContainer2
Ctrl+P+Q	# 先退出容器

# 5. docker inspect查看默认的宿主机路径。
docker inspect 容器ID

上图命令执行的docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第7张图片
截图:
docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第8张图片

docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第9张图片

3. 数据卷容器

(1) 什么是数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
docker官网翻译过来就是这个意思,我们只需要简单了解即可,可以和上面的内容一起理解,无须区分。

(2) 容器间传递共享

# 以上面创建的tyy/ubuntu镜像进行演示。
# 1.先启动一个父容器。
docker run -it --name dc01 tyy/ubuntu
cd dataVolumeContainer2		# 在容器dc01的dataVolumeContainer2路径添加一个文件。
touch dc01_add.txt
Ctrl+P+Q		# 先退出dc01容器。

# 2. dc02继承自dc01。
# --volumes-from:代表继承某个容器,类似C++的继承。
docker run -it --name dc02 --volumes-from dc01 tyy/ubuntu
cd dataVolumeContainer2
touch dc02_add.txt
Ctrl+P+Q		# 先退出dc02容器。

# 3. dc03同样继承自dc01
docker run -it --name dc03 --volumes-from dc01 tyy/ubuntu
cd dataVolumeContainer2
touch dc03_add.txt
Ctrl+P+Q
  • 1)回到dc01可以看到02/03各自添加的都能共享了。
    说明这些继承的容器,独立添加自己的内容后,其它容器都能访问到,说明所有容器共享该数据卷即文件夹中的资源。
    因为继承后,它们能共享实际是因为它们数据卷的宿主机路径和容器路径一致,这一点可以自行通过docker inspect去查看。
    docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第10张图片

  • 2)删除dc01,dc02修改后,dc03可否访问,即删除父容器,是否会对其它子容器有影响。答案是没有影响的,dc03照样可以正常访问。
    docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第11张图片

  • 3)在dc03中删除dc03_add.txt,进入dc02容器查看,是否dc02的容器也会删除。答案是会的。
    docker基础篇-----04-----命令添加容器数据卷、dockerfile添加容器数据卷、容器间数据卷共享(--volumes-from)_第12张图片
    实际上宿主机也是会被影响的。
    首先使用docker inspect 容器ID,查看与容器路径/dataVolumeContainer2对应宿主机的路径。此时看到,宿主机中的dc03_add.txt也是被删除了。
    在这里插入图片描述

结论:

  • 容器之间配置信息的传递,数据卷生命周期一直持续到没有容器使用它为止,但因为宿主机还在,所以重启该容器后,该数据卷仍然会有。
    或者说,若多个容器共用一个宿主机的路径(继承后这个宿主机路径肯定是一样的),如果某个容器对该路径进行文件添加、减少等操作,其它容器等同于该操作(宿主机也共享这个目录,所以也会等同于该操作),即不同容器共享该容器数据卷。

你可能感兴趣的:(docker,docker,容器,运维)