Docker 数据管理

在容器中管理数据主要有两种方式:

  • 数据卷(Volumes)
  • 挂载主机目录 (Bind mounts)

一、数据卷:

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

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

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

1、创建一个数据卷,执行命令如下:

查询所有数据卷,如图:

查询数据卷的详细信息,如图:

2、启动一个挂载数据卷的nginx容器,将数据卷test-volume挂载到容器内部的/webapp目录下,如图:

查看数据卷挂载情况,执行命令docker inspect nginx,如图:

从上图可以看出,容器内部所有写入到/webapp中的数据,都可以在_data中看到,并且可以持久化保存。

3、删除数据卷:

docker volume rm test-volume

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

无主的数据卷可能会占据很多空间,要清理请使用以下命令:

docker volume prune

二、 通过-v命令挂载主机目录:

使用-v (- -volume的简写,两个横杠)挂在主机目录的时候,如果宿主机或者docker里面没有对应的目录会自动创建,-v 默认只能建立bind mount (绑定挂在),bind mount的意思是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问

1、挂载一个主机目录/webapp到容器内部的/webapp,如图:

查看挂载详细详细,执行命令docker inspect nginx,如图:

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

设定了只读后,如果在容器内部的/webapp目录下新建文件,将提示错误,如图:

2、还可以挂载一个文件到容器中,如图:

上图中将.bash_history文件挂载到容器中,这样就可以查看在容器中执行的历史命令

三、通过- -mount(两个横杠)来挂载目录

– -mount默认情况下是用来挂在volume的,就是第一步中的卷,不过也可以用来挂载bing mount和tmpfs,但是需要通过type指定,如果不用type指定,那么默认就是挂载的volume,如果用- -mount挂载主机目录,如果目录不存在会报错,语法如下:

docker run -itd --name 容器名 --mount type=bind,source=/root/,destination=/tmp imageName

下面例子演示一下,如果创建的时候宿主机目录不存在会怎么样,报错如下:

docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /root/gong

标签