如何使用Docker Volume管理机密数据

Author Image
admin Monday, June 8, 2020 阅读数: 30

[YoYoMooc]如何使用Docker Volume管理机密数据

在上个章节,我们验证了数据文件不能存放在容器中。那么现在我们学习如何使用Docker卷来解决数据文件丢失的问题,因为它可以将数据文件保存在容器之外,同时还可以通过在容器中创建数据文件。

更新Dockerfile文件

现在我们需要更新我们的Dockerfile文件,让它支持数据卷,以下是更新后的代码:

FROM alpine:3.11

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 rundocker create命令配合-v参数进行使用。

我们当前的示例程序,还只是一个没有真正连接数据库的应用程序,接下来我们使用学习使用Docker 卷来存放数据库。