如何使用Docker Volume管理机密数据
admin
2021-06-03[YoYoMooc]如何使用Docker Volume管理机密数据
目录导航:
推荐内容:
在上个章节,我们验证了数据文件不能存放在容器中。那么现在我们学习如何使用Docker卷来解决数据文件丢失的问题,因为它可以将数据文件保存在容器之外,同时还可以通过在容器中创建数据文件。
更新Dockerfile文件
现在我们需要更新我们的Dockerfile文件,让它支持数据卷,以下是更新后的代码:
FROM alpine:3.9
VOLUME /data
WORKDIR /data
ENTRYPOINT (test -e message.txt && echo "文件已存在" \
|| (echo "创建文件中..." \
&& echo 你好, Docker 时间: $(date '+%X') > message.txt)) && cat message.txt
添加了参数 VOLUME
,该命令会告诉Docker,任何存在/data
中的文件都会被保存到一个卷中。我们是事先知道我们的数据文件会存放在/data文件夹中,所以才会指定路径到/data中。
注意,在容器中运行的应用程序,它是不会知道
/data
这个文件夹是一个特殊的存在,它依然会像正常在容器中运行的其他文件一样,会被读取和写入数据。
现在我们需要重新创建镜像文件,输入以下命令:
docker build . -t yoyomooc/vtest -f Dockerfile.volumes
创建一个卷
生成好镜像后,我们需要创建存储数据文件的卷,输入以下命令:
docker volume create --name testdata
docker volume create
命令创建了一个新的卷,并为其指定一个名字,这个名字是testdata
。testdata 卷是一个独立的文件系统,它将会被指定到一个容器中的文件目录。由于该卷不是
在这种情况下是testdata。该卷是一个独立的文件系统,它将被作为容器中的文件系统中的指定文件夹,由于卷不属于容器的一部分,所以即使容器被删除或销毁,我们卷中的数据都会保存下来不会被删除。
创建容器
现在我们再次创建一个Docker容器,告诉容器应该使用哪个卷。输入以下命令:
docker run --name vtest2 -v testdata:/data yoyomooc/vtest
这次命令多了一个参数 -v ,它会告诉docker,将容器内部/data
目录中创建的任何数据均保存到卷testdata中。对于应用程序来说,该卷就像一个普通的文件夹一样,用于存放程序产生的数据。
得到的输出结果如下:
创建文件中...
你好, Docker 时间: 06:25:41
就应用程序而言,它并没有任何变化。我们仅在Docker文件中设置了一个简单的脚本。ENTRYPOINT
命令检查/data
目录中是否有一个 message.txt 文件。当判断是第一次运行的时候,卷中的数据文件不存在,这时,应用程序就会创建它。
现在你可能感受不到它的好处,因为只有当大量使用后,尤其是容器被销毁和替换的时候你会明显感受到它的好处。
我们现在尝试删除现有的容器,并创建和运行一个新容器替换现在的。命令如下:
docker rm -f vtest2
docker run --name vtest2 -v testdata:/data yoyomooc/vtest
同样的我们指定的是一个相同的卷testdata,docker会告诉容器vtest2指定它的data文件夹到卷中。这时,ENTRYPOINT脚本会查找到/data/message.txt文件已经存在了,因为是前一个容器创建的。而之前我们销毁的仅仅是容器,而不是卷。
所以可以看到输出的结果如下:
文件已存在
你好, Docker 时间: 06:25:41
说明我们的数据文件被正常的保留下来了,文件的时间戳没有发生变化。
查看一个镜像是否使用了卷
有两种方法可以检查docker镜像是否依赖了卷,其中第一种方式也是最重要的一种。
就是查看用于创建图像的的Docker文件,许多公司采用的Docker镜像,都会保留一个Github仓库的链接,从仓库中你可以很容易的检查Docker文件,看看它是否包含了任何VOLUME命令。记住,在读取Docker文件时,也要考虑基础镜像是否也使用了哦。。
另外一种方法是直接检查一个镜像,毕竟有些时候我们无法获取Dockerfile文件,输入以下命令:
docker inspect yoyomooc/vtest
在Docker inspect 命令返回的详情信息中,查看是否包括以下内容:
"Volumes": {
"/data": {}
},
可以看到 Volumes参数中指定了,镜像指定了哪些路径可以使用卷。
我们可以采用docker run
或docker create
命令配合-v参数进行使用。
我们当前的示例程序,还只是一个没有真正连接数据库的应用程序,接下来我们使用学习使用Docker 卷来存放数据库。