Docker 入门到实战教程(六)Docker数据卷

2020-07-23 17:26:10 浏览数 (1)

一. 前言

上一篇介绍到如何构建镜像以及镜像管理,不知道大家学到现在有没有疑问?比如我运行web服务产生的日志,我如何在宿主机上看到?我想安装mysql或者redis等,配置文件如何配置,可以进到容器去设置,但是容器出现问题或者采重启怎么办呢?种种疑问都说明一个问题--数据共享和持久化

接下来我们就看看Docker和宿主机如何数据共享和持久化?

二. 数据卷

在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。容器中数据管理主要有两种方式:数据卷和数据卷容器。

2.1 数据卷

数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。

数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。

数据卷的特性:

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间共享和重用
  • 可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像的更新
  • 数据卷会一直存在,即使挂载数据卷的容器已经被删除
2.1.1 创建一个数据卷

使用命令创建一个test-vol

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

file

2.1.2 查看所有的数据卷
代码语言:javascript复制
docker volume ls

file

2.1.3 查看具体数据卷的信息
代码语言:javascript复制
docker volume inspect test-vol

file

2.2 挂载数据卷

两种挂载方式:

  • docker run --name 容器名 -it --mount source=卷名,target=容器内绝对路径(挂载点) 镜像名
  • docker run --name 容器名 -it -v 卷名:容器内绝对路径(挂载点) 镜像名

挂载就是用–mount参数 source是数据卷,target是容器内文件系统挂载点 , 还可以使用-v参数-v 卷名:容器内绝对路径`

下面创建一个名为 test-web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。

2.2.1 -mount
代码语言:javascript复制
docker run -d -P  --name test-web -mount source=my-vol,target=/webapp training/webapp python app.py
2.2.2 -v挂载
代码语言:javascript复制
docker run -d -P  --name test-web -v test-vol:/wepapp training/webapp python app.py
2.3 查看数据卷的具体信息
代码语言:javascript复制
docker inspect test-web

数据卷信息在 "Mounts" Key 下面

file

2.4 删除数据卷

docker volume rm卷名来删除指定数据卷

docker volume prune来删除无主的数据卷

例如: 删除刚刚创建的test-vol

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

file

执行命令后报错,意思是说数据卷正在使用无法删除,需要将容器停止再删除

file

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

2.5 挂载本地数据到容器数据卷

在前面示例中,我们运行容器时并没有指定要挂载到容器中数据卷的本地目录,所在Docker使用一个默认数据目录。-v参数除了可以在容器中创建数据卷外,还可以将宿主机中的目录挂载到容器中的数据卷。

docker run -it -v 宿主机目录:容器目录 镜像

启动我们之前的centos

代码语言:javascript复制
docker run -it /usr/dataVolume:/usr/dataVolumeContainer centos

file

执行命令后,分别在宿主机和docker容器,可以看到各自在/usr目录下创建了一个文件夹

file

验证数据共享,在进入容器后,在dataVol中建立一个test.txt的文件,并写入"hello"

file

退出容器,我们在本机的dataVol中可以看到有一个test.txt的文件,内容是"hello",如果我们此时再test.txt中继续追加 内容 “hello docker”

file

2.6 挂载本地文件到容器数据卷
代码语言:javascript复制
docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash

以上命令把本地的~/.bash_history文件挂载到新容器中,这样就可以记录在容器输入过的命令了。

三. 数据卷容器

如果你有一些要在容器之间共享的持久性数据,或者希望在非持久容器中使用,那么最好创建一个命名的数据卷容器,然后从其挂载数据。 说通俗点就是一个正常的容器,专门用来提供数据卷供其它容器挂载的

接下来,我们创建一个新的命名的共享容器。这个容器不运行一个应用程序,它利用training/postgres镜像在所有的容器之间创建了一个共享层,以节省磁盘空间。

training/postgres是Docker 之前我下载的一个镜像,拿来直接使用

file

3.1 使用数据卷容器

创建数据卷容器后,我们可以通过--volumes-from选项,将一个数据容器挂载到其它容器:

代码语言:javascript复制
docker run -d --volumes-from dbstore --name db1 training/postgres

也可以在多个容器间共享。如,挂载到另一个容器:

代码语言:javascript复制
docker run -d --volumes-from dbstore --name db2 training/postgres

file

这时,如果training/postgres镜像内有名/dbdata的目录,则会从dbstore容器挂载卷,并会隐藏training/postgres镜像中/dbdata下的文件。最终只有dbstore容器中的文件可见。还可以扩展挂载链,从已经存在的dbstore容器(如:db1、db2)来挂载卷:

代码语言:javascript复制
docker run -d --name db3 --volumes-from db1 training/postgres

file

这种情况下,如果移除己挂载卷的容器,无论是最初的dbstore容器,还是后面的db1db2容器,卷都不会被移除。要将卷从硬盘上移除,必须使用docker rm -v命令删除最后一个引用了该卷的容器。

四. 备份、恢复与迁移数据卷

数据卷的常用操作还有数据卷备份、恢复、合并操作。以下是一些常用操作:

4.1 备份数据卷

在前面介绍数据卷容器时,我们创建了一个名为dbdata容器,并在容器中创建了一个/dbdata的数据卷。接下来,可以在创建容器使用--volumes-from参数来挂载这个数据卷,并对数据进行备份:

代码语言:javascript复制
docker run -it -v /data --name test-data docker/whalesay

注: docker/whalesay是一个有趣的镜像

创建data数据卷容器挂载了/data目录. 为了验证数据卷容器的备份功能,在挂载的/data目录下创建一个test.text文件,并写入内容"test"

file

然后数据卷容器进行备份,使用 –volumes-from 标记来创建一个加载data容器卷的容器,并从主机挂载当前目录到容器的/backup目录。

代码语言:javascript复制
 docker run -it --volumes-from test-data -v $(pwd):/backup docker/whalesay tar cvf /backup/backup.tar /data

file

$(pwd)是docker支持的指定当前目录的方法,了解linux基本命令的会发现,linux查看当前目录就是pwd命令。容器启动后,在当前目录下生成的backup.tar文件就是data容器卷的备份文件。这样,数据卷容器中的数据就备份完成。

4.2 恢复数据卷

数据备份最终也是为了可以恢复,否则备份就没有意义了,Docker恢复备份也很简单,只需要2步即可。,可以在创建容器恢复备份数据到容器内的数据卷中,从而实现数据的迁移。

首先,创建并运行容器并添加一个数据卷data1:

代码语言:javascript复制
docker run -itd -v /data --name data1 centos /bin/bash

然后创建另一个容器,挂载data1容器卷中的数据卷,并使用untar解压备份文件到挂载的容器卷中。

代码语言:javascript复制
docker run --volumes-from data1 -v $(pwd):/backup centos tar xvf /backup/backup.tar

这个时候,之前备份的数据卷容器的数据已经恢复到了容器data1中了。为了查看和验证恢复的数据,我们可以再启动一个容器挂载data1容器卷来查看。

file

参考链接: http://suo.im/6okWe9 http://suo.im/5xHqrr

0 人点赞