前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何共享主机文件系统给容器使用

如何共享主机文件系统给容器使用

作者头像
博文视点Broadview
发布2020-06-11 17:50:38
2K0
发布2020-06-11 17:50:38
举报

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

  • 数据卷

数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。当做持久化时,通常数据卷都会比较大,可以将其放在单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。当做数据共享时,可以用于开发和测试分布式系统,如需要用到共享盘、处理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 命令不会将改动保存到镜像中;
  • 即使容器被删除了,数据卷仍然存在,因此这一块需要特别注意,避免产生垃圾数据卷。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档