容器数据

数据卷

  数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。当做持久化时,通常数据卷都会比较大,可以将其放在单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。当做数据共享时,可以用于开发和测试分布式系统,如需要用到共享盘、处理fencing 等。数据卷主要通过-v 参数来指定。

1 创建一个数据卷

  若需要一个外部卷来存放持久化数据,而不想把数据包含在容器内部。例如:

root@ghostcloud:~# docker run -d -P --name datatest -v /webapp ubuntu
13ffee3a3f50d07fd5a737aaf2efc60ceec28e2b04c5d534cfd84d8b70019c11

  这条命令创建了一个名为datatest 的容器,同时为其创建了一个/webapp 的数据卷,这是数据卷在其内部的位置。那么它在主机上的什么位置呢?

root@ghostcloud:~# docker inspect 13ff
...
"Mounts": [
{
"Name":
"ec1c427a6a76be4918d6e8bac3247e2836dc8f424c9e06466fcf1baab-6e7ee79","Source":
"/var/lib/docker/volumes/ec1c427a6a76be4918d6e8bac3247e2836dc8f424c9e06466fcf1baab6e7ee79/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...

  它的位置在/var/lib/docker 下。

2 映射一个外部卷

  如果以-v src:des 的方式指定,那么容器则会直接将宿主机的目录挂载到容器内部:

root@ghostcloud:~# docker run -it -v /root:/hostroot ubuntu
root@86ea1246ae5d:/# ls /hostroot
Dockerfile composetest gcagent myimage uninstall_agent.sh

  将宿主机/root 目录映射到了容器/hostroot 目录中。此时,用户可以在容器中对宿主机/root 目录中的文件进行修改,但这种操作是非常危险的。在做数据卷映射时,一定要特别小心,任何时候都不要将宿主机的根目录映射到容器内部。

使用数据型容器

  由于容器本身就可以包含文件系统,那么可不可以把容器的卷分享给另一个容器用呢?答案是可以的。具体的步骤如下。
(1)创建一个包含外部卷的容器,注意是create,并不是run。run 是create 后再start,本例只需要容器的文件系统,所以只需要create.

root@ghostcloud:~# docker create -v /dbdata --name dbstore ubuntu
d95cdc1139ed1011fe51843f524c377cd7497629e9a4434508f422f15b61a03c

(2)在另一个容器中通过--volumes-from 来映射。

root@ghostcloud:~# docker run --rm -it --volumes-from dbstore ubuntu
root@4b61bb181471:/# df -h
Filesystem          Size Used Avail Use% Mounted on
None                 8.8G 4.2G 4.2G 50% /
tmpfs                2.0G 0 2.0G 0% /dev
tmpfs                2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/disk/by-uuid/27d8b1c5-4bfc-4499-94d6-6e5f5c42e923 8.8G 4.2G 4.2G 50%/dbdata

备份、还原和迁移数据卷

  下面是通过容器型数据卷和数据卷联合使用做备份的例子。

$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf
/backup/backup.tar /dbdata

  剖析:

  • volumes-from 表示使用dbstore 这个容器的数据卷;
  • v $(pwd):/backup 表示将当前路径映射到容器的/backup 中,用于后续备份;
  • ubuntu tar cvf /backup/backup.tar /dbdata 表示将/dbdata 的内容备份到当前目录。

上面这个例子就是典型的将容器作为一个工具来使用的例子,如果更进一步,用户可以自己写一个Dockerfile,然后产生一个Image,将参数都指定好,以后只需启动容器就可备份,备份完成后又自动退出。
那么还原呢?

$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd/dbdata && tar xvf /backup/backup.tar --strip 1"

  类似地,通过tar 来解压即可。

容器和代码进行关联

  数据卷有下面几个特点:

  • 数据卷在容器创建时进行初始化;
  • 数据卷既可以共享,也可以在容器之间重用;
  • 对于数据卷的读写是直接下发的;
  • Commit 命令不会将改动保存到镜像中;

即使容器被删除了,数据卷仍然存在,因此这一块需要特别注意,避免产生垃圾数据卷。

   本文选自《Docker容器实战:原理、架构与应用》,点此链接可在博文视点官网查看此书。
                      
  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       

时间: 2024-09-20 00:45:33

容器数据的相关文章

初识docker-管理容器数据

管理容器数据 到目前为止,我们已经介绍了docker的一些基本概念,了解了如何使用docker镜像,以及容器之间如何通过网络连接.本节,我们来讨论如何管理容器和容器间的共享数据. 接下来,我们将主要介绍Docker管理数据的两种主要的方法: 数据卷 数据卷容器 数据卷 数据卷是指在存在于一个或多个容器中的特定目录,此目录能够绕过Union File System提供一些用于持续存储或共享数据的特性. 数据卷可在容器之间共享或重用 数据卷中的更改可以直接生效 数据卷中的更改不会包含在镜像的更新中

Docker数据持久化与容器迁移(三)

上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据.如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据.那么,来一一看下各自的使用方法. 一.数据卷 数据卷特性: 可以绕过UFS文件系统,为一个或多个容器提供访问. 完全独立于容器的生存周期,因此不会在删除容器时删除其挂在的数据卷. 数据卷特点: 数据卷在容器启动初始化

java Map容器怎么定量输出,即当容器到达一定量后输出数据到文件

问题描述 java Map容器怎么定量输出,即当容器到达一定量后输出数据到文件 由于放进Map容器数据量很大,一次性放入的话会导致堆溢出,假如有1010万条记录,如何限制Map的输出记录数,当Map里存放有100万条记录时就输出到文件,依此类推,第11次把最后剩余的10万条也输出到文件. 解决方案 map本身似乎没有这种功能,它就一个容器,怎么会考虑你这特殊的需求.你自己用代码实现吧.内存溢出的话,你可以试试给虚拟机加一下参数,指定最小内存.另外你那个功能的实现我觉得用map实现不见得很好.可以

挂载点:三种Jelastic容器的数据分享

本文讲的是挂载点:三种Jelastic容器的数据分享[编者的话]如何挂载主容器.数据容器.外部服务器三类容器中的数据?作者给出了简洁明了的图解介绍. 在之前的文章中,我们开始挖掘数据存储容器的关键潜能,分享了五种用容器存储数据的方式,之后又进一步深入,谈到了Jelastic专用贮存容器. 以下我们将描述如何简捷地使用容器挂载数据. 挂载点本来是用于管理服务器数据存储容器链接的.在内置的配置管理器的同名部分,你可以定义当前容器可以获取到的其他远程节点的目录. 存储数据时,可以使用你的账户中或者外部

Docker官方论坛中回复最多的一个帖子“在数据容器内升级数据”

Docker官方论坛中回复最多的一个帖子"在数据容器内升级数据" matlehmann我有一个含数据的容器,它有一个卷(比如在/var/data)中的持久性数据.该容器包含持久性数据对另一个容器的软件.对于该软件的新版本,需要升级所述永久数据(结构或布局改变等).其结果是,我想与在相同的位置已升级的数据的另一数据容器(在/var/data)和仍保留旧数据容器与它的数据不变.这样一来,我可以用旧的数据容器与旧版本的软件,万一出了差错.但是,我怎么能做到这一点?以实现所期望的结果所需要的步

实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作

Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3.数据卷容器作为其他容器的数据卷.降低磁盘开销.4.数据的备份,恢复和迁移.5.Docker hub的常用操作. 1.0.数据卷(Data volumes) Data volumes是一个或者多个容器特别指定的目录,它区别于联合文件系统的(Union File System,或称UnionFS,通过

容器与持久数据

本文讲的是容器与持久数据,[编者的话]如何持久化保存容器的数据,这是自Docker诞生之日起就一直存在的问题.本文介绍了多个与此相关的项目,包括Raft算法.Etcd.CockroachDB.Flocker和高可用PostgresSQL集群Governor等. 越来越多的用户想容器化所有的基础设施,这不仅包括web服务器.队列和代理服务器,还包括数据库服务器.文件存储和缓存等.在CoreOS Fest的应用容器规范(appc)专家小组会议上,听众的第一个问题就是:对于有状态的容器,该怎么办?所谓

Docker 数据卷,数据卷容器详细介绍_docker

Docker 数据卷,数据卷容器详细介绍 引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(moun

容器监控的工具和流程

本文讲的是容器监控的工具和流程[编者的话]在容器和微服务场景中,监控解决方案有很多种,包括Docker原生的Stats API和命令.cAdvisor,还有Prometheus和Sysdig这样相对复杂和功能强大的工具,除此之外还有很多供应商提供的解决方案. 随着容器和微服务的引入,监控解决方案必须处理比以往任何时候都要更多的短生命周期服务和服务实例.虽然基础设施的场景发生了变化,运维团队仍然需要在中央处理器(CPU).随机存取存储器(RAM).硬盘驱动器(HDD).网络利用率以及应用程序节点的