Docker的数据管理

I. 基本概念

Docker容器一旦删除,其相关的rootf文件系统就会被删除,其容器内的数据将一并删除,为了保存相关数据,Docker提出了数据卷的概念。

II. 数据卷

Docker中与数据卷相关的参数:

  1. -v=[]; 创建数据卷
  2. --volumes-from; 数据卷容器

1)创建数据卷

  1. -v 参数:
  2. * host-dir: 表示host上的目录,如果不存在,Docker会自动在Host上创建该目录;
  3. * container-dir:表示容器内部对应的目录,如果不存在,Docker会在容器内部创建此目录;
  4. * rw|ro :用于对控制卷的读写权限;

不指定host-dir去创建一个数据卷:

  1. $docker run -it --rm -v /volume1 --name test1 ubuntu:14.04 /bin/bash
  2. $df -lf
  3. Filesystem Size Used Avail Use% Mounted on
  4. none 40G 4.9G 33G 14% /
  5. tmpfs 497M 0 497M 0% /dev
  6. tmpfs 497M 0 497M 0% /sys/fs/cgroup
  7. /dev/vda1 40G 4.9G 33G 14% /volume1
  8. shm 64M 0 64M 0% /dev/shm
  9. tmpfs 497M 0 497M 0% /sys/firmware
  10. $ls /volume1/
  11. $echo "volume1" > /volume1/test.ext
  12. $ls /volume1/
  13. test.txt

通过查看发现Host的根分区被挂载到了容器的/volume1. 实际上Docker会在Host的/var/lib/docker/vfs/dir/(centos, 其他系统可能不同)目录中随机生成一个目录,然后挂载容器的/volume1;

可以查看容器详细配置Mounts捉的Source:

  1. $docker inspect test1
  2. "Mounts": [
  3. {
  4. "Type": "volume",
  5. "Name": "5bf4ad339dad3c7fbecb0537c1a0a0065e70109beb4194475d1de153542b582b",
  6. "Source": "/var/lib/docker/volumes/5bf4ad339dad3c7fbecb0537c1a0a0065e70109beb4194475d1de153542b582b/_data",
  7. "Destination": "/volume1",
  8. "Driver": "local",
  9. "Mode": "",
  10. "RW": true,
  11. "Propagation": ""
  12. }
  13. ],

这种方式创建的数据卷当没有基他容器依赖时,会随容器的删除而删除,同时对应的Host目录也会被删除,如查不想Host的目录被删除,需要启动时指定Host目录。

2)挂载Host的目录做为数据卷

  1. $docker run -it --rm -v /data/volume1:/volume1 ubuntu:14.04 /bin/bash
  2. $df -lh
  3. tmpfs 497M 0 497M 0% /dev
  4. tmpfs 497M 0 497M 0% /sys/fs/cgroup
  5. /dev/vda1 40G 5.3G 32G 15% /volume1
  6. shm 64M 0 64M 0% /dev/shm
  7. tmpfs 497M 0 497M 0% /sys/firmware
  8. $ls /volume/
  9. $echo "hello"> /volume1/hello.txt
  10. $exit
  11. $ls /data/volume1/
  12. hello.txt
  13. $cat /data/volume1/hello.txt
  14. hello

这样即使容器被删除,host内的目录仍然含有容器的相关数据文件,这种也是容器与Host进行数据交换的一种方式。实际上Docker内部是通过mount --bind来实现的。

容器对挂载的数据据具有读写权限控制:如挂载目录为只读权限

  1. $docker run -it --rm -v /data/volume1:/volume1:ro ubuntu:14.04 /bin/bash
  2. $df -lh
  3. $touch /volume1/hello.txt
  4. touch: cannot touch 'test.text': Read-only file system

3) 挂载Host的文件作为数据卷(此方法一般用于Host与容器间共享配置文件)

  • 通过挂载Host 的bash历史命令文件,在容器中查看Host的bash历史命令,当容器删除时,Host也能查看容器的执行命令历史
  1. docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu:14.04 /bin/bash
  • 同步Host与容器里的时区,挂载/etc/localtime到容器内部
  1. docker run -it --rm -v /etc/localtime:/ect/localtime ubuntu:14.04 /bin/bash

III. 数据卷容器

--volumes-from 参数用于数据卷有关的场景

1) 创建和挂载数据卷

  • 创建一个dabdata的容器,其包含一个/dbdata的数据卷
  1. $docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
  • 通过--volumes-from在其他容器中挂载/dbdata的数据卷
  1. docker run -d --volumes-from dbdata --name db1 training/postgres
  2. docker run -d --volumes-from dbtata --name db2 training/postgres
  3. docker run -d --name db3 --volumes-from db1 training/postgres

如此这样,db1和db2都能看到容器dbdata所有的数据卷(/dbdata)的内容,db3 是从其他已经挂载容器卷的容器挂载数据卷。

当我们删除挂载数据卷的容器时,数据卷不会被删除,只能所有引用的容器被删除后,通过docker rm -v 显式删除数据卷。

