Docker的理念:
将应用与应用运行的环境打包形成容器运行,运行环境可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据,在Docker中我们使用数据卷。
容器数据卷主要干下面两件事:
(1) 容器的持久化,这里指持久化容器运行过程产生的业务数据
(2) 容器间继承+共享数据
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System,提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。
容器卷的特点:
1. 数据卷可在容器之间共享或重用数据
2. 卷中的更改可以直接生效
3. 数据卷中的更改不会包含在镜像的更新中
4. 数据卷的生命周期一直持续到没有容器使用它为止
怎样给容器添加数据卷呢?容器内添加数据卷有下面两种方式:
(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