Docker实践之07-数据管理

2022-09-09 08:26:37 浏览数 (1)

目录

  • 一.数据卷概述
  • 二.创建数据卷
  • 三.查看数据卷
  • 四.挂载数据卷
  • 五.删除数据卷
  • 六.挂载主机目录或文件
  • 七.挂载数据卷与主机目录/文件的比较

一.数据卷概述

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意: 数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

二.创建数据卷

使用命令docker volume create创建数据卷,如:

代码语言:javascript复制
$ docker volume create test-vol
test-vol

三.查看数据卷

使用命令docker volume ls查看所有的数据卷,如:

代码语言:javascript复制
$ docker volume ls
DRIVER              VOLUME NAME
local               my-vol

在主机里使用命令docker volume inspect可以查看指定数据卷的详细信息,如:

代码语言:javascript复制
$ docker volume inspect test-vol
[
    {
        "CreatedAt": "2018-05-03T16:42:05 08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
        "Name": "test-vol",
        "Options": {},
        "Scope": "local"
    }
]

使用的docker volume create test-vol创建的数据卷默认挂载目录为“/var/lib/docker/volumes/test-vol/_data”。 注意: 数据卷的默认主机目录是:/var/lib/docker/volumes,但是在Mac下使用Docker Desktop时是不存在目录“/var/lib/docker/volumes”的,因为Mac上启动Docker本质上是启动了一个虚拟机,所以并不会在Mac主机本身存在数据卷的默认挂载目录,参考:Mac使用docker时,卷默认挂载路径/var/lib/docker/volumes不存在问题 。

四.挂载数据卷

所谓"挂载数据卷"是指将数据卷加载到容器的指定目录,在用docker run命令的时候,可以将数据卷挂载到容器里。在一次docker run中可以挂载多个数据卷。挂载数据卷可以使用2个选项:--mount或者--volume,推荐使用--mount。 如下创建一个名为web的容器,并加载一个数据卷到容器的/usr/local/tomcat/webapps目录:

代码语言:javascript复制
$ docker run -d -P --name web --mount source=my-vol,target=/usr/local/tomcat/webapps tomcat

挂在数据卷之后,来看一下如下信息:

代码语言:javascript复制
$ docker volume inspect my-vol
[
    {
        "CreatedAt": "2018-05-03T17:02:43 08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
代码语言:javascript复制
$ sudo ls /var/lib/docker/volumes/my-vol/_data -al
total 28
drwxr-x---  7 root root 4096 May  3 17:02 .
drwxr-xr-x  3 root root 4096 May  3 16:34 ..
drwxr-x--- 14 root root 4096 May  3 16:58 docs
drwxr-x---  6 root root 4096 May  3 16:58 examples
drwxr-x---  5 root root 4096 May  3 16:58 host-manager
drwxr-x---  5 root root 4096 May  3 16:58 manager
drwxr-x---  3 root root 4096 May  3 17:04 ROOT

将数据卷加载到容器的指定目录之后,在数据卷的挂载点目录下就可以看到容器的对应目录下的内容。而且,此时对数据卷挂载目录下内容的修改会同步到容器的对应目录下。 显然,上面看到的数据卷中的信息正是容器的/usr/local/tomcat/webapps目录下的内容。 现在来修改/var/lib/docker/volumes/my-vol/_data/ROOT/index.jsp文件,可以看到修改的内容马上就生效。 现在停止容器,查看/var/lib/docker/volumes/my-vol/_data内容发现数据依然存在,删除容器之后再查看,数据依然存在。

五.删除数据卷

可以使用命令docker volume rm删除数据卷,如:

代码语言:javascript复制
$ docker volume rm my-vol
my-vol

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。 如果需要在删除容器的同时移除对数据卷的引用,可以在删除容器的时候使用"-v"选项,即:docker rm -v注意: 在删除容器时使用"-v"选项并不会删除该容器使用的数据卷,仅仅是删除容器对数据卷的引用关系;因为容器删除之后,如果未使用"-v"选项移除对应的数据卷,那么再去删除数据卷时将会提示数据卷正在容器中被使用,不允许删除。

无主的数据卷可能会占据很多空间,需要使用命令docker volume prune进行清理:

代码语言:javascript复制
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
my-vol
test-vol

Total reclaimed space: 4.642MB

六.挂载主机目录或文件

1.挂载一个主机目录作为数据卷

使用--mount选项可以指定一个本地主机的目录挂载到容器中去,此时需要指定type=bind,如:

代码语言:javascript复制
$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps tomcat

此时在主机目录上做的修改,在容器中就能够及时地被感知到.

Docker挂载主机目录的默认权限是读写,也可以通过增加readonly指定为只读,如:

代码语言:javascript复制
$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly tomcat

2.挂载一个主机文件作为数据卷

--mount选项也可以从主机挂载单个文件到容器中,如:

代码语言:javascript复制
$ docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:16.04 bash

这样就可以记录在容器输入过的命令了。

七.挂载数据卷与主机目录/文件的比较

相同点:

  1. 挂载数据卷或者主机目录/文件都是容器进行数据管理的方式
  2. 都可以通过"--mount"选项进行挂载

不同点:

  1. 挂载数据卷时不需要明确指定type参数,只需要指定source和target即可,例如:--mount source=my-vol,target=/usr/local/tomcat/webapps
  2. 挂载主机目录/文件时必须明确指定type参数为bind,例如:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps;另外,挂载的主机目录默认权限是读写,也可以通过增加readonly指定为只读:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly

0 人点赞