docker容器保留文件更改吗?

这是一个非常基本的问题,但我正在努力一点,希望确保我理解正确。

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

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

谢谢,朱利安

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

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

 $ docker run -it busybox sh / # date > example_file / # exit 

由于我们exit了我们的shell,容器不再运行:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 

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

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

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

 $ docker start 79aee3e2774e $ docker attach 79aee3e2774e <i press RETURN> / # 

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

 / # cat example_file Wed Feb 18 01:51:38 UTC 2015 / # 

您可以使用docker commit命令将容器的内容保存到一个新的映像中,然后您可以使用这个映像启动新的容器,或与其他人共享等等。但是,请注意,如果您发现自己经常使用docker commit你可能是在破坏自己。 一般来说,将容器视为只读并使用Dockerfile和docker docker build生成新映像是更易于pipe理的。

使用此模型, 数据通常保存在容器的外部,可以通过主机卷安装或使用数据专用容器。

您可以使用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