Docker volume是如何工作的

77次阅读
没有评论

问题描述

有人使用Docker创建了一个使用卷来持久化生成的文件(保存在一个文件夹中)的PHP和Apache项目。这个人构建了镜像并正常运行了项目,唯一的例外是,他没有链接保存消息的文件夹(www/site/messages),而是简单地使用了/data文件夹,而项目与此文件夹没有任何关联。但是它却能正常工作。我对卷的工作原理不太理解,因为对我来说这没有意义。这是项目的链接:https://github.com/matheusbattisti/curso_docker/tree/main/2_volumes

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

Docker的卷(volume)是Docker管理的本地主机系统上的存储区域,用于持久化数据。即使容器被删除,我们仍然可以引用这个卷并恢复数据。卷可以通过Docker命令行或Docker Compose进行创建和管理。
以下是使用Docker命令行创建和使用卷的步骤:
1. 创建一个卷:

docker volume create storage

在上面的示例中,我们创建了一个名为storage的卷。
2. 运行容器并将卷映射到容器路径:

docker container run --name ubuntu-container-1 -d -it -v storage:/opt/test ubuntu

在上面的示例中,我们使用-v参数将卷storage映射到容器的/opt/test路径。这样,容器中的数据将持久化到卷中。
请注意,卷是在本地主机系统上创建的,并由Docker进行管理。即使容器被删除,卷中的数据仍然存在,并且可以在需要时重新连接到新的容器中。

方案2

匿名卷无法在下一个运行的容器中重用,如果需要这样做,您需要在/var/lib/docker/volumes/中找到它们(祝您好运),并使用-v选项将它们挂载,或者在任何容器范围之外使用docker volume create创建一个命名卷。
匿名卷是由Docker自动生成的,它们没有明确的名称。当我们在容器中使用VOLUME指令时,Docker会自动创建一个匿名卷,并将容器中的数据持久化到该卷中。匿名卷的路径通常是一个类似ID的长字符串,存储在/var/lib/docker/volumes/目录下。
以下是使用匿名卷的示例:
1. 创建一个Dockerfile,指定要持久化的路径:

FROM php7:latest
VOLUME /var/www

在上面的示例中,我们在Dockerfile中指定了要持久化的路径/var/www
2. 构建镜像:

docker build -t myTest .

在上面的示例中,我们使用docker build命令构建了一个名为myTest的镜像。
3. 运行容器:

docker run --rm -it myTest

在上面的示例中,我们使用docker run命令运行了一个容器。容器中的数据将自动持久化到匿名卷中。
请注意,匿名卷无法在下一个运行的容器中重用。如果需要在下一个容器中重用卷中的数据,您可以使用-v选项将卷挂载到容器中,或者在任何容器范围之外使用docker volume create命令创建一个命名卷。

方案3

如果您需要将文件从主机复制到容器中,可以使用ADDCOPY指令在Dockerfile中进行操作。
如果您有一个可选的文件需要挂载,那么在这种情况下不需要使用卷。将单个文件映射到容器没有意义,您可以在Dockerfile中使用ADDCOPY指令将文件复制到容器中。
以下是在Dockerfile中使用ADD指令的示例:

FROM php7:latest
ADD ./src /src

在上面的示例中,我们将主机上的./src文件夹复制到容器的/src路径中。
请注意,使用ADDCOPY指令将文件复制到容器中时,文件将成为容器的一部分,而不是存储在卷中。

以上是关于Docker卷的工作原理和使用方法的解决方案。根据您的需求,您可以选择使用匿名卷、命名卷或将文件复制到容器中。

正文完