Docker(五):容器数据卷1

一、是什么

先来看看Docker的理念:

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

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

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

有点类似redis的RDB和AOF文件。

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

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

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

二、能做什么

  • 容器的持久化
  • 容器间继承+共享数据

三、数据卷(用命令增加)

主要命令:

  • docker run -it -v /宿主机目录:/容器目录 容器id/容器名称 (不带权限,可读可写 v:Volume 卷)
  • docker run -it -v /宿主机目录:/容器目录:ro 容器id/容器名称 (带权限,可读不可写 ro:read only)

1、打开多个终端:container终端、宿主机终端1、宿主机终端2

生成数据卷之前,先分别查看宿主机和容器根目录下的文件
容器终端

[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" ## 表示容器内部已和宿主机对应的文件夹绑定
            ]

2、实现继承+共享数据

宿主机终端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

可以发现无论是哪个端进行增删改文件及内容,均能相互共享

3、容器停止后,宿主机修改后能否同步数据

容器终端

[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

没问题,可以同步

4、命令带权限

宿主机终端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"
            }
        ]

你可能感兴趣的:(Docker)