跟我一起学docker(六)--数据管理

1.数据卷

数据卷是一个可供容器使用的特殊目录,有如下特性:

数据卷可以在容器之间共享和重用

数据卷修改会立即生效

数据卷的更新不会影响镜像

如果有容器使用数据卷,该卷会一直存在

准备工作:

创建一个目录,并在目录里面创建文件,文件内写入内容。

在容器内创建数据卷

在使用docker run的命令时,使用 -v 标记可以在容器内创建一个数据卷,并且可以指定挂在一个本地已有的目录到容器中作为数据卷:

docker run -d --name app1-it -v ${PWD}/webapp:/root/webapp ubuntu bash

通过目录跟容器内建立了一层关系,数据卷发生变化后,容器内和容器外都会随之发生改变。例如容器挂载一个文件,当容器挂了后,文件不会丢失。

注意:默认挂载的数据卷的权限是rw(可读写),如果要求ro(只读),则需要加上对应的ro参数,命令可改为:

docker run -d --name app1-it -v ${PWD}/webapp:/root/webapp:ro ubuntu bash

下面我们一起来操作一下:

创建webapp目录,在目录下新建文件file,并在文件file中写入“this is a file”。

echo ${PWD} 命令标识当前目录。

创建启动app1容器并挂载数据卷

进入容器找到root目录可查看到已挂载的数据卷。

数据卷目录与容器内目录有映射关系,所以不管是在容器内部修改数据卷还是在外部修改数据卷,相对应的数据卷都会发生改变。

只读的演示

2.数据卷容器

数据卷容器用于用户需要在容器间共享一些持续更新的数据,数据卷容器专门提供数据卷供其它容器挂载使用。

Example:

创建数据卷容器db1

docker run -d --name db1 -v/dbdata -ti ubuntu bash

创建容器db2与db1共享dbdata的数据

docker run -d --name db2 --volumes-fromdb1 -ti ubuntu bash

在容器db1和容器db2任意一个容器修改dbdata的内容,在两个容器内均生效

数据卷容器的删除:

如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载它的容器时显示使用docker rm -v 命令指定同时删除关联的容器。在下图可看到即使删除aatest,bbtest中仍然有fileA文件。

在aatest中创建了文件fileA,bbtest可以看到fileA,删除aatest容器后,fileA在bbtest中还可以看到。

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份:

使用下面的命令来备份dbdata数据卷容器内的数据卷:

docker run --volumes-fromdbdata -v ${PWD}:/backup --name worker ubuntu \tar cvf /backup/backup.tar/dbdata

说明:

利用ubuntu镜像创建一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata的数据卷;使用${pwd}:/backup参数来挂载本地目录到worker容器的/backup目录。

worker启动后,使用tar命令将/dbdata下的内容备份为容器内的/backup/backup.tar。

创建dbdata数据卷容器并写入文件:fileA、fileB、fileC

执行备份命令创建备份tar包:

恢复:

如果恢复数据到一个容器,可以参照下面的操作。首先创建一个带有数据卷的容器dbdata2:

docker run -d -v /dbdata--name dbdata2 ubuntu /bin/bash

然后创建另一个新的容器,挂载dbdata2的容器,并使用tar命令解压备份文件到挂载的容器卷中即可:

docker run --volumes-fromdbdata2 -v ${pwd}:/backup ubuntu tar xvf /backup/backup.tar

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏世界第一语言是java

docker部署redis,清空redis缓存

1.2K10
来自专栏架构说

阅读准备-构建redis容器

docker容器默认只提供一个服务, 我试图ssh进去 gdb git tcpdump strace valgrind 又安装redis 折腾很长时间 主要遇如...

42760
来自专栏运维小白

Docker镜像管理

Docker镜像管理 docker pull centos//可以下载centos镜像,速度很慢 配置docker加速器,参考链接 vi /etc/docker...

42350
来自专栏编程

在容器中部署mysql与数据持久化

通过上一节的学习,我们知道了如何部署一个不带数据库的静态nginx页面;但一般的web应用中,还需要部署mysql数据库,本节我们将学习如何使用容器部署mysq...

30990
来自专栏草根专栏

Docker & ASP.NET Core (1):把代码连接到容器

这样做的好处就是可以节省硬盘空间,也利于复用等等。因为Docker基于镜像创建容器的时候,其镜像是共享的;而且镜像里面的层如果已存在,也无需再下载。

13720
来自专栏A周立SpringCloud

Docker系列教程17-默认bridge网络中配置DNS

本文依然是一篇翻译,英文原文https://docs.docker.com/engine/userguide/networking/default_networ...

42090
来自专栏分布式系统和大数据处理

基于Docker的持续集成方案(安装docker) - Part.2

Docker是近几年非常流行的一项技术,我也花了一点时间研究了一下。这篇文章简单地记录一下如何在Linux(CentOS 7)系统上安装Docker,并概述了最...

17540
来自专栏后端云

虚拟机无法启动

由于kvm所在的机器启用了SELINUX,后来将之关闭,关闭之后,发现kvm的虚拟机无法启动

34940
来自专栏云计算

将基于MicroProfile的Java应用程序部署到Bluemix

Eclipse MicroProfile是一个开源项目,用于为微服务架构优化企业级Java语言。基于MicroProfile的应用程序可以部署到Kubernet...

253100
来自专栏IT笔记

Docker学习之搭建JavaWeb环境进阶篇

上一篇文章中,简单了学习了一下在Docker环境中搭建JavaWeb环境,其实这时候已经是一个全新的镜像了,就是我们的Ghost系统一样,装配了各式各样的软件一...

35670

扫码关注云+社区

领取腾讯云代金券