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

时间:2015-02-18 01:31:17

标签: docker containers lifecycle

这是一个非常基本的问题,但我有点挣扎,并希望确保我理解得恰到好处。

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

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

谢谢, 儒略

2 个答案:

答案 0 :(得分:48)

  

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

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

$ 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>
/ #

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

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

您可以使用docker commit命令将容器的内容保存到新图像中,然后您可以使用该图像启动新容器或与其他人共享等。但是,请注意,如果您经常使用docker commit发现自己可能会对自己造成伤害。通常,将容器视为只读并使用Dockerfile和docker build生成新映像更易于管理。

使用此模型,数据通常保留在容器外部, 通过主机卷安装或使用仅数据容器。

答案 1 :(得分:12)

您可以使用docker ps -a

查看已完成的容器

您可以使用docker commit container_name new_image_name

将已完成文件系统更改的已完成容器保存到图像中

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

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

 docker run -v /dir/on/host:/dir/on/container -it ubuntu:14.04