一、什么是容器数据卷?

为什么Docker需要容器数据卷?因为当我们将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!就好比,你安装一个MySQL,结果不小心把容器删了,那岂不是就相当于删库跑路了,这显然是不允许发生的事情!
在这里插入图片描述
为了能保存数据在Docker中我们就可以使用卷!让数据 挂载 到我们本地!这样数据就不会因为容器删除而丢失了!
在这里插入图片描述

容器卷的作用:
卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

容器卷的特点:

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

所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

二、使用数据卷

1、挂载
# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
[root@TR ~]# ll
total 1052
drwxr-xr-x 9 1001 1001    4096 Nov 29 20:54 nginx-1.21.4
-rw-r--r-- 1 root root 1070260 Nov 29 20:42 nginx-1.21.4.tar.gz
# 1、创建一个测试文件夹“pangtaiyi”
[root@TR ~]# mkdir pangtaiyi
[root@TR ~]# ll
total 1056
drwxr-xr-x 9 1001 1001    4096 Nov 29 20:54 nginx-1.21.4
-rw-r--r-- 1 root root 1070260 Nov 29 20:42 nginx-1.21.4.tar.gz
drwxr-xr-x 2 root root    4096 Dec  1 21:40 pangtaiyi

# 2、运行Centos 镜像, 并将容器中的 “/root/pangtaiyi” 目录和本地的“/root/pangtaiyi”目录关联起来
[root@TR ~]# docker run -it -v /root/pangtaiyi:/root/pangtaiyi centos /bin/bash
[root@2cb343981d5b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@2cb343981d5b /]# cd root
[root@2cb343981d5b ~]# ls
anaconda-ks.cfg  anaconda-post.log  original-ks.cfg  pangtaiyi
[root@2cb343981d5b ~]# cd pangtaiyi

# 3、在 “pangtaiyi”文件夹下创建一个“pangtaiyi.txt” 文件
[root@2cb343981d5b pangtaiyi]# touch pangtaiyi.txt
[root@2cb343981d5b pangtaiyi]# ls
pangtaiyi.txt

# 4、退出容器, 看下本地关联的目录下是否有文件生成
[root@2cb343981d5b pangtaiyi]# [root@TR ~]# 
[root@TR ~]# cd pangtaiyi
[root@TR pangtaiyi]# ll
total 0
-rw-r--r-- 1 root root 0 Dec  1 21:42 pangtaiyi.txt
2、查询挂载情况
# 语法 “docker inspect 容器ID”
[root@TR ~]# docker inspect 2cb343981d5b
[
    {
        "Id": "2cb343981d5b4181869b807b51c08af487534333073013186ee4ed540f23b3d5",
        "Created": "2021-12-01T13:41:54.89582656Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1850114,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-12-01T13:41:55.330564955Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        ..................
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/pangtaiyi",
                "Destination": "/root/pangtaiyi",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        ........
    }
]

可以看到在 Mounts 中, 有我们之前挂载的两个路径。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