docker 卷在删除容器时发生了什么

What happen to docker volume on deletion of container

假设我的 Mysql Docker 容器中有这些卷

VOLUME ["/etc/mysql", "/var/lib/mysql"]

现在 运行 可以正常生产了。

然后我在 mysql 图像中做了一些更改,我想在生产中部署它。

如有错误请指正

  1. 我必须从更新的 mysql 图像构建新容器
  2. 我需要删除旧容器,所以我会停止并删除它。
  3. 然后我需要创建同名的新 mysql 容器,以便其他使用该数据库的网络服务器可以使用它。

现在我的问题是,一旦我删除容器,docker 是否会删除所有 mysql 数据。

我认为在我们继续之前需要解释两个概念。 Docker 个图像和 docker 个容器。容器是由 docker 管理的 运行 进程,它基于 docker 图像。创建图像有两种方式:

  1. 您指定一个具有所有依赖项的 Dockerfile 并使用 docker build 构建它。然后将其保存在您的本地注册表中(或者您可以将其推送到中央位置)
  2. 您可以基于图像启动容器,在该容器中进行修改,然后commit进行更改。

容器只是进程,运行它们总是基于图像。请注意,容器永远无法更改图像(除非您提交)。 IMO Dockerfile 方法要好得多。

所以,回到最初的问题。 Dockerfile 中的 VOLUME 指令只是为容器创建一个挂载点,它实际上并没有从主机文件系统挂载任何东西到容器文件系统。为了实际从主机挂载文件夹,必须在 运行 容器时提供 -v 标志。

docker run -v /host/path:/container/path ...

这会在主机和容器之间创建一个共享文件夹,即使在容器已停止、删除或崩溃后,数据 仍然存在

  1. I have to build the new container from the updated mysql image

是的,如果您在 Dockerfile 中更新了某些内容,您将必须构建一个新的 映像 (不是容器)并将映像部署到您的生产环境。然后,就可以根据新建的镜像使用docker run启动一个容器了。

  1. I need to delete the old conatiner so i will stop that and delete it.

是的,您必须停止旧容器,然后将其删除。之后你可以使用相同的名称启动你的新容器,但这次它是基于一个新的图像。需要删除容器,因为它是一个 named 容器,如果您启动一个具有相同名称的新容器(即容器以 [= docker run 的 20=] 选项)。如果容器没有命名,则可以跳过删除旧容器。

  1. Then i need to create the new mysql container with same name so that other webserver using the database can use it.

是的,因为您可能正在使用容器链接来实现此目的。

资源:

除非使用 docker rm -v container_id 删除父容器并且没有其他容器使用该卷,否则永远不会删除卷。如果未给出 -v 标志,则不会删除该卷。这意味着您经常会从容器中删除 "orphan" 卷而没有 -v 标志生活在 /var/lib/docker 某处。

映射到所选主机目录(使用 -v host_dir:container_dir)的卷永远不会被删除。