docker容器是否保留文件更改?

Jul*_*uti 35 lifecycle containers docker

这是一个非常基本的问题,但我有点挣扎,并希望确保我理解正确.

从映像启动容器并对其中的文件进行一些更改后(即:存储在容器上运行的WebApp的数据库中的某些数据),在容器停止和重新启动之间继续使用相同日期的适当方法是什么?

我的理解是正确的,一旦容器停止/完成(即:在交互式会话后退出),那么该容器与所有文件更改一起消失了吗?因此,如果我想保留一些文件更改,我必须将容器的状态提交到图像的新图像/新版本中?

谢谢,朱利安

lar*_*sks 55

我的理解是正确的,一旦容器停止/完成(即:在交互式会话后退出),那么该容器与所有文件更改一起消失了吗?

不,一个容器在退出后仍然存在,除非你使用--rm参数启动它docker run.考虑一下:

$ docker run -it busybox sh
/ # date > example_file
/ # exit
Run Code Online (Sandbox Code Playgroud)

由于我们exit编写了shell,因此容器不再运行:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
Run Code Online (Sandbox Code Playgroud)

但如果我们有-a选择权,我们可以看到它:

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS                   NAMES
79aee3e2774e        busybox:latest      "sh"                About a minute ago   Exited (0) 54 seconds ago                           loving_fermat       
Run Code Online (Sandbox Code Playgroud)

我们可以重新启动它并重新连接到它:

$ docker start 79aee3e2774e
$ docker attach  79aee3e2774e
<i press RETURN>
/ #
Run Code Online (Sandbox Code Playgroud)

我们之前创建的文件仍然存在:

/ # cat example_file
Wed Feb 18 01:51:38 UTC 2015
/ #
Run Code Online (Sandbox Code Playgroud)

您可以使用该docker commit命令将容器的内容保存到新映像中,然后可以使用该映像启动新容器或与其他人共享等.但是,请注意,如果您发现自己经常使用docker commit,则可能正在执行此操作你自己是一个伤害.通常,将容器视为只读并使用Dockerfile生成新映像更易于管理docker build.

使用此模型,数据通常通过主机卷装入或使用仅数据容器保存在容器外部.

  • *facepalm* 我正在使用 --rm (!!!) - 太多的 google-paste 错误。我知道这是一个愚蠢的问题。 (2认同)
  • 无论如何,非常感谢您的详尽解释。现在,整个模型对我来说意义更大。就我而言,我打算在容器外部使用尽可能多的数据,并通过主机卷挂载进行安装。仅偶尔需要修改容器以安装某些内容。有了这一澄清,我现在可以简单地让容器成为一个容器,并在值得与其他开发人员共享时偶尔将其提交到新映像。再次感谢,很棒的答案! (2认同)
  • 如果您杀死容器“79aee3e2774e”,当您使用相同的图像启动一个新容器时,该文件是否仍然存在? (2认同)

Pau*_*aul 14

你可以看到成品容器 docker ps -a

您可以使用文件系统更改将已完成的容器保存到图像中 docker commit container_name new_image_name

您还可以使用以下方法从完成的容器中提取数据文件: docker cp containerID:/path/to/find/files /path/to/put/copy

请注意,您还可以"提前计划",并通过让容器从主机安装目录来避免在临时容器中永久捕获您需要的数据,例如

 docker run -v /dir/on/host:/dir/on/container -it ubuntu:14.04 
Run Code Online (Sandbox Code Playgroud)