如何保存 Docker 容器的状态

142

我正在尝试学习Docker的各个方面,但对于保存镜像的前景感到困惑。

我运行了基本的Ubuntu镜像,安装了Anaconda Python和其他一些东西...现在最好的保存进度的方法是什么?保存、提交、导出?

这些方法似乎都不能像VirtualBox那样工作,后者为您的虚拟机提供明显的保存状态文件。

4个回答

170
通常的方式至少是通过 docker commit:这将把您的容器状态冻结到一个新镜像中。
注意:正如 评论所述anchovylegend,这不是最佳实践,使用 Dockerfile 允许您正式建模镜像内容并确保您可以重建/复制其初始状态。
然后,您可以使用 docker images 在本地列出该镜像,并再次运行它。
例如:
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS              NAMES
c3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            desperate_dubinsky
197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            focused_hamilton

$ docker commit c3f279d17e0a  svendowideit/testimage:version3

f5283438590d

$ docker images

REPOSITORY                        TAG                 ID                  CREATED             SIZE
svendowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB

在此之后,如果您已经部署了注册服务器,您可以将您的镜像推送到该服务器。

7
虽然这个方法可以工作,但是Docker社区认为这种做法是不良实践。最好的方式是使用Dockerfile。 - AnchovyLegend
10
@AnchovyLegend,我同意并已编辑答案,以包括您的评论并使其更清晰。 - VonC
87
是的,我认为这是生产中正确的方法。但我们中的许多人仅将Docker用作VirtualBox的简化版本,并且希望保存原样的状态,就像现在一样。而且我们也不想在本地驱动器上增加额外的卷。 - chrismarx
10
虽然我已经知道这被认为是不好的做法,但我刚刚发现在保持我在一个小(3小时)的软件研讨会上所做的事情方面非常有用,而我已经快速地在容器中设置了一些软件。 - Michael P
3
我向 Docker 团队表示最诚挚的歉意,但我仍然坚持使用 docker commitdocker save。这就是我所需要的。谢谢。 - FractalSpace
显示剩余6条评论

7
通常情况下,至少要通过 Docker commit 来实现:这将会把你的容器状态冻结到一个新镜像中。
但是需要知道,与 Hyper-V 或 VMware 中虚拟机保存状态的可靠方式不同,在容器中没有可靠的“保存状态”的方法。这也是 Docker 的一个缺点。
看起来它只保存对持久文件所做的更改。因此,当你从新镜像再次启动容器时,依赖关系和所有运行命令的执行效果都不同。
这就是为什么最好在 Docker 文件中进行更改,总之,Docker 系统中没有像虚拟机中那样的保存状态功能。内存内容总是丢失的。

5

我有一个情况必须使用commit;因为我的系统无法完全脚本化。你需要进去并按下一堆按钮才能将其置于正确状态。我必须处理这种情况。 - Rob
@Rob 我完全理解你的情况,但在一个理想的 DevOps 自动化环境中,尽可能避免 手动干预 是更好的选择。 - Ahmed Nabil
4
我不能这样做。有人写了一些愚蠢的东西,另一个人要求我使用它。 - Rob
因此,您可以通过手动将容器置于所需状态并提交来自动化该过程。 - Rob
发布指向可能在未来被删除的博客的链接并不是一个理想的答案。最好在此处提供您的答案的实际细节。 - lacostenycoder

-2

针对这些情况,请使用Docker文件。

一个Ubuntu镜像与MongoDB的示例案例:

FROM ubuntu
MAINTAINER Author name

RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist    10gen" | tee -a /etc/apt/sources.list.d/10gen.list
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y install mongodb-10gen

#RUN echo "" >> /etc/mongodb.conf

CMD ["/usr/bin/mongod", "--config", "/etc/mongodb.conf"]

还可以参考Dockerfile编写最佳实践


24
因为这个回答并没有解答问题,所以被踩了。此外,在该镜像上对 MongoDB 数据库所做的任何更改都将在重新加载镜像时丢失。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接