我如何使用" git-like" Docker的功能?

时间:2014-08-15 23:24:30

标签: docker dockerhub

我特别感兴趣的是如何从docker运行或回滚到特定版本的(二进制)图像,并试图澄清这个问题。

Docker FAQ它说:

  

Docker包括类似git的功能,用于跟踪容器的连续版本,检查版本之间的差异,提交新版本,回滚等。历史记录还包括容器的组装方式和由谁组装,因此您可以从中获得完整的可跟踪性生产服务器一直回到上游开发者。

谷歌我可以,我找不到“回滚”到早期容器的例子,检查差异等等。(显然我可以为版本管理的Dockerfiles做这样的事情,但二进制Docker镜像/容器可以改变即使Dockerfile没有,由于更新的软件源,我正在寻找一种方法来查看和回滚这些变化)。

一个基本的例子:想象一下我跑

docker build -t myimage .

在只更新基础ubuntu的Dockerfile上:

FROM ubuntu:14:04
RUN apt-get update -q && apt-get upgrade -y

如果我在几天后构建相同的图像,我如何区分这些图像以查看哪些包已升级?在以后重新运行相同的构建命令后,如何回滚到映像的早期版本?

2 个答案:

答案 0 :(得分:12)

从技术上讲,我们只是回滚AUFS层,不一定回滚历史。如果我们的工作流程包括以交互方式修改我们的容器并使用docker commit提交更改,那么这确实会回滚历史记录,因为它会删除我们在以后的层中应用的任何包更新,而是将版本安装在较早的层中。如果我们从Dockerfile重建图像,这是非常不同的。那么这里没有任何东西让我们回到我们构建的先前版本,我们只能从Dockerfile中删除步骤(图层)。换句话说,我们只能将docker commit s的历史记录回滚到图像中。

回滚到早期版本的docker镜像似乎只是将docker标记指向较早的哈希值。

例如,请考虑检查标准history图片的ubuntu:latest

docker history ubuntu:latest

节目:

IMAGE               CREATED             CREATED BY                                      SIZE
ba5877dc9bec        3 weeks ago         /bin/sh -c #(nop) CMD [/bin/bash]               0 B
2318d26665ef        3 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.903 kB
ebc34468f71d        3 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          8 B
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago    

                                               0 B

想象一下,我们想要回到哈希25f指示的图像:

docker tag 25f ubuntu:latest
docker history ubuntu:latest

我们看到了:

IMAGE               CREATED             CREATED BY                                      SIZE
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago                                                       0 B

当然,我们可能永远不想以这种方式回滚,因为它使ubuntu:latest实际上不是我们本地库中最新的ubuntu。请注意,我们可以使用我们想要的任何标记,例如

docker tag 25f ubuntu:notlatest

或者只是通过哈希启动旧图像:

docker run -it 25f /bin/bash

如此简单而又如此整洁。请注意,我们可以将其与docker inspect结合使用,以获得有关Docker常见问题所涉及的每个图像的元数据的更多详细信息。

另请注意,docker diffdocker commit与此过程无关,因为它们指的是容器(例如运行图像),而不是直接指向图像。也就是说,如果我们以交互方式运行图像然后在图像上添加或更改文件,我们可以使用docker diff <Container-id>查看更改(在容器之间)并使用docker commit <Container id>提交更改。

答案 1 :(得分:0)

我不确定你是否真的可以将哈希用作标记。哈希IIRC是对图像本身的引用,而标记更像是图像上的元数据字段。

标签功能imho的记录非常糟糕,但您应该使用它的方式可能是使用semantic versioning种类来组织您的标签和图像。我们正在将一个复杂的(12微服务)系统转移到使用Docker并依赖于latest我很快就会在Git Repo中做一些像语义版本控制和更改日志这样的事情来跟踪变化。

如果你说,拥有一个docker分支可以自动进行更改并触发DockerHub上的构建,那么这也是很好的 - 你可以更新一个更改日志并知道哪个哈希/时间戳与什么相关。

就个人而言,DockerHub构建触发器目前很慢,我更喜欢手动为每个图像声明一个标签并保留更改日志,但YMMV和我怀疑这些工具会更好。