先来看看Docker的理念:
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
有点类似redis的RDB和AOF文件。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器, 但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
主要命令:
生成数据卷之前,先分别查看宿主机和容器根目录下的文件
容器终端
[root@localhost ~]# docker run -it centos /bin/bash
[root@7a3b16c431e0 /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@7a3b16c431e0 /]# exit
exit
宿主机终端1
[root@localhost ~]# cd ../
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
容器终端
执行命令
docker run -it -v /宿主机目录:/容器目录 容器id/容器名称
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos
[root@edd30dad389b /]# ls
anaconda-post.log bin dataVolumeContainer dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
宿主机终端1
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt myDataVolume opt proc root run sbin srv sys tmp usr var
可以发现宿主机和容器内都增加了一个文件夹
宿主机终端2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edd30dad389b centos "/bin/bash" 3 minutes ago Up 3 minutes gallant_borg
[root@localhost ~]# docker inspect edd30dad389b
## 仅展示本文需要的信息
"Mounts": [
{
"Type": "bind",
"Source": "/myDataVolume",
"Destination": "/dataVolumeContainer",
"Mode": "",
"RW": true, ## 可以进行读写操作
"Propagation": "rprivate"
}
]
"Binds": [
"/myDataVolume:/dataVolumeContainer" ## 表示容器内部已和宿主机对应的文件夹绑定
]
宿主机终端1
[root@localhost /]# cd myDataVolume/
[root@localhost myDataVolume]# ls
[root@localhost myDataVolume]# touch host.txt
[root@localhost myDataVolume]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 11 10:21 host.txt
容器终端
[root@edd30dad389b /]# cd dataVolumeContainer/
[root@edd30dad389b dataVolumeContainer]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 11 02:21 host.txt
可以看到宿主机在绑定的文件夹里创建文件的同时,容器内部对应的文件夹里也同时创建了文件
容器终端
[root@edd30dad389b dataVolumeContainer]# vi host.txt
## 写入container update 666 并保存退出
[root@edd30dad389b dataVolumeContainer]# touch container.txt
[root@edd30dad389b dataVolumeContainer]# ll
total 4
-rw-r--r--. 1 root root 0 Oct 11 02:27 container.txt
-rw-r--r--. 1 root root 21 Oct 11 02:24 host.txt
宿主机终端1
[root@localhost myDataVolume]# ll
总用量 4
-rw-r--r--. 1 root root 0 10月 11 10:27 container.txt
-rw-r--r--. 1 root root 21 10月 11 10:24 host.txt
[root@localhost myDataVolume]# cat host.txt
container update 666
可以发现无论是哪个端进行增删改文件及内容,均能相互共享
容器终端
[root@edd30dad389b dataVolumeContainer]# exit
exit
[root@localhost ~]#
宿主机终端2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
宿主机终端1
[root@localhost myDataVolume]# touch host01.txt
[root@localhost myDataVolume]# vim host.txt
## 写入host update 666 并保存退出
[root@localhost myDataVolume]# ll
总用量 4
-rw-r--r--. 1 root root 0 10月 11 10:27 container.txt
-rw-r--r--. 1 root root 0 10月 11 10:44 host01.txt
-rw-r--r--. 1 root root 37 10月 11 10:44 host.txt
容器终端
重启上次的容器id
[root@localhost ~]# docker start edd30dad389b
edd30dad389b
宿主机终端2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edd30dad389b centos "/bin/bash" About an hour ago Up 3 seconds gallant_borg
容器终端
[root@localhost ~]# docker attach edd30dad389b
[root@edd30dad389b /]# cd dataVolumeContainer/
[root@edd30dad389b dataVolumeContainer]# ll
total 4
-rw-r--r--. 1 root root 0 Oct 11 02:27 container.txt
-rw-r--r--. 1 root root 37 Oct 11 02:44 host.txt
-rw-r--r--. 1 root root 0 Oct 11 02:44 host01.txt
[root@edd30dad389b dataVolumeContainer]# cat host.txt
container update 666
host update 666
没问题,可以同步
宿主机终端1
[root@localhost myDataVolume]# cd ../
[root@localhost /]# rm -rf myDataVolume/
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
容器终端
[root@edd30dad389b dataVolumeContainer]# ll
total 0
[root@edd30dad389b dataVolumeContainer]# cd ../
[root@edd30dad389b /]# ls
anaconda-post.log bin dataVolumeContainer dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@edd30dad389b /]# exit
exit
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@2388132eddd0 /]# ls
anaconda-post.log bin dataVolumeContainer dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@2388132eddd0 /]# cd dataVolumeContainer/
[root@2388132eddd0 dataVolumeContainer]# ll
total 0
宿主机终端1
[root@localhost /]# ls
bin boot dev etc home lib lib64 media mnt myDataVolume opt proc root run sbin srv sys tmp usr var
[root@localhost /]# cd myDataVolume/
[root@localhost myDataVolume]# ll
总用量 0
[root@localhost myDataVolume]# touch host.txt
[root@localhost myDataVolume]# vim host.txt
[root@localhost myDataVolume]# cat host.txt
host update
容器终端
[root@2388132eddd0 dataVolumeContainer]# ll
total 0
-rw-r--r--. 1 root root 0 Oct 11 03:14 host.txt
[root@2388132eddd0 dataVolumeContainer]# cat host.txt
host update
重点来了
容器终端
[root@2388132eddd0 dataVolumeContainer]# touch container.txt
touch: cannot touch 'container.txt': Read-only file system
[root@2388132eddd0 dataVolumeContainer]# vi host.txt
"host.txt"
"host.txt" E212: Can't open file for writing ## vi 操作则会提示
说明权限命令没问题,只允许宿主机单向传给容器,容器不能反向传给宿主机
宿主机终端2
"Binds": [
"/myDataVolume:/dataVolumeContainer:ro" ## 加上了:ro
]
"Mounts": [
{
"Type": "bind",
"Source": "/myDataVolume",
"Destination": "/dataVolumeContainer",
"Mode": "ro",
"RW": false, ## 此时RW为false
"Propagation": "rprivate"
}
]