这是一个非常基础的问题,但我有些困惑,希望确保我正确理解。
在从镜像启动容器并对其中的文件进行一些更改后(即:运行在容器上的WebApp的DB中存储了一些数据),在停止和重新启动容器之间继续使用相同的数据的适当方法是什么?
我的理解是否正确,即一旦容器被停止/完成(即:在交互会话后退出),那么该容器将与所有文件更改一起消失? 因此,如果我想要保留一些文件更改,则需要将容器的状态提交到新图像/图像的新版本中吗?
这是一个非常基础的问题,但我有些困惑,希望确保我正确理解。
在从镜像启动容器并对其中的文件进行一些更改后(即:运行在容器上的WebApp的DB中存储了一些数据),在停止和重新启动容器之间继续使用相同的数据的适当方法是什么?
我的理解是否正确,即一旦容器被停止/完成(即:在交互会话后退出),那么该容器将与所有文件更改一起消失? 因此,如果我想要保留一些文件更改,则需要将容器的状态提交到新图像/图像的新版本中吗?
我的理解是,一旦容器停止/结束(即交互式会话退出),那么该容器就消失了,包括所有文件更改。这个理解正确吗?
不是的,除非你使用--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
生成新的镜像。使用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
79aee3e2774e
,当您使用相同的镜像启动新容器时,文件是否仍然存在? - James Lin