如何保存Docker容器状态

hob*_*777 35 docker

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

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

这些似乎都与VirtualBox的工作原理相同,VirtualBox为您的虚拟机提供了一个明显的保存状态文件.

Von*_*onC 42

通常的方法是至少通过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
Run Code Online (Sandbox Code Playgroud)

之后,如果已部署注册表服务器,则可以将映像推送到所述服务器.

  • 是的,我认为这是正确的生产方式.但是我们中的许多人只是在本地使用docker作为虚拟盒的缩小版本,并且只是希望该死的状态保存完全一样.并且不希望我们的本地驱动器上有额外的卷 (14认同)
  • @AnchovyLegend我同意,并已编辑答案以包含您的评论并明确说明。 (3认同)
  • @chrismarx 可能,但不应使用图像来存储将在运行时更改的信息(如数据库)。应该通过卷来访问所述信息。 (3认同)
  • @Nathan 根据该容器中运行的进程访问的数据的性质,首先停止容器更为明智。 (3认同)
  • 我向 docker 团队表示诚挚的歉意,但我坚持使用“docker commit”和“docker save”。这就是我所需要的。谢谢。 (3认同)
  • 尽管这可行,但Docker社区认为这种方法是不好的做法。最好的方法是使用Dockerfile。 (2认同)
  • 虽然我已经知道这被认为是不好的做法,但我发现它对于将我刚刚在一个小型(3h)研讨会中所做的事情保持在我很快在容器中旋转的某些软件上非常有用。 (2认同)

Sha*_*han 7

通常的方法至少是通过 docker commit:这会将容器的状态冻结到新映像中。

但要知道,与 Hyper-V 或 VMware 中的虚拟机保存状态不同,没有可靠的方法来“保存容器状态”。这对 docker 来说也是一个缺点。

看来它只保存对持久文件更改所做的更改。因此,当您从新映像再次启动容器时,依赖项和执行的所有运行命令将不会产生相同的效果。

这就是为什么必须更改 docker 文件的原因,简而言之,docker 系统中没有像虚拟机中那样的保存状态功能。记忆内容总是会丢失。


小智 5

在此类情况下使用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"]
Run Code Online (Sandbox Code Playgroud)

另请参阅编写Dockerfile的最佳实践

  • 投了反对票,因为这没有回答问题。此外,当重新加载映像时,对该映像的 mongodb 数据库所做的所有更改都将丢失。 (18认同)

ahm*_*l88 5

使用命令是可能的(但不推荐docker commit) 。
您可以检查以下清晰的示例:
https ://phoenixnap.com/kb/how-to-commit-changes-to-docker-image

  • 我不能。有人写了一些愚蠢的东西。另一个人要求我使用它。 (4认同)