问题 如何保存Docker容器状态


我正在尝试学习Docker的细节,我对保存图像的前景感到困惑。

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

这些似乎都与VirtualBox的工作方式相同,VirtualBox为您的虚拟机提供了明显的保存状态文件。


6132
2018-06-11 05:40


起源



答案:


通常的方法是至少通过一个 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

之后, 如果您已部署注册表服务器,您可以将图像推送到所述服务器。


12
2018-06-11 06:05



虽然这样可行,但这种方法被Docker社区认为是不好的做法。最好的方法是使用Dockerfile。 - AnchovyLegend
@AnchovyLegend我同意并编辑了答案以包含您的评论并明确说明。 - VonC
dockerfile重现了程序的安装,但是如果你然后在数据库中加载数据,那么dockerfile将不会以任何方式保存该状态吗? - chrismarx
@chrismarx它可能,但不应该使用图像来存储将在运行时像数据库一样更改的信息。应通过卷访问所述信息。 - VonC
是的,我认为这是正确的生产方式。但是我们中的许多人只是在本地使用docker作为虚拟盒的缩小版本,并且只是希望该死的状态保存完全一样。并且不希望我们的本地驱动器上有额外的卷 - chrismarx


答案:


通常的方法是至少通过一个 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

之后, 如果您已部署注册表服务器,您可以将图像推送到所述服务器。


12
2018-06-11 06:05



虽然这样可行,但这种方法被Docker社区认为是不好的做法。最好的方法是使用Dockerfile。 - AnchovyLegend
@AnchovyLegend我同意并编辑了答案以包含您的评论并明确说明。 - VonC
dockerfile重现了程序的安装,但是如果你然后在数据库中加载数据,那么dockerfile将不会以任何方式保存该状态吗? - chrismarx
@chrismarx它可能,但不应该使用图像来存储将在运行时像数据库一样更改的信息。应通过卷访问所述信息。 - VonC
是的,我认为这是正确的生产方式。但是我们中的许多人只是在本地使用docker作为虚拟盒的缩小版本,并且只是希望该死的状态保存完全一样。并且不希望我们的本地驱动器上有额外的卷 - chrismarx


使用Docker文件来实现这些场景。

使用MongoDB的Ubuntu映像的示例:

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"]

另见 编写Dockerfiles的最佳实践


0
2017-12-20 08:08