删除容器时docker卷会发生什么情况

时间:2015-01-16 03:45:38

标签: mysql ubuntu docker volume

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

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

现在生产正常。

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

如果我错了,请纠正我

  1. 我必须从更新的mysql映像构建新容器
  2. 我需要删除旧的conatiner,所以我会停止并删除它。
  3. 然后我需要创建具有相同名称的新mysql容器,以便使用该数据库的其他Web服务器可以使用它。
  4. 现在我的问题是,在删除了conatiner后,docker删除了所有的mysql数据。

2 个答案:

答案 0 :(得分:6)

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

  1. 您指定包含所有依赖项的Dockerfile并使用docker build构建它。然后它将保存在您的本地注册表中(或者您可以将其推送到中心位置)
  2. 您可以根据图片启动容器,在该容器中进行修改,然后commit更改。
  3. 容器只是正在运行的进程,它们始终基于映像。请注意,容器永远不能更改图像(除非您提交)。 IMO Dockerfile方法远非优越。

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

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

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

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

    是的,如果您更新了Dockerfile中的内容,则必须构建新的图像(非容器)并将图像部署到生产环境中。然后,您可以根据新构建的图像使用docker run启动容器。

      
        
    1. 我需要删除旧的conatiner,所以我会停止并删除它。
    2.   

    是的,您必须停止旧容器,然后将其删除。之后,您可以使用相同的名称启动新容器,但这次它基于新图像。删除容器是必需的,因为它是名为的容器,如果启动一个具有相同名称的新容器,则会出现名称冲突(即容器以--name启动docker run)的选项。如果尚未命名容器,则可能已跳过删除旧容器。

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

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

    资源:

答案 1 :(得分:4)

除非使用docker rm -v container_id删除父容器并且没有其他容器使用该卷,否则永远不会删除卷。如果未给出-v标志,则不会删除该卷。这意味着你经常最终得到" orphan"来自容器的卷没有-v标记,而是位于/var/lib/docker某处。

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