前几节我们介绍了Docker的基本使用和三大核心概念,那么我们在使用Docker的过程中,Docker中必然产生了大量的数据,对于这些数据我们需要查看或者对这些数据进行一个备份,也有可能容器之间的数据需要进行共享,这些都涉及到了容器的数据管理操作。

关于容器中管理数据Docker主要有两种方式:数据卷(Data Volumes)和数据卷管理(Data Volumes Dontainers)。

一、数据卷

数据卷是一个可供容器使用的特殊目录,它绕过了文件系统,可提供多种特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新不会影响镜像
  • 卷会一直存在,直到没有容器使用为止

1、在容器中创建数据卷

在使用 docker run 命令运行镜像为容器时,可使用 -v 标记即在容器内创建一个数据卷,多次 -v 即可创建多个数据卷。

# 创建一个 webapp 容器,并将一个数据卷挂载到 /webapp 目录下
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3426095a52b training/webapp "python app.py" 8 seconds ago Up 7 seconds 0.0.0.0:32768->5000/tcp web # 用浏览器访问 http://192.168.0.128:32768 (192.168.0.128为主机IP) 可看到浏览器打印一行 hello world!

2、挂载主机目录为数据卷

同样使用 -v 标记,也可以指定挂载一个本地已有的目录到容器中作为数据卷。推荐方式

# 挂载一个本地主机目录为容器的数据卷
$ sudo docker run -d -P --name web -v /opt/webapp(主机目录):/opt/webapp(容器目录) training/webapp python app.py

这种挂载方式对功能的开发和测试非常方便,我们可以将自己的程序或数据放到一个主机目录中,之后创建为数据卷,哪怕主机目录不存在也没关系,Docker会自动帮助我们创建。当我们挂载之后,此时的数据卷权限为读写,我们可以通过 ro 将其指定为只读。

$ sudo docker run -d -P --name web -v /opt/webapp:/opt/webapp:ro training/webapp python app.py

3、挂载本地主机文件为数据卷

-v 标记也可挂载一个本地主机文件作为数据卷。不推荐使用

$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

二、数据卷容器

当我们需要在多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器,数据卷容器也是一个普通的Docker容器,只是这个容器它专门用来提供数据卷以供其他容器挂载。

# 0. 创建一个数据卷容器 dbdata,并创建一个数据卷挂载到 /dbdata
$ sudo docker run -itd -v /dbdata --name dbdata ubuntu # 1. 查看容器的 /dbdata 目录
root@xxx:/# ls
bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # 2. 在其他容器中挂载 dbdata 容器中的数据卷
$ sudo docker run -itd --volumes-from dbdata --name db1 ubuntu
$ sudo docker run -itd --volumes-from dbdata --name db2 ubuntu # 说明:即挂载成功,之后不管哪个容器修改了数据卷,其他容器都可即时查看。 # 3. 在 dbdata 容器中创建 test.txt 文件
$ sudo docker exec -ti fdcd9728f78e /bin/bash
root@fdcd9728f78e:/# cd /dbdata/
root@fdcd9728f78e:/dbdata# ll
total 4
drwxr-xr-x. 2 root root 6 Apr 9 12:38 ./
drwxr-xr-x. 22 root root 4096 Apr 9 12:38 ../
root@fdcd9728f78e:/dbdata# touch test.txt
root@fdcd9728f78e:/dbdata# ls
test.txt # 4. 在 db1 和 db2 容器中进行查看
$ sudo docker exec -ti 0365f0f09a87 /bin/bash
root@0365f0f09a87:/# cd /dbdata/
root@0365f0f09a87:/dbdata# ls
test.txt
root@0365f0f09a87:/dbdata# # 5. 当前运行的三个容器ID
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b57b6954e924 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes db2
0365f0f09a87 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes db1
fdcd9728f78e ubuntu "/bin/bash" 7 minutes ago Up 7 minutes dbdata

在以上操作完成后,若我们此时删除容器,数据卷并不会被删除。若要删除数据卷,必须删除最后一个还挂载它的容器时显示的使用 docker rm -v 命令来指定同时删除关联的容器。

三、利用数据卷容器迁移数据

1、备份

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

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

2、恢复

那么对备份的数据如何恢复,需要做两步走:

