删除容器时Docker卷发生了什么

use*_*546 9 mysql ubuntu volume docker

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

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

现在,在生产中运行良好。

然后,我在mysql映像中进行了一些更改,我想在生产环境中进行部署。

如果我错了请纠正我

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

现在我的问题是,一旦我删除了conatiner,docker是否将不会删除所有mysql数据。

was*_*ren 8

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

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

容器只是运行的简单进程,它们始终基于映像。请注意,容器永远不能更改映像(除非您提交)。IMO的Dockerfile方法要优越得多。

所以,回到原来的问题。在VOLUME该指令Dockerfile简单地创建用于容器的安装点,它实际上并没有安装在主机文件系统的文件系统容器什么。为了从主机上实际挂载文件夹,-v在运行容器时必须提供标志。

docker run -v /host/path:/container/path ...
Run Code Online (Sandbox Code Playgroud)

这将在主机和容器之间创建一个共享文件夹,即使容器已停止,卸下或崩溃,数据也仍然存在

  1. 我必须从更新的mysql映像构建新容器

是的,如果您已经更新了其中的内容Dockerfile,则必须构建一个新映像(而不是容器)并将该映像部署到生产环境中。然后,您可以docker run基于新构建的图像来启动容器。

  1. 我需要删除旧的着色器,所以我将停止并删除它。

是的,您必须停止旧容器,然后将其删除。之后,您可以使用相同的名称启动新容器,但是这次它是基于新映像的。因为它是一个命名容器,所以需要删除该容器,并且如果使用相同的名称启动一个新容器(例如,该容器使用的--name选项启动),则会发生名称冲突docker run。如果未命名容器,则可以跳过删除旧容器的操作。

  1. 然后,我需要使用相同的名称创建新的mysql容器,以便使用该数据库的其他Web服务器可以使用它。

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

资源: