数据卷介绍
数据卷(Data Volumes)是宿主机中的一个目录或文件,数据卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
创建启动容器时,使用-v
参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
比如我要创建一个myRedis镜像的容器,并创建数据卷:
docker run -it --name=myredis -v /root/data:/root/data_container myredis:latest /bin/bash
创建完毕后,在主机的/root目录
下出现了data
目录,而在容器的/root
目录下出现了data_container
目录。
然后在主机上创建一个a.txt
:
发现容器的data_container
目录下也多了一个a.txt
文件:
将容器关闭并删除之后,文件依然在。
然后使用docker run -it --name=myredis -v /root/data:/root/data_container myredis:latest /bin/bash
重新起一个容器,发现容器中的a.txt
文件又回来了:
一个容器挂载多个目录
docker run -it --name=myredis \
-v ~/data2:/root/data2 \
-v ~/data3:/root/data3 \
myredis:latest \
/bin/bash
查看容器的/root/data
目录,发现多了两个目录:
主机的/root/data
目录下也多了两个目录:
两个容器通过挂载同一个目录共享数据
容器1:
docker run -it --name=myredis1 \
-v ~/data:/root/data \
myredis:latest \
/bin/bash
容器2:
docker run -it --name=myredis2 \
-v ~/data:/root/data \
myredis:latest \
/bin/bash
可以看到,两个容器和主机的/root
目录下都多了一个data
目录:
接着,我们在容器1的data
目录下创建一个a.txt
,并向文件中写入一个’‘hello’'字符串:
然后在容器2中可以发现刚刚在容器1中创建的内容:
配置数据卷容器
多容器如何进行数据交互,在上面我们使用的是多个容器挂载同一个数据卷
的方式,其实还有一种方式,就是创建数据卷容器
。
比如现在有三个容器:c1、c2和c3,现在我们将c3挂载一个数据卷,然后将c1和c2分别挂载到c3上面,这个时候就相当于c1与c2同时挂载到了数据卷上,可以进行数据共享(即使c3出问题宕机了,c1和c2依然能正常完成数据共享),此时c3就被称为数据卷容器。
首先启动c3数据卷容器,使用-v
参数设置数据卷:
docker run -it --name=c3 -v ~/data:/root/volume myredis:latest /bin/bash
然后创建启动c1、c2容器,使用--volumes-from
参数设置数据卷:
docker run -it --name=c1 --volumes-from c3 myredis:latest /bin/bash
docker run -it --name=c2 --volumes-from c3 myredis:latest /bin/bash
创建完毕后,我们首先在c1容器的/root/volume
目录下创建一个b.txt
,并在里面写入"docker"字符串:
然后在c2中可以发现刚刚在c1中创建的内容: