docker 卷在删除容器时发生了什么
What happen to docker volume on deletion of container
假设我的 Mysql Docker 容器中有这些卷
VOLUME ["/etc/mysql", "/var/lib/mysql"]
现在 运行 可以正常生产了。
然后我在 mysql 图像中做了一些更改,我想在生产中部署它。
如有错误请指正
- 我必须从更新的 mysql 图像构建新容器
- 我需要删除旧容器,所以我会停止并删除它。
- 然后我需要创建同名的新 mysql 容器,以便其他使用该数据库的网络服务器可以使用它。
现在我的问题是,一旦我删除容器,docker 是否会删除所有 mysql 数据。
我认为在我们继续之前需要解释两个概念。 Docker 个图像和 docker 个容器。容器是由 docker 管理的 运行 进程,它基于 docker 图像。创建图像有两种方式:
- 您指定一个具有所有依赖项的
Dockerfile
并使用 docker build
构建它。然后将其保存在您的本地注册表中(或者您可以将其推送到中央位置)
- 您可以基于图像启动容器,在该容器中进行修改,然后
commit
进行更改。
容器只是进程,运行它们总是基于图像。请注意,容器永远无法更改图像(除非您提交)。 IMO Dockerfile
方法要好得多。
所以,回到最初的问题。 Dockerfile
中的 VOLUME
指令只是为容器创建一个挂载点,它实际上并没有从主机文件系统挂载任何东西到容器文件系统。为了实际从主机挂载文件夹,必须在 运行 容器时提供 -v
标志。
docker run -v /host/path:/container/path ...
这会在主机和容器之间创建一个共享文件夹,即使在容器已停止、删除或崩溃后,数据 仍然存在 。
- I have to build the new container from the updated mysql image
是的,如果您在 Dockerfile
中更新了某些内容,您将必须构建一个新的 映像 (不是容器)并将映像部署到您的生产环境。然后,就可以根据新建的镜像使用docker run
启动一个容器了。
- I need to delete the old conatiner so i will stop that and delete it.
是的,您必须停止旧容器,然后将其删除。之后你可以使用相同的名称启动你的新容器,但这次它是基于一个新的图像。需要删除容器,因为它是一个 named 容器,如果您启动一个具有相同名称的新容器(即容器以 [= docker run
的 20=] 选项)。如果容器没有命名,则可以跳过删除旧容器。
- 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
)的卷永远不会被删除。
假设我的 Mysql Docker 容器中有这些卷
VOLUME ["/etc/mysql", "/var/lib/mysql"]
现在 运行 可以正常生产了。
然后我在 mysql 图像中做了一些更改,我想在生产中部署它。
如有错误请指正
- 我必须从更新的 mysql 图像构建新容器
- 我需要删除旧容器,所以我会停止并删除它。
- 然后我需要创建同名的新 mysql 容器,以便其他使用该数据库的网络服务器可以使用它。
现在我的问题是,一旦我删除容器,docker 是否会删除所有 mysql 数据。
我认为在我们继续之前需要解释两个概念。 Docker 个图像和 docker 个容器。容器是由 docker 管理的 运行 进程,它基于 docker 图像。创建图像有两种方式:
- 您指定一个具有所有依赖项的
Dockerfile
并使用docker build
构建它。然后将其保存在您的本地注册表中(或者您可以将其推送到中央位置) - 您可以基于图像启动容器,在该容器中进行修改,然后
commit
进行更改。
容器只是进程,运行它们总是基于图像。请注意,容器永远无法更改图像(除非您提交)。 IMO Dockerfile
方法要好得多。
所以,回到最初的问题。 Dockerfile
中的 VOLUME
指令只是为容器创建一个挂载点,它实际上并没有从主机文件系统挂载任何东西到容器文件系统。为了实际从主机挂载文件夹,必须在 运行 容器时提供 -v
标志。
docker run -v /host/path:/container/path ...
这会在主机和容器之间创建一个共享文件夹,即使在容器已停止、删除或崩溃后,数据 仍然存在 。
- I have to build the new container from the updated mysql image
是的,如果您在 Dockerfile
中更新了某些内容,您将必须构建一个新的 映像 (不是容器)并将映像部署到您的生产环境。然后,就可以根据新建的镜像使用docker run
启动一个容器了。
- I need to delete the old conatiner so i will stop that and delete it.
是的,您必须停止旧容器,然后将其删除。之后你可以使用相同的名称启动你的新容器,但这次它是基于一个新的图像。需要删除容器,因为它是一个 named 容器,如果您启动一个具有相同名称的新容器(即容器以 [= docker run
的 20=] 选项)。如果容器没有命名,则可以跳过删除旧容器。
- 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
)的卷永远不会被删除。