聂永的博客

记录工作/学习的点点滴滴。

Docker学习笔记之三,有关状态的记录

Docker文件系统

Docker的文件系统AUFS,一种“增量文件系统”,用户所做修改以增量的方式保存,决定了其分层存储特性。

docker文件系统

多层的文件系统

最顶层为读写层,初始将无内容,后续创建文件将会保存于此。若依赖层(亦即较低层)需要更新文件,那么更新后的文件将被保存在最顶层。总之,除了最顶层,所有底层都不可写。较低层总是被其它镜像共享。总之,Docker仅仅需要记录最顶层容器所有改变即可,这部分可以做到版本更迭、增量式存储,设计思路很赞!

Docker如何持久化状态

其实,我很关心Docker运行中的容器实例,如何保存状态。

运行中的Docker容器实例首先会在当前内存中持有一些状态信息,其次文件系统都会发生或多或少的改变。当前Docker能够支持哪些持久化,下面一一列出。

  1. 容器实例因意外出现退出,如何持久化这种情况,人为使用 'docker commit',也是不错的方法。但有人提出了更好的方式,通过捕捉退出信号,不妨一试。

    trapping signal from “docker stop” in bash

    docker-exec项目

  2. 容器实例的挂起/恢复当前Docker不支持容器的挂起/恢复操作,但可参考一下原生的LXC内置命令lxc-freeze/lxc-unfreezeCRIU(http://criu.org/Main_Page):

    consider a docker suspend and resume

    Can I suspend and then resume Docker container?

    目前最期待Docker和CRIU的整合工作有待进展,可能会促进Docker商业化更进一步。

  3. 挂载宿主机目录 Docker支持挂载宿主机目录,支持宿主机目录和容器之间文件目录进行映射,彼此共享:

    docker run -i -t -v /host/dir:/container/path ubuntu /bin/bash
    

    在Dockerfile中,则可以使用'VOLUME'命令

    VOLUME ["/var/volume1", "/var/volume2"] 
    
  4. 如何在容器之间共享存储 容器之间文件目录(数据卷)可分享、重用,主要借助于'-volumes-from'参数实现。

    COUCH1=$(sudo docker run -d -v /var/lib/couchdb shykes/couchdb:2013-05-03)
    COUCH2=$(sudo docker run -d -volumes-from $COUCH1 shykes/couchdb:2013-05-03)
    

    这个特性,可引入很大的想象空间。若,一个Container实例用于Web存储,另外两个实例负载用于处理应用请求,分分离离,降低耦合。

  5. 镜像导入/导出构建的镜像,作为一种状态存在,支持很方便的导入导出。导出:

    docker save IMAGENAME | bzip2 -9 -c>img.tar.bz2
    

    导入镜像:

    bzip2 -d -c <img.tar.bz2 | docker load
    

小结

目前Docker对运行中容器内存状态持久化不支持,仅限于文件层面的持久化支持等。通过挂载宿主机目录,把变化部分mount过来即可,减少docker commit次数,实现动静态分离。

更多信息,可参考:Share Directories via Volumes

posted on 2013-12-29 13:36 nieyong 阅读(14953) 评论(5)  编辑  收藏 所属分类: 容器

评论

# re: Docker学习笔记之三,有关状态的记录 2013-12-31 14:53 goxplanet

docker官网为什吗没有看到save指令那?您用的na'g哪个版本?  回复  更多评论   

# re: Docker学习笔记之三,有关状态的记录 2013-12-31 15:42 nieyong

@goxplanet
更新到最新版吧。
Usage: docker save IMAGE
Save an image to a tar archive (streamed to stdout)  回复  更多评论   

# re: Docker学习笔记之三,有关状态的记录 2014-02-12 17:21 zacker330@gmail.com

你好。
我启动一个容器后,容器会启动一个web项目,web项目会保存一些信息在容器内的磁盘里。

然后,我想把这个容器的状态保存下来,意思就是说web项目的状态也被保存下来。

我已经可以做到保存为tar文件了。

现在我想做的就是想把这个tar的内容push到docker的中央仓库去。

谢谢。  回复  更多评论   

# re: Docker学习笔记之三,有关状态的记录 2015-05-14 18:40 sofia

VOLUME ["/var/volume1", "/var/volume2"]
这个有实例吗?我使用 VOLUME ["/dir1", "/dir2"] 并不能生效呢   回复  更多评论   

# re: Docker学习笔记之三,有关状态的记录 2016-05-27 11:03 xawi2000

新版本的docker已经有挂起和恢复命令了吧  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

所有文章皆为原创,若转载请标明出处,谢谢~

新浪微博,欢迎关注:

导航

<2013年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(58)

随笔分类(130)

随笔档案(151)

个人收藏

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