原文地址:http://www.hxstrive.com/article/641.htm
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