shell – 克隆/快照Docker容器的脚本,包括它们的数据?

我想克隆一个dockerized应用程序,包括它的所有数据,在这个例子中使用三个容器:1)一个Web应用程序容器,如CMS,2)数据库容器和3)数据卷容器(使用docker卷) .

使用docker-compose,我可以轻松地使用初始数据创建这些容器的相同实例.但是,如果我想在同一台服务器上克隆一组正在运行的容器,包括它所有的累积数据,那就像我克隆一个KVM容器一样?使用KVM,我会暂停或关闭VM,使用virt-clone之类的东西进行克隆,然后启动克隆的guest虚拟机,该guest虚拟机具有与原始数据相同的所有数据.

一个用例是在进行重大更改之前或安装新版本的插件之前创建正在运行的开发Web服务器的克隆/快照.

使用Docker,这似乎并不那么简单,因为数据不会自动与其容器一起复制.理想情况下,我想做一些简单的事情,比如docker-compose clone,最后得到第二组与第一组相同的容器,包括所有数据. Docker和docker-compose都没有提供克隆命令(从版本1.8开始),因此我需要考虑各种方法,例如备份和安装.恢复数据/数据库或使用像Flocker这样的第三方工具.

与此相关的问题是如何执行与dockerized app的KVM快照类似的操作,并能够轻松返回到先前的状态.优选地,克隆,快照和恢复应该是可能的,具有最小的停机时间.

什么是Docker完成这些事情的首选方式?

编辑:基于第一个答案,我将使我的问题更具体一些,以便有希望达到程序化步骤,以便能够使用bash或python脚本执行诸如docker-compose-clone和docker-compose-snapshot之类的操作.克隆docker卷的内容似乎是关键,因为每次在同一个yaml文件上运行docker-compose时,容器本身都会被克隆.

通常我的完整克隆脚本需要

>复制包含docker-compose文件的目录
>暂时停止容器
>创建(但不一定要运行)第二组容器
>确定要复制的数据量
>备份这些数据卷
>将数据卷还原到克隆的数据容器中
>启动第二组容器

>这是正确的方法,我该如何实现?我特别不确定如何在脚本中执行步骤4(确定要复制的数据卷),因为命令docker volume ls将仅在Docker 1.9中可用.
>如何使用此方法执行与KVM快照类似的操作? (可能使用ZFS的COW文件系统功能,我的Docker已经安装了).

最佳答案
使用docker,您可以将所有状态保持在卷中.只要重新使用相同的卷(来自主机或数据卷容器),就可以从映像重新创建容器.

我不知道从数据卷容器中导出卷的简单方法.我知道docker 1.9版本将添加一些顶级apis来与卷进行交互,但我不确定导出是否会立即可用.

如果您正在使用主机卷,则可以从docker外部管理状态.

转载注明原文:shell – 克隆/快照Docker容器的脚本,包括它们的数据? - 代码日志