容器数据

引言:容器中的文件系统是由分层文件系统提供的,包含只读层(镜像)和可读可写层(容器运行时层),这些都是被封装在容器内部的。如果用户需要将主机上的文件系统共享给容器使用,那怎么办呢? 
本文选自《Docker容器实战:原理、架构与应用》,将向您介绍使用数据卷与数据容器两种方式进行共享。

数据卷

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

1 创建一个数据卷

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

[email protected]:~# docker run -d -P --name datatest -v /webapp ubuntu13ffee3a3f50d07fd5a737aaf2efc60ceec28e2b04c5d534cfd84d8b70019c11

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

[email protected]:~# 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 的方式指定,那么容器则会直接将宿主机的目录挂载到容器内部:

[email protected]:~# docker run -it -v /root:/hostroot [email protected]:/# ls /hostrootDockerfile composetest gcagent myimage uninstall_agent.sh

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

使用数据型容器

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

[email protected]:~# docker create -v /dbdata --name dbstore ubuntud95cdc1139ed1011fe51843f524c377cd7497629e9a4434508f422f15b61a03c

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

[email protected]:~# docker run --rm -it --volumes-from dbstore [email protected]:/# df -hFilesystem          Size Used Avail Use% Mounted onNone                 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-11-05 13:45:58

容器数据的相关文章

Docker 容器数据持久化

Docker Volumn 卷 提供了一种容器数据持久化的技术,可以将容器中的目录挂载至本机上.同时也为容器之间的数据共享提供了方便. 不指定挂载到宿主机 比如运行docker run -d --name nginx -v /usr/share/nginx/html whoami/hello-nginx -d 在daemon中运行 --name nginx 将容器命名为nginx -v /usr/share/nginx/html 指定需要持久化的目录,即需要挂载的目录. 使用sudo docke

docker 12 docker容器数据卷

数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ♣还有一种情况,就是希望容器之间能共享数据,这时也需要容器数据卷. ♣一句话,数据卷就是用来解决数据持久化和数据共享的. ♣卷就是目录或者文件,存在一个或者多个容器中,由docker宿主机挂载到容器上,但是不属于联合文件系统,因此能绕过联合文件系统提供一些用于持久化存储或者共享数据的特性. ♣卷的

(九) Docker 容器数据卷(挂载)

一.容器数据卷 docker 容器数据卷是容器在运行过程中持久化数据的一种方式,卷是目录或文件,存在于一个或多个容器中,由docker 挂载到容器,但不属于联合文件系统,因此能够绕过Union File System  提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此docker不会在容器删除时,删除其挂载的数据卷. 特点: 数据卷可在容器之间共享或重用数据. 卷中的更改可以直接生效. 数据卷中的更改,不会包含在镜像中的更新. 数据卷的生命周期一直

5、docker容器数据卷

Docker容器数据卷 是什么 一句话:有点类似我们Redis里面的rdb和aof文件 能干嘛 容器的持久化 容器间继承+共享数据 数据卷 容器内添加 直接命令添加 命令 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 查看数据卷是否挂载成功 容器和宿主机之间数据共享 容器停止退出后,主机修改后数据是否同步 命令(带权限) docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 DockerFile添加 根目录下新建mydocker文

Docker 数据卷-Docker容器数据持久化方式

以tomcat为例,若是我们需要启动一个docker tomcat 容器,并将我们的工程放进tomcat启动 在没有数据卷的情况下,我们所采用的方式: 利用dockerfile将工程拷贝到tomcat 的 webapps目录下创建一个新的镜像,然后通过这个新的镜像来创建容器并启动,以此部署. 这种方式固然好用,但是却需要创建新的镜像,假如需要部署新的工程,又要创建新的镜像.很麻烦 而且,这种方式会造成重复写的问题,就是我们的工程文件实质上在docker容器和宿主机上写入了两次.造成性能损耗. 还

Docker 容器数据 持久化(系统学习Docker05)

写在前面 本来是可以将数据存储在 容器内部 的.但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来.以前的同事也没有将数据映射到外面 .搞得最后我们重新导的数据,痛的领悟啊~~). 再就是如果不将数据映射出来 ,比如要想使用容器内部的web日志,也是比较难搞,反正不就是其它容器/服务不是很方便. 大体上来说,一般只要使用Docker都会将 重要的数据 进行持久化. 本文有任何问题,欢迎留言指正~ Do

容器数据卷网络基本配置

容器和主机.容器与容器之间需要数据共享时可以使用数据卷技术解决 容器中管理数据的主要方式有两种:数据卷.数据卷容器 1 数据卷 1.1 数据卷特性 可在容器之间共享和重用 对数据卷的修改马上生效 对数据卷的更新不影响镜像 卷会一直存在,直到没有容器使用 1.2 在容器内创建一个数据卷的方式,在启动的时候使用 -v 标记,可以创建一个数据卷挂载到容器指定目录中,也可以挂载本地目录到容器中作为数据卷. 说明:本地目录路径必须是绝对路径,如果不存在,docker会自动创建. 1.3 数据卷容器,可以在

Docker容器数据券

1.是什么? 2.能干嘛? 3.数据卷 --容器内添加 方式一:直接命令添加 1).命令 2).在宿主机上新建并添加内容 3).查看容器内相应共享文件夹,发现宿主机的文件夹下发生变化,会同步到容器内的共享文件夹内 4).查看数据卷是否挂载成功 ?  使用docker inspect 容器ID 命令查看容器信息,出现内容,说明绑定成功 5).容器停止退出后,主机修改数据后是否能同步? 修改主机host.txt文件 启动之前的退出的容器 进入容器 查看挂载文件夹,出现了主机修改过内容,说明容器停止退

Docker容器数据卷

容器关闭,数据消失: 我们对数据的要求希望是 持久化的: 容器之间希望可以共享数据: 一.能干嘛: 1.持久化 2.数据共享,双向拷贝 二.数据卷 容器内添加: 1.直接命令添加 2.DockerFile添加 3.备注 原文地址:https://www.cnblogs.com/pthaochiya/p/11666235.html