如果 Docker 是“短暂的”,那么停止容器与删除容器有何不同?当我停止并启动时,这并不意味着我可以在该容器中保存信息,对吗?我认为这是你不想做的(在容器中保存数据。)
答案1
如果 Docker 是“短暂的”,那么停止容器与删除容器有何不同?
已停止的容器可通过 看到docker ps -a
。如果容器使用该选项启动--rm
,它们将在停止后自行移除。
当我停止并启动时,这并不意味着我可以在该容器中保存信息,对吗?我认为这是你不想做的(在容器中保存数据。)
你完全正确。状态不应该保存在容器内。
答案2
停止容器后,可以使用 重新启动容器docker start <ID|name>
。如果容器未使用某些特殊选项启动,则内部数据将保留,并且可以继续使用。您可以使用 docker 注册表自行测试此行为:
docker run -d -p 5000:5000 --name registry registry:2
# deploy a local docker image
curl -X GET http://<youthostname>:5000/v2/_catalog
docker stop registry
docker start registry
curl -X GET http://<youthostname>:5000/v2/_catalog
# the content is still there
答案3
当容器启动时,docker 等工具会创建一个目录,其中包含以下内容:
- 配置(名称、卷挂载、已发布的端口等)
- 容器特定的文件系统层以及与镜像层合并的容器层组装文件系统
- 使用 json 或本地日志驱动程序时的日志输出
当容器停止时,包含各种命名空间和 cgroup 的运行环境会被破坏,但可以使用之前的文件系统状态和相同的配置重新启动。
当容器被删除时,您可以重新创建它,但文件系统更改、日志和任何其他配置数据都会丢失。
这是一个展示文件系统持久性的简单示例:
$ docker run -it --name stop-test busybox /bin/sh
/ # cat /hello.txt
cat: can't open '/hello.txt': No such file or directory
/ # echo "hello world" > /hello.txt
/ # cat /hello.txt
hello world
/ # exit
$ docker container inspect stop-test --format '{{json .State}}' | jq .
{
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-08-16T14:52:49.810997424Z",
"FinishedAt": "2023-08-16T14:53:09.900172563Z"
}
$ docker start stop-test
stop-test
$ docker attach stop-test
/ # cat /hello.txt
hello world
/ # exit
$ docker rm stop-test
stop-test
$ docker run -it --name stop-test busybox /bin/sh
/ # cat /hello.txt
cat: can't open '/hello.txt': No such file or directory
/ # exit
$ docker run -it --name stop-test busybox /bin/sh
docker: Error response from daemon: Conflict. The container name "/stop-test" is already in use by container "caaad3a5287431dc6a9a924c658723580298d182d4b27bd8ed3fcd6c3690b2ad". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
请注意,如果您想在容器之间存储数据,最好使用卷。如果您想查看已删除容器的日志,则需要将这些日志推送到外部系统(如 elastic)。