这是一个非常基本的问题,但是我有点挣扎,想确保自己理解正确。
从图像启动容器并对其中的文件进行了一些更改(即:一些数据存储在容器上运行的WebApp的数据库中之后),在容器停止和停止之间继续使用相同数据的合适方法是什么?重新启动?
我的理解是正确的,一旦容器停止/完成(即:在交互式会话后退出),然后该容器连同所有文件更改一起消失了?因此,如果要保留一些文件更改,我必须将容器的状态提交到新映像/映像的新版本中?
我的理解是正确的,一旦容器停止/完成(即:在交互式会话后退出),然后该容器与所有文件更改一起消失了?
否,除非您使用--rm
的docker run
参数启动了容器,否则容器在退出后仍然存在。考虑一下:
$ docker run -it busybox sh
/ # date > example_file
/ # exit
由于exit
了我们的外壳,该容器不再运行:
$ 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
生成新映像更易于管理。
使用此模型,数据通常保存在容器外部,通过主机卷安装或使用仅数据容器。
您可以用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