问题描述
有人使用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
如果您需要将文件从主机复制到容器中,可以使用
ADD
或COPY
指令在Dockerfile中进行操作。
如果您有一个可选的文件需要挂载,那么在这种情况下不需要使用卷。将单个文件映射到容器没有意义,您可以在Dockerfile中使用ADD
或COPY
指令将文件复制到容器中。
以下是在Dockerfile中使用ADD
指令的示例:
FROM php7:latest
ADD ./src /src
在上面的示例中,我们将主机上的./src
文件夹复制到容器的/src
路径中。
请注意,使用ADD
或COPY
指令将文件复制到容器中时,文件将成为容器的一部分,而不是存储在卷中。
以上是关于Docker卷的工作原理和使用方法的解决方案。根据您的需求,您可以选择使用匿名卷、命名卷或将文件复制到容器中。