# 0. 创建一个带有数据卷的容器 dbdata2
$ sudo docker run -itd -v /dbdata --name dbdata2 ubuntu /bin/bash # 1. 创建另一个新的容器,挂载 dbdata2 的容器,并使用 untar 解压备份文件到所挂载的容器卷中
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

六、【Docker笔记】Docker数据管理的更多相关文章

  1. docker笔记--docker 各系统安装

    在线安装 Docker 在 CentOS/RHEL 中安装 Docker 在终端中运行下面的命令安装 Docker. sudo yum install -y yum-utils sudo yum-co ...

  2. Docker笔记——Docker安装及制作镜像

    1 Docker安装本文中Docker运行环境为Ubuntu 14.04.1 LTS 3.13.0-32-generic x64参考:https://docs.docker.com/v1.11/eng ...

  3. Docker笔记(八):数据管理

    前面(哪个前面我也忘了)有说过,如果我们需要对数据进行持久化保存,不应使其存储在容器中,因为容器中的数据会随着容器的删除而丢失,而因通过将数据存储于宿主机文件系统的形式来持久化.在Docker容器中管 ...

  4. Docker笔记(六):容器管理

    原文地址:http://blog.jboost.cn/2019/07/21/docker-6.html 容器是Docker中的另一核心概念,在Docker中,应用的运行都是在容器内进行的,容器则基于镜 ...

  5. Docker笔记(九):网络管理

    Docker的应用运行在容器中,其相互之间或与外部之间是如何通信的,涉及到哪些知识点,本文对相关内容进行整理.因网络这块牵涉的面较多,因此只从日常使用或理解的角度出发,过于专业的就不深入探讨了. 1. ...

  6. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  7. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  8. Docker容器的数据管理

    Docker容器的数据管理 Docker容器的数据管理 什么是数据卷(Data Volume)? 数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者多个容器提供访问 数据卷设计的目 ...

  9. Docker笔记一:Docker介绍

    目录 什么是Docker? Docker的核心概念 Docker镜像命令 Docker容器命令 Docker实战 查看我的镜像 启动Redis Docker中国镜像加速 血与泪的教训 什么是Docke ...

  10. Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏

    Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏 云收藏项目已经开源3年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时 ...

随机推荐

  1. 微信APP生命周期、页面生命周期

    目录 小程序的启动流程 app生命周期 页面的生命周期 页面的生命周期(图) 小程序的启动流程 我们画一个图来表示一下,整个小程序的启动流程,我们就知道了: app生命周期 执行App()函数也就是注 ...

  2. IOS7下,alertView不能使用addSubview添加textField解决办法

    UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name" message:@& ...

  3. 一起了解 .Net Foundation 项目 No.17

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Peachpie Comp ...

  4. WEB渗透之扫描 - Nikto

    2020.0202 好事成双 Nikto 纯主动 识别软件版本 存在安全隐患的文件 配置漏洞 web应用安全隐患 避免404误判 使用 插件:nikto -list-plugins 避免404误判功能 ...

  5. Django之Model相关操作

    一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...

  6. 单片机基础——使用GPIO扫描检测按键

    1. 准备工作 硬件准备 开发板首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...

  7. Sublime text 3 运行python3

    要在Sublime text3编译器中成功运行 python3,需要在编译器设置中将python3添加至编译器中 新建编译系统 编辑弹出的文件,添加如下内容: { "cmd":[& ...

  8. 今天建了一个Python学习交流的QQ群,求喜欢python的一起来交流。

    版权归作者所有,任何形式转载请联系作者.作者:枫(来自豆瓣)来源:https://www.douban.com/note/666182545/ 现在学python的人越来越多了,我也开始学习了,大群里 ...

  9. (转)协议森林07 傀儡 (UDP协议)

    协议森林07 傀儡 (UDP协议) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经讲解了物理层.连接层和网络层.最开始的 ...

  10. 微信小程序开发(一)开发准备

    微信小程序开发(一)开发准备 微信小程序,近几年,越来越火,应用场景越来越多,好大学习起来,比较容易,学习曲线平缓,你要是会前端开发,那简直可以用易如反掌来形容. 小程序,开发工具官方也提供了,他兼容 ...