2)数据卷容器的使用

使用数据卷进行多容器日志收集

构建rsyslog镜像(使用Dockerfile)
  • Dockerfile 内容
  1. #forrsyslog
  2. FROM centos6
  3. MAINTAINER hustcat
  4. RUN yum -y install rsyslog && yum clean all
  5. CMD rsyslogd -n
  6. VOLUME /dev
  7. VOLUME /var/log
  • run Dockerfile
  1. docker build -t hustcat/rsyslog
运行rsyslog容器
  1. docker run --name rsyslog -d -v /tmp/syslogdev:/devhustcat/rsyslog
  2. ls /tmp/syslogdev/log -lh
从其他容器写log到日志容器
  1. docker run --rm -v /tmp/syslogdev/log:/dev/log centos6 logger -p info "hello rsyslog"

附:专门处理容器日志的工具loggly

IV. 备份、恢复和迁移数据卷

1). 备份

  1. docker run --volumes-from dbdata -v ${pwd}:/backup ubuntu tar cvf /backup/backup.tar /dbdata
  • 创建一下新容器, 将Host本地目录挂载到/backup;
  • 将数据卷容器dbdata的数据卷/dbdata打包到/backup/backup.tar
  • 在Host的当前目录即可看到backup.tar

2). 恢复

将backup.tar的数据恢复到一个新的容器dbdata2中

  1. docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
  2. docker run --volumes-from dbdata2 -v ${pwd}:/backup busybox tar xvf /backup/backup.tar

Docker系统七:Docker数据管理的更多相关文章

  1. BI系统打包Docker镜像及容器化部署的具体实现

    在过去的几年中,"云"作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理:或者是没用过,但听过它的大名:也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟.作 ...

  2. 【新技术】CentOS系统下docker的安装配置及使用详解

    1 docker简介    Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器.它原本是dotCloud 启动的一个业余项目,并在前些时候开源了.它吸引了大量的关注和讨 ...

  3. centos7系统下 docker 环境搭建

    运行环境: VMware Workstation Pro 在虚拟机中安装centos7系统, 选择最小安装, 网络连接方式选择的桥接(与宿主机在同一IP段)centos7一定要安装64位, docke ...

  4. Centos系统下Docker的安装

    一.检查内核版本 安装Docker,需要linux内核大于3.10 使用uname -r 来检查 二. Centos系统下Docker的安装 1. 安装需要的软件包 yum install -y yu ...

  5. CentOS系统下docker的安装与卸载

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  6. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

  7. 在Mac OSX系统的Docker机上启用Docker远程API功能

    在Mac OSX系统的Docker机上启用Docker远程API功能 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs D ...

  8. Docker -- 系统整洁之道 -- 1

    在上文Docker – 系统整洁之道 – 0中已经对Docker是什么,安装Docker以及怎么运行一个简单的容器有了初步了解,这篇文章介绍Docker的一些命令和Docker镜像的使用及操作. 一些 ...

  9. (七) Docker 部署 MySql8.0 一主一从 高可用集群

    参考并感谢 官方文档 https://hub.docker.com/_/mysql y0ngb1n https://www.jianshu.com/p/0439206e1f28 vito0319 ht ...

随机推荐

  1. AWS认证权威考经(助理级认证篇)

    笔者作为AWS官方认证的早期通过者,已经拿到了AWS的助理级解决方案架构师.开发者认证,系统管理员认证.这几年也陆续指导公司多人通过AWS的认证.本篇文章将分享如何通过自学的方式轻松通过AWS的助理级 ...

  2. Part 3:视图和模板--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  3. Part 7:自定义admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  4. Func常用模块及API

    Func常用模块及API Func提供了非常丰富的功能模块,包括: CommandModule(执行命令) CopyFileModule(拷贝文件) CpuModule(CPU信息) DiskModu ...

  5. DELL服务器硬件信息采集SHELL脚本

    DELL服务器硬件信息采集SHELL脚本最近需要做资产列表,要采集DELL服务器的硬件信息,包括如下信息:1.操作系统信息(类型,版本,内核,平台,主机名)2.主板信息(厂商,机型,序列号)3.CPU ...

  6. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

  7. weighted_cross_entropy_with_logits

    weighted_cross_entropy_with_logits 原创文章,请勿转载!!! weighted_cross_entropy_with_logits(targets, logits, ...

  8. iOS-主线程刷新UI【+单例】

    主线程刷新UI dispatch_async(dispatch_get_main_queue(), ^{ /// }); 单例 static Tools *_sharedManger; @implem ...

  9. BZOJ 2419: 电阻 [高斯消元 物理]

    http://www.lydsy.com/JudgeOnline/problem.php?id=2419 题意: n个点m个电阻构成一张图,求1到n的等效电阻 第一节课看一道题弃疗,于是来做这道物理题 ...

  10. BZOJ 2194 [快速傅里叶变换 卷积]

    题意:请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 卷积 ( ...