前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 入门到实战教程(六)Docker数据卷

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

作者头像
小东啊
发布2020-07-23 17:26:10
1.4K0
发布2020-07-23 17:26:10
举报
文章被收录于专栏:李浩东的博客李浩东的博客

一. 前言

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

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

二. 数据卷

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

2.1 数据卷

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

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

数据卷的特性:

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

使用命令创建一个test-vol

docker volume create test-vol

file

2.1.2 查看所有的数据卷
docker volume ls

file

2.1.3 查看具体数据卷的信息
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
docker run -d -P  --name test-web -mount source=my-vol,target=/webapp training/webapp python app.py
2.2.2 -v挂载
docker run -d -P  --name test-web -v test-vol:/wepapp training/webapp python app.py
2.3 查看数据卷的具体信息
docker inspect test-web

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

file

2.4 删除数据卷

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

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

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

docker volume rm test-vol

file

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

file

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

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

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

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

启动我们之前的centos

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 挂载本地文件到容器数据卷
docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash

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

三. 数据卷容器

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

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

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

file

3.1 使用数据卷容器

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

docker run -d --volumes-from dbstore --name db1 training/postgres

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

docker run -d --volumes-from dbstore --name db2 training/postgres

file

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

docker run -d --name db3 --volumes-from db1 training/postgres

file

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

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

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

4.1 备份数据卷

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

docker run -it -v /data --name test-data docker/whalesay

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

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

file

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

 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:

docker run -itd -v /data --name data1 centos /bin/bash

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小东IT技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 前言
  • 二. 数据卷
    • 2.1 数据卷
      • 2.1.1 创建一个数据卷
      • 2.1.2 查看所有的数据卷
      • 2.1.3 查看具体数据卷的信息
    • 2.2 挂载数据卷
      • 2.2.1 -mount
      • 2.2.2 -v挂载
    • 2.3 查看数据卷的具体信息
      • 2.4 删除数据卷
        • 2.5 挂载本地数据到容器数据卷
          • 2.6 挂载本地文件到容器数据卷
          • 三. 数据卷容器
            • 3.1 使用数据卷容器
            • 四. 备份、恢复与迁移数据卷
              • 4.1 备份数据卷
                • 4.2 恢复数据卷
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档