使用 Docker Volume 的功能 (一)

在执行Docker Container 的时侯档案系统会分为Image 层、Init 层以及可读可写层这三个部份,当Docker Container 删除掉之后,存放在Docker Container 上的资料也就会跟着删除掉,因此需要把不想要被删除掉的资料存放在实体机器上,避免资料不见的问题。

主要实作如何使用 Docker 的 Volume 功能,把资料写入到实体机器上,主要的方式有二个方法:

在执行 docker run 指令时加上 -v 参数,使得 Container 里面的档案路径Mapping 到实体主机的档案路径。

在撰写 Dockerfile 时,加入 VOLUME 指令,做到把资料存放在实体的主机上。使用这种方法需要搭配 docker inspect 指令,才能查询到实体主机档案的存放路径在哪。

Example1:

在使用 docker run 指令时,指定 -v 参数,使得实体主机的文件夹路径 Mapping 到 Container 的文件夹路径,指令如下

/home/user1/storage 是实体主机的文件夹路径 Mapping 到 Container 里面的 /storage 文件夹路径。

执行画面如下:

我们就会在上个画面中的左边视窗看到执行 docker run 指令时使用 -v参数 Mapping 到实体主机的 /home/user1/storage 的文件夹。然后在右边视窗中的实体主机 /home/user1/storage 的文件夹建立一个 helloworld.txt 的档案,最后再回到左边视窗的 Container 里面的 /storage 文件夹去看 helloworld.txt 的档案已经存在了。

Example2:

在使用 docker run 指令时,指定 -v参数,但是没有指定实体主机的档案路径,指令如下

使用以上的指令会发现到没有指定实体主机的文件夹路径,那资料会跑到哪里去了呢?

要回答这个答案之前需要先使用 docker volume ls 可以看到如下的画面

上图就是一个 Container 的 Volume,如果要找到在实体主机真实的文件夹路径,可以使用以下的指令:

4c2a9ef663c2 是 Container 的 ID

执行画面如下

上图就可以找到Volume 在实体主机的真实路径,这时侯就可以使用cd command 切进上图查询出来的文件夹路径并且写入一个档案在此文件夹,但是要注意使用者权限的问题,这里是直接切换成root 权限,如下图:

从上图就可以看到helloworld.txt的档案有在 container上出现,也就有成功的把 Volume 这个功能执行起来。

今天已经介绍了如何使用 docker run,指令把Container 的文件夹 Mapping 到实体机器上,明天要继续介绍的部份是透过使用撰写 Dockerfile 的方式把 Volume 挂载起来。