目录

容器数据卷是什么

容器数据卷能干什么

容器数据卷案例

宿主机与容器之间添加映射数据卷

查看数据卷是否挂载成功

宿主机与容器之间的数据共享

正常运行时同步

容器被stop时同步

映射添加读写规则

读写(默认)

只读

卷的继承和共享

正常运行时的继承和共享

当父级容器stop时的继承和共享


Docker基础命令篇:Docker基础命令_不会调制解调的猫的博客-CSDN博客

容器数据卷是什么

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

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

说白了就是将docker容器内的数据保存进宿主机内,类似于“共享文件夹”。双方都可以对其进行访问和操作。


容器数据卷能干什么

将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的。Docker容器产生的数据如果不备份,那么当容器实例删除后,容器内的数据自然将会消失。为了能保存数据在docker,所以中我们使用卷。

特点:

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

2:卷中的更改可以直接实时生效

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

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


容器数据卷案例

宿主机与容器之间添加映射数据卷

代码如下:

docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash

本人的镜像如下: 

容器卷路径_容器卷路径

 举例:

docker run -it --privileged=true -v /tmp/host:/tmp/docker ubuntu

容器卷路径_服务器_02

这里我的宿主机/tmp目录下是没有host目录的,同样在容器Ubuntu内的/tmp下也是没有docker目录的,在运行此语句后会进行自动创建。

容器卷路径_服务器_03

容器卷路径_服务器_04


查看数据卷是否挂载成功

代码如下:

docker inspect 容器ID

例:

docker inspect 608edcc72f49

容器卷路径_linux_05

此时我们往下寻找,找到 Mounts,如下:

容器卷路径_docker_06

这里显示出了挂载的目录,即挂载成功。 


宿主机与容器之间的数据共享

正常运行时同步

我们在刚刚创建的容器/tmp/docker目录下创建内容,并观测在宿主机能否进行查看和操作。

创建一个文件: 

touch 1.txt

往里面随便写点什么:

echo 'this is docker' > 1.txt

cat查看一下:

cat 1.txt

容器卷路径_linux_07

宿主机进行查看:

ls
cat 1.txt

容器卷路径_容器卷路径_08

很明显文件和内容都被数据卷同步到了宿主机,此时我们再在宿主机中进行操作,查看docker中的文件有没有被更新。

在宿主机中echo内容:

echo 'this is host' >> 1.txt
cat 1.txt

容器卷路径_服务器_09

前往docker容器中的Ubuntu进行查看:

cat 1.txt

容器卷路径_docker_10

 操作成功。


容器被stop时同步

我们将docker容器stop,在主机修改,然后重启docker容器看数据是否同步成功。

在宿主机中执行stop:

docker stop 608edcc72f49

宿主机: 

容器卷路径_docker_11

容器被停止后退出的效果:

容器卷路径_容器_12

接着我们在宿主机中进行操作:

创建文件:

touch 2.txt

随便写点什么进去:

echo '这里还是host哦!' > 2.txt

容器卷路径_容器_13

 再次启动容器,查看数据是否被同步:

docker start 608edcc72f49

容器卷路径_容器卷路径_14

进入容器:

docker exec -it 608edcc72f49 /bin/bash

 进行查看:

cd /tpm/docker
cat 2.txt

容器卷路径_服务器_15


映射添加读写规则

读写(默认)

默认案例同上,docker容器数据卷默认为rw,操作效果同上。


只读

将容器内部的实例进行限制,只能读,不能写。

/容器目录:ro 镜像名

举例:

docker run -it --privileged=true -v /tmp/host:/tmp/docker:ro ubuntu

容器卷路径_服务器_16

 我们前往容器内的/tmp/docker目录内创建文件,系统会提示这里对于容器为只读,无法进行写操作:

cd /tmp/docker
touch 1.txt

容器卷路径_服务器_17

宿主机进行文件的创建操作:

touch 1.txt
echo 'adaedEWDAW' > 1.txt

容器卷路径_linux_18

容器内进行查看:

可以正常进行查看操作,但依旧没有写权限。 

容器卷路径_docker_19


卷的继承和共享

正常运行时的继承和共享

再来一次,这里因为需要用到两个容器,为方便区分,添加了名称:u1和u2

docker run -it --privileged=true -v /tmp/host:/tmp/docker --name u1 ubuntu

创建一个文件,随便写点什么进去。 

cd /tmp/docker
touch u1.txt
echo 'this is u1' > u1.txt

容器卷路径_容器_20

在宿主机中查看一下,并也随便创建点什么:

touch host.txt
echo 'this is host' > host.txt

容器卷路径_docker_21

 此时的容器u1已经和宿主机成功挂载了数据卷,完成了映射关系。

此时我们再创建一个名叫u2的Ubuntu容器

--volumes-from父类

这玩意儿其实有点类似于java中的extends,实际操作如下:

docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu

容器卷路径_linux_22

 进入/tmp查看是否存在docker目录,并查看其内容:

cd /tmp/docker
ls

容器卷路径_docker_23

u2中也随便加点什么进去:

touch u2.txt
echo 'this is u2' > u2.txt

容器卷路径_容器卷路径_24

u1:

容器卷路径_容器卷路径_25

宿主机:

容器卷路径_linux_26


当父级容器stop时的继承和共享

把u1给stop掉:

docker stop ecbbbe512dbd

容器卷路径_linux_27

再前往宿主机搞点事情

touch host2.txt
ls

容器卷路径_linux_28

文件创建完成后,我们再去u2查看结果(当父容器宕掉后能否继承和共享):

ls

容器卷路径_容器卷路径_29

很明显,u2不会因为他爹没了而放弃家业。因为他继承的只是挂载的目录,就算u1宕掉了,也不会影响他的继承和共享。

此时我们再恢复一下u1容器(在爹死后儿子跟别人又干了一票,当他爹复活后看看还能不能发现)

查看最近运行的两个容器:

docker ps -n 2

再运行:

docker start u1
docker exec -it u1 /bin/bash

容器卷路径_docker_30

 进入目录进行查看:

cd /tmp/docker
ls

容器卷路径_docker_31

 很明显他爹一直在天上看着。