Docker官方论坛中回复最多的一个帖子“在数据容器内升级数据”
matlehmann
我有一个含数据的容器,它有一个卷(比如在/var/data)中的持久性数据。该容器包含持久性数据对另一个容器的软件。
对于该软件的新版本,需要升级所述永久数据(结构或布局改变等)。其结果是,我想与在相同的位置已升级的数据的另一数据容器(在/var/data)和仍保留旧数据容器与它的数据不变。
这样一来,我可以用旧的数据容器与旧版本的软件,万一出了差错。
但是,我怎么能做到这一点?以实现所期望的结果所需要的步骤对我来说是不明显的。
我可以运行一个命令来升级容器像docker run -i -t --name temp --volumes-from data -v /upgraded image /upgrade_script.sh
但后来,我怎么将升级的数据恢复到原来的位置而没有覆盖旧的数据?如果我运行docker run -i -t --volumes-from temp image cp /upgraded /var/data,它将覆盖我的旧数据。我必须使用主机安装的卷为升级的数据,或者是有一些更好的解决方案?
sam
只是猜测,因为这里一般我更喜欢使用直主机安装卷和我苦苦寻找数据容器的效用。
但是......你能不能提交你的数据容器,然后保存映像等?
sven
哦,也请考虑使用docker commit快照容器SAM的建议迷死人了
keeb
我实际使用的数据容器,如UNIX管道;我觉得他们适合更自然在范式
docker run -name some_pipe_storage some_container_which_generates_data
docker run --volumes-from some_pipe_storage something_that_operates_on_data
语法,相当繁琐。非常强大却比较原始。
sven
有一些有趣的工作,关于加入卷的管理工具docker是怎么回事 - 我认为他们是前往1.4,我会做一些调查。 (有将是一个docker卷列表和操纵的东西)
我可能会做一个backup_data卷的容器中,然后运行一个数据迁移的形象,我想运行连接到数据和backup_data - 它可能做的第一件事是复制了从数据到backup_data,然后它会做的数据迁移。
然后你就可以运行旧的和新的,连接到每个各自databackend(与可能附着只读的备份?)
这样做,如果你使用的主机安装的应几乎是一样的,无论是直接或通过数据容器的风格代表。
matlehmann
您的建议是我的第一个想法行,但它并不符合我的预期,因为该过程后,迁移数据和原始数据将根据不同的路径,我看不出有什么办法改变这种状况,因为非主机卷不能被重新安装到不同的路径。从一个数据容器的体积的路径是静态的 - 即使对于由“--volumes-from”继承卷容器。
这是主机体积不同,因为我可以在每个docker运行调用改变这些的挂载位置。
我认为这些卷管理工具,你说说是非常必要的。对于我来说,这个数据容器docker成语感觉更像是一个变通。
请问您在阐述“docker commit迷死人了”,因为我看不到它,然而。至少在用例在手。据我所知,一个docker提交给我,其中包含一个容器的当前状态的新形象。这样将包括除持久数据我感兴趣的所有OS数据。
sven
哦crud。你说得对,卷路径是目前静态的。所以你需要一个步骤
1.你有在/数据中的现有的数据容器
2.迁移到位于/迁移的临时数据容器(如你有原始安装)
3./迁移数据迁移到安装在新升级的数据容器/数据(第二迁移映像就不需要原来的数据容量装
@ cpuguy83也许能告诉你更多关于新工具的微笑
WRT docker commit - 当你commit,你是不是在一个单一的包含图像层的一切,你正在做一个新的图像层,包含所有容器中所做的更改(与图像容器启动时使用)。
所以,如果你使用的容器,而不是卷的持久性数据和卷掉之类的东西日志,你可以使用docker承诺快照/备份只是你的持久性数据 - 和docker的出口可能让你存储这些层。
cpuguy83
是啊,我不会信赖“commit”,因为你将被限制在127提交的,除非你拼合映像出来。
@matlehmann看到github.com/cpuguy83/docker-volumes
这离完美的解决方案还远着呢,但在此期间工作相当不错
matlehmann
@Sven感谢您的答复,并了解更多信息。我还是不明白第3步的“/迁移数据迁移到安装在/数据的新升级的数据容器(第二次迁移映像就不需要原来的数据容量装”,因为它目前是(与docker1.2和无特殊卷命令),我不看我怎么可以有一个容器与另一个容器体积 - 他们的一部分安装的,其中一部分没有安装就我所看到的,它要么全有或全无,要么以"--volumes-from other_container"或没有。因此,如果迁移容器from步骤2具有原始数据装入,该容器在步骤3它已安装,也因此在复制操作从 /mifrated到/data将覆盖原始数据。还是我失去了一些东西?
有关“commit”命令谢谢您的提示,我需要思考这个多一点准备。
matlehmann
@keeb这是一个很好的模式,但据我看到的,它并没有解决这个问题,我在说什么。所有这些“管道”容器仍然会以“some_pipe_storage”的体积而不能创建一个不同的容器中,在一个给定的路径不同的数据,而不会覆盖原有的数据。但是,也许我想念你的观点?
sven
嗯,让我们看看,如果我能作出这样的解释是一个例子:
假设有人已经创造了一些Docker 映像,webappv10,webappv11,webapp_migratorv10_to_v11。
最初,你会已经运行的基于1.0系统
docker run -v /data --name datav10 busybox true
docker run -p 80:80 --volumes-from datav10 --name webv10 webappv10
然后升级,要求你的数据给我升级了,你会做第2步(正如你指出,我们不能有两个卷在相同目录)
docker run -v /migration --name datav10-to-v11 busybox true
docker run --volumes-from datav10-to-v11 --volumes-from datav10 --name migration webapp_migratorv10_to_v11
然后步骤3,对复制的数据迁移到一个新的数据容器,在/数据目录中的数据,准备使用
docker run -v /data --volumes-from datav10-to-v11 --name datav11 busybox cp -r /migration /data
然后运行1.1版Web应用程序
docker run -p 80:80 --volumes-from datav11 --name webv11 webappv11
而额外的信用,你最好脚本化这一切。
更新到datav10到V11卷容器一步增加是由于下面的讨论
matlehmann
@sven 再次感谢您详细的解答。我很欣赏你的思想和时间。
但是,您勾勒的程序不起作用。它叫装有“-v”卷推翻一个体积继承“"--volumes-from”同一路径的假设。我刚再次测试它,以确保,但这种情况并非如此。这就是为什么docker run -v /data --volumes-from migration --name datav11 busybox cp -r /migration /data将覆盖我的原始数据的容器datav10。
sam
它有你喜欢一个数据容器在一个简单卷一个特别的原因(也就是更容易通过感觉意会/处理)
sven
我很困惑。精心制作的步骤,以便有永不2卷从包含/数据迪尔斯语句。我们使用迁移一个缓冲区,然后我们将其复制到新的数据V11容器。
@sam - 有一个绑定安装的量和体积容器之间这么一点概念上的差异 - 你还在做同样的3个步骤 - 对我来说最大的区别是,绑定坐骑只能在本地,并且假设你有磁盘空间为它(不是我做的),而体积容器方法假定您Docker ,数据分区是大到足以运行Docker 的容器,和作品一样的本地远程。
如果你改变了docker run -v /data ... lines to docker run -v /local/data:/data ..., 那么你使用bind mounts绑定安装,代表。
matlehmann
@SAM我现在切换到使用bind-mounted 绑定安装的(或任何官方用语是"-v /host:/container") 卷,而不是使用数据容器,因为在这个线程中列出的缺点。我开始使用数据容器,因为成语的使用和推荐的所有在互联网上,似乎是“官方方式”。
matlehmann
@sven
?"datav10" has ?"/data" (via -v /data)
?"migration" has ?"/data" (via --volumes from datav10)
?"/migration" (via `-v /migration‘)
?"datav11" has ?"/data" (via -v /data)
?"/migration" (via --volumes from migration)
?"/data" (via --volumes-from migration)
因此,我们有“/data”容器“datav11”两卷定义 - 对我来说它看起来就像从--volumes-from 胜利之一。
sam
@sven我想我只是在努力找出你将存储在AUFS数据的原因,这似乎是一种错误的文件系统用于这个问题。 BTRFS将是确定的,但似乎aufs的日志文件,一个奇怪的选择,Postgres数据库用的等等。我误解数据容器的机制?
@matlehmann我们用“卷”广泛。
?我们店外容器的主机安装卷,便于旋转和持久性的所有日志。 (这里是另一种选择是将流出来的容器,但机制是不平凡的,想想说的NGINX的容器,你用日志呢?)
?我们存储一些配置一个安装GlusterFS卷上,所以我们能吸收的东西横跨农场
matlehmann
@sven这将是另一个线程的话题:我真的很希望听到你的GlusterFS设置。有没有准备好使用可用的映像,可以作为GlusterFS内像一个代表卷或你怎么做呢?
sam
@supermathie将是最适合我们的GlusterFS设置的详细信息,但它是在一个非常传统的方式,所有的设置,我们不使用受信任的docker容器上电Gluster的。
sven
OH(*&^,你说得对。
我想我是如此聪明删除一步。
你需要把/迁移文件夹到自己的数据容器,这样就可以避免你在最后一步注意的问题。
我已经更新一步的例子步骤,以反映这一
sven
是的,有一些东西WRT文件系统待解决 - 我docker的大多是BTRFS运行。
我认为,使用绑定,安装工程量太 - 但我仍然会做链接到它们,然后使用相同的过程,以上数据体积的容器。
matlehmann
@sven谢谢。我没有尝试这个,但它是有道理的。这是一个尴尬的疯狂鸡起舞,但它可能工作...翘首等待的卷命令。
sven
是的,我专注在笨拙的鸡 - 期待与这些版本,和烤鸡腿来馋嘴
本文翻译自Docker官方论坛:https://forums.docker.com/t/upgrade-data-within-data-container/205/20