Docker系列之六:Volume 卷的使用——在Dockerfile中的用法

系列链接

Docker系列之一:Docker介绍及在Ubuntu上安装

Docker系列之二:Docker 入门

Docker系列之三:使用Docker镜像和仓库

Docker系列之四:Dockerfile的使用

Docker系列之五:Volume 卷的使用——以Redis为例

Docker系列之六:Volume 卷的使用——在Dockerfile中的用法

Docker系列之七:Docker 网络(内部网络、容器之间的连接)

Docker系列之八:在Dockerfile中使用多段构建Muti-stage build

Docker系列之九:Docker用于持续集成,构建Jenkins和Docker服务器

Docker系列之十:Docker Compose的使用

简介

使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
格式:

VOLUME ["<mountpoint>"]

首先创建文件夹及Dockerfile如下,然后创建一个镜像,可以看到里面挂载了/home/app文件夹,用于持久化存储。

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# ls
Dockerfile  index.html
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# cat Dockerfile
FROM nginx
WORKDIR /usr/share/nginx/html
COPY . .
Volume /home/app
EXPOSE 80

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker volume ls
DRIVER              VOLUME NAME

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker build --tag cong .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM nginx
 ---> dbfc48660aeb
Step 2/4 : WORKDIR /usr/share/nginx/html
 ---> Using cache
 ---> 49eb0195ae40
Step 3/4 : Volume /home/app
 ---> Running in 18c563ef43c2
Removing intermediate container 18c563ef43c2
 ---> 47f7e5ae3f63
Step 4/4 : EXPOSE 80
 ---> Running in fb5646e92dd0
Removing intermediate container fb5646e92dd0
 ---> 53f3634ef68d
Successfully built 53f3634ef68d
Successfully tagged cong:latest

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker volume ls
DRIVER              VOLUME NAME

创建第一个容器,可以看到下面多出来了一个卷。

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker run -itd -p 91:80 --name cong1 cong
e2368d6814df4c53ac4fb13b4a0f6a2337d09704f53e0cbab4997f85998f4a11

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker volume ls
DRIVER              VOLUME NAME
local               4efa3605bc23f528d22d4e40748f137a63299cbffcd9ff56d1ed1be277a29dd9

 进入到容器cong1里面,发现存在文件夹/home/app,但内容为空,新增文件log.txt并填入字符串aaa;接着创建容器cong2,使用--volumes-from将容器cong1里的所有卷都加主到新创建的容器cong2里面,查看/home/app/log.txt文件,值是存在的。

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker exec -it cong1 bash
root@e2368d6814df:/usr/share/nginx/html# cd /home/app
root@e2368d6814df:/home/app# echo "aaa">log.txt
root@e2368d6814df:/home/app# exit
exit

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker run -itd -p 92:81 --name cong2 --volumes-from cong1  cong
1a63d4479c83d715782efc261279a7c1b2a547d1a37b616d28adfca2324a592a
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker exec -it cong2 bash
root@1a63d4479c83:/usr/share/nginx/html# cat /home/app/log.txt
aaa

我们尝试修改这个log.txt,将aaa改成bbb,可能看到此卷里的数据只保存了一份,看起像在两容器中都修改了。

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker exec -it cong2 bash

root@1a63d4479c83:/usr/share/nginx/html# echo "bbb"> /home/app/log.txt
root@1a63d4479c83:/usr/share/nginx/html# cat /home/app/log.txt
bbb
root@1a63d4479c83:/usr/share/nginx/html# exit
exit

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker exec -it cong1 bash
root@e2368d6814df:/usr/share/nginx/html# cat /home/app/log.txt
bbb
root@e2368d6814df:/usr/share/nginx/html# exit
exit

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker volume ls
DRIVER              VOLUME NAME
local               4efa3605bc23f528d22d4e40748f137a63299cbffcd9ff56d1ed1be277a29dd9

其实即使容器cong1没有运行,容器cong2也可以访问此卷,但前提是容器cong1本身必须存在,现在有两个容器都挂载了这一个卷,如果把这两容器都删除,此卷依然存在的。那Docker主机上可以找到路径/home/app吗?  可以看出在Docker主机上从始至终都未创建文件夹/home/app。

root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker rm cong1 -f
cong1
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker rm cong2 -f
cong2
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# docker volume ls
DRIVER              VOLUME NAME
local               4efa3605bc23f528d22d4e40748f137a63299cbffcd9ff56d1ed1be277a29dd9
root@iZbp13z6cxj72rb7bxf0smZ:/home/cong/DockerDemo# cd /home/app
-bash: cd: /home/app: No such file or directory


 

猜你喜欢

转载自blog.csdn.net/wucong60/article/details/83993922