容器学习 之 docker存储(十五)

Docker 为容器提供了两种存放数据的资源:

  1. 由 storage driver 管理的镜像层和容器层。
  2. Data Volume。

storage driver

Docker分层结构

image

storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。

Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。Docker
优先使用 Linux 发行版默认的 storage driver。

运行docker info查看 Ubuntu 的默认 driver:

image

Ubuntu 用的 AUFS,底层文件系统是 extfs,各层数据存放在 /var/lib/docker/aufs。

对于某些容器,直接将数据放在由 storage driver 维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。但对于另一类应用这种方式就不合适了,它们有持久化数据的需求,容器启动时需要加载已有的数据,容器销毁时希望保留产生的新数据,也就是说,这类容器是有状态的。

这就要用到 Docker 的另一种存储机制:

Data Volume

Data Volume 有以下特点:

  1. Data Volume 是目录或文件。
  2. 容器可以读写 volume 中的数据。
  3. volume数据可以被永久的保存,即使使用它的容器已经销毁。

docker 提供了两种类型的 volume:bind mount 和 docker managed volume

bind mount

bind mount 是将 host 上已存在的目录或文件 mount 到容器。

例如 docker host 上有目录 $HOME/htdocs:

root@ubuntu:~/htdocs# cat index.html 
this is a file in host file system

通过 -v 将其 mount 到 httpd 容器:

root@ubuntu:~/htdocs# docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd
8940a1cf3724e03583c4eac7dca0380c368cf4c75763913f3353b57ae1f23050

/usr/local/apache2/htdocs 就是 apache server 存放静态文件的地方。由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据。

root@ubuntu:~/htdocs# curl 127.0.0.1:80
this is a file in host file system

curl 显示当前主页确实是 $HOME/htdocs/index.html 中的内容。更新一下,看是否能生效:

root@ubuntu:~/htdocs# echo "update index page in mypage" > ~/htdocs/index.html
root@ubuntu:~/htdocs# curl 127.0.0.1:80
update index page in mypage

host 中的修改确实生效了,bind mount 可以让 host 与容器共享数据。这在管理上是非常方便的。

下面我们将容器销毁,看看对 bind mount 有什么影响:

root@ubuntu:~/htdocs# docker stop 8940a1cf3724
8940a1cf3724
root@ubuntu:~/htdocs# docker rm 8940a1cf3724
8940a1cf3724
root@ubuntu:~/htdocs# cat ~/htdocs/index.html 
update index page in mypage

mount point 有很多应用场景,比如我们可以将源代码目录 mount 到容器中,在 host 中修改代码就能看到应用的实时效果。再比如将 mysql 容器的数据放在 bind mount 里,这样 host 可以方便地备份和迁移数据。

不过bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。

docker managed volume
 docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd
f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340

我们通过 -v 告诉 docker 需要一个 data volume,并将其 mount 到 /usr/local/apache2/htdocs。那么这个 data volume 具体在哪儿呢?

这个答案可以在容器的配置信息中找到,执行 docker inspect 命令:

docker inspect 21accc2ca072

"Mounts": [

    {

        "Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340",

        "Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data",

        "Destination": "/usr/local/apache2/htdocs",

        "Driver": "local",

        "Mode": "",

        "RW": true,

        "Propagation": ""

    }

]

每当容器申请 mount docker manged volume 时,docker 都会在/var/lib/docker/volumes 下生成一个目录(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),这个目录就是 mount 源。

root@ubuntu:~/htdocs# cd /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# ls
index.html
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# cat index.html 
<html><body><h1>It works!</h1></body></html>

修改host的这个挂载的文件试一试:

7f33c5acf5edc77c4674/_data# echo "update valumn form host !" > /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/index.html 
root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# curl 127.0.0.1:80
update valumn form host !

简单回顾一下 docker managed volume 的创建过程:

  1. 容器启动时,简单的告诉 docker “我需要一个 volume 存放数据,帮我 mount 到目录 /abc”。
  2. docker 在 /var/lib/docker/volumes 中生成一个随机目录作为 mount 源。
  3. 如果 /abc 已经存在,则将数据复制到 mount 源,
  4. 将 volume mount 到 /abc
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值