对于在容器中运行的应用程序来说,容器就像是沙盒。这主要是为了保护在不同容器中运行的应用程序互不干扰。这也意味着,在容器内运行的应用程序所能看到的整个文件系统对该应用程序来说都是私有的,在不同容器中运行的其他应用程序无法对其进行干扰。
但有时,我们希望在容器之间共享数据。假设在容器 A 中运行的应用程序产生了一些数据,而在容器 B 中运行的另一个应用程序将消耗这些数据,可以使用 Docker 卷来实现这一目的。我们可以创建一个卷,并将其挂载到容器 A 和容器 B。
需要注意的是,当多个应用程序或进程同时访问数据时,我们必须非常小心,以避免出现不一致。为避免出现竞争引发的并发问题,我们最好只让一个应用程序或进程创建或修改数据,而所有其他并发访问这些数据的进程只读取数据。
我们可以通过将卷挂载为只读来强制容器中运行的进程只能读取卷中的数据。我们可以这样做。
创建容器writer
docker container run -it --name writer \
-v shared-data:/data \
.alpine /bin/sh
在这里,我们创建了一个名为 writer 的容器,它有一个以默认读/写模式挂载的共享数据卷。
容器内创建文件
# / echo "I can create a file" > /data/sample.txt
退出writer容器
按 Ctrl + D 或键入exit 然后在提示符下按 Enter 键
创建容器reader
docker container run -it --name reader \
-v shared-data:/app/data:ro \
ubuntu:22.04 /bin/bash
这里我们有一个名为 reader 的容器,它将使用同一个卷挂载并设置为read-only (ro)。
检查文件
确保可以看到在第一个容器writer中创建的文件
ls -l /app/data
这样就可以得到类似的结果:
reader容器中创建文件
失败并会显示如下信息:
这在意料之中,因为挂载卷已设置为只读。说明reader只能读取数据,不能修改和创建
经过以上步骤,我们可以实现两个容器间的数据共享,如果是更多容器的话,其设置方式也是一样的,需要注意的时,对于只读的容器,我们在挂载卷的时候设置为read-only便可以了,还是很简单的。
以上步骤测试完之后,为了释放docker所占用的资源,可以清理掉测试使用的容器和卷
docker container rm writer reader
docker volume rm -f shared-data
以上步骤,并没有解释每个docker命令的含义,是比较基础的操作,如果您对以上的命令不太熟悉,可以参考我的docker课程,有对各类命令的详细讲解:Docker 实战_在线视频教程-CSDN程序员研修院