停止 Docker 容器与删除 Docker 容器相同吗?

停止 Docker 容器与删除 Docker 容器相同吗?

如果 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)。

相关内容