Docker容器数据卷

本章将简单介绍Docker中的数据卷,以及怎样通过命令和Dockerfile文件挂载数据卷,实现Docker容器之间数据共享。

Docker数据卷是什么?

Docker的理念:

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

  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据,在Docker中我们使用数据卷。

Docker数据卷能干嘛?

容器数据卷主要干下面两件事:

(1) 容器的持久化,这里指持久化容器运行过程产生的业务数据

(2) 容器间继承+共享数据

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

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

容器卷的特点:

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

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

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

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

Docker数据卷

怎样给容器添加数据卷呢?容器内添加数据卷有下面两种方式:

(1) 直接命令添加

(2) DockerFile添加

直接命令添加数据卷

直接命令添加是在“docker run -it”命令中添加一个“-v /宿主机数据卷绝对路径:/容器内部目录绝对路径”,完整格式如下:

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

我们也可以在命令后面添加“:ro”(read only),使用:ro修饰的数据卷表示是只读的。语法如下:

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

实例1:在宿主机创建目录“/myDataVolume”,然后挂载到容器内部的“/dataVolumeContainer”目录,分别手动操作这两个目录,然后进入宿主机和容器内部观察目录的变化。

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            latest              1b896063f266        3 days ago          202MB
tomcat              latest              5377fd8533c3        2 weeks ago         506MB
centos              latest              9f38484d220f        3 months ago        202MB
hello-world         latest              fce289e99eb9        6 months ago        1.84kB
[root@localhost ~]# mkdir /myDataVolume
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolume centos
[root@73445976dda7 /]# ll /dataVolume/
total 0

首先使用“docker images”查看当前拥有的镜像;使用“mkdir /myDataVolume”在宿主机创建目录;使用“docker run -it -v /myDataVolume:/dataVolumeContainer centos”启动容器且设置数据卷。到宿主机查看数据卷目录:

[root@localhost ~]# ll /myDataVolume/
total 0

如果我们在宿主主机的/myDataVolume目录下面创建host.txt文件,然后到容器的/dataVolumeContainer目录下面去看是否拥有host.txt文件。如下:

[root@localhost ~]# cd /myDataVolume/
[root@localhost myDataVolume]# echo "host" > host.txt
[root@localhost myDataVolume]# ll
total 4
-rw-r--r--. 1 root root 5 Jun 30 09:35 host.txt
[root@localhost myDataVolume]# cat host.txt
host

上面使用“echo “host1” > host.txt”创建一个host.txt文件。到容器中去查看:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
db5e481eccaf        centos              "/bin/bash"         About a minute ago   Up 59 seconds                           compassionate_lamport
[root@localhost ~]# docker attach db5e481eccaf
[root@db5e481eccaf /]# cd dataVolumeContainer/
[root@db5e481eccaf dataVolumeContainer]# ll
total 4
-rw-r--r--. 1 root root 5 Jun 30 13:35 host.txt
[root@db5e481eccaf dataVolumeContainer]# cat host.txt
host

实例2:如果在容器中修改我们上面创建的host.txt文件且新增一个container.txt文件呢?此时,宿主机的host.txt文件是否会变化,能否看见容器新创建的container.txt文件。如下:

[root@db5e481eccaf dataVolumeContainer]# ll
total 4
-rw-r--r--. 1 root root 5 Jun 30 13:35 host.txt
[root@db5e481eccaf dataVolumeContainer]# echo "update" >> host.txt
[root@db5e481eccaf dataVolumeContainer]# cat host.txt
host
update
[root@db5e481eccaf dataVolumeContainer]# echo "container" > container.txt
[root@db5e481eccaf dataVolumeContainer]# ll
total 8
-rw-r--r--. 1 root root 10 Jun 30 13:43 container.txt
-rw-r--r--. 1 root root 12 Jun 30 13:43 host.txt
[root@db5e481eccaf dataVolumeContainer]# cat container.txt
container

使用“echo “update” >> host.txt”修改host.txt文件;使用“echo “container” > container.txt”创建新的container.txt文件。进入宿主主机查看:

[root@localhost myDataVolume]# ll
total 8
-rw-r--r--. 1 root root 10 Jun 30 09:43 container.txt
-rw-r--r--. 1 root root 12 Jun 30 09:43 host.txt
[root@localhost myDataVolume]# cat host.txt
host
update
[root@localhost myDataVolume]# cat container.txt
container

实例3:使用“:ro”修饰某个数据卷,让该数据卷不允许写入/修改文件(只读的)。如下:

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            latest              1b896063f266        3 days ago          202MB
tomcat              latest              5377fd8533c3        2 weeks ago         506MB
centos              latest              9f38484d220f        3 months ago        202MB
hello-world         latest              fce289e99eb9        6 months ago        1.84kB
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@91ab82f5e44f /]# ll /dataVolumeContainer/
total 8
-rw-r--r--. 1 root root 10 Jun 30 13:43 container.txt
-rw-r--r--. 1 root root 12 Jun 30 13:43 host.txt

我们试图去修改container.txt文件,抛出了“Read-only file system”错误。如下:

[root@91ab82f5e44f dataVolumeContainer]# ll
total 8
-rw-r--r--. 1 root root 10 Jun 30 13:43 container.txt
-rw-r--r--. 1 root root 12 Jun 30 13:43 host.txt
[root@91ab82f5e44f dataVolumeContainer]# echo "update data" > container.txt
bash: container.txt: Read-only file system

我们试图新创建一个container2.txt文件,抛出“Read-only file system”错误。如下:

[root@91ab82f5e44f dataVolumeContainer]# ll
total 8
-rw-r--r--. 1 root root 10 Jun 30 13:43 container.txt
-rw-r--r--. 1 root root 12 Jun 30 13:43 host.txt
[root@91ab82f5e44f dataVolumeContainer]# touch container2.txt
touch: cannot touch 'container2.txt': Read-only file system
学习知识要善于思考,思考,再思。我就是靠这个方法成为科学家的。 —— 爱因斯坦
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号