数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录与数据卷目录绑定后,对方的修改也会立即同步
- 一个数据卷可以给多个容器同事挂载
- 一个容器可以被挂载多个数据卷
数据卷的作用
- 容器数据持久化
- 外部及其和容器间的通信
- 容器之间的数据交换
配置数据卷
创建启动容器时用[-v]配置
docker run ... -v 宿主机目录或文件:容器内目录或文件
PS:
- 目录必须为绝对路径
- 目录不存在会自动创建
- 可以挂载多个数据卷(多个-v即可)
比如我现在在ubuntu里面又装一个Centos(心不死!)
docker pull centos:7 #拉取镜像
并且将centos7中/root/data_container
挂载到宿主机的/root/data
上
docker run -it --name=centos1 -v [宿主机目录]:[容器目录] centos:7 /bin/bash
进入到centos7内部后到根目录下即可看到容器内部创建了data_container
文件
[root@1b20885d98c6 /]# cd ~
[root@1b20885d98c6 ~]# ll
total 8
-rw------- 1 root root 3416 Oct 1 01:16 anaconda-ks.cfg
drwxr-xr-x 2 root root 4096 Mar 17 17:00 data_container
回退到ubuntu中
paosin@paosin-pc:~$ ll #列出目录下的文件
数据卷容器
当container3挂载到数据卷上
container1、2挂载到container3上,等同于挂载到数据卷上
即使c3挂了,也不影响c1和c2
步骤
- 创建启动c3数据卷容器
docker run -it --name=c3 -v /volume(容器目录) centos:7 /bin/bash
此处不写宿主机目录,docker会自动在宿主机上分配一个目录
查看c3容器详情
docker inspect c3
找到mounts节点
"Mounts": [
{
"Type": "volume",
"Name": "d20d0fc84cc3f14e963cf182ce50c1ae4930bcab3ee63bff96070240db20d25d",
"Source": "/var/lib/docker/volumes/d20d0fc84cc3f14e963cf182ce50c1ae4930bcab3ee63bff96070240db20d25d/_data", // 数据卷目录
"Destination": "/volume", //挂载的目的地
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
- 创建启动c1、c2容器,使用 --volumes-from 参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
查看c1目录
[root@b13704ec00d2 /]# ll
total 60
-rw-r--r-- 1 root root 12123 Oct 1 01:16 anaconda-post.log
lrwxrwxrwx 1 root root 7 Oct 1 01:15 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 18 13:54 dev
drwxr-xr-x 1 root root 4096 Mar 18 13:54 etc
drwxr-xr-x 2 root root 4096 Apr 11 2018 home
lrwxrwxrwx 1 root root 7 Oct 1 01:15 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Oct 1 01:15 lib64 -> usr/lib64
drwxr-xr-x 2 root root 4096 Apr 11 2018 media
drwxr-xr-x 2 root root 4096 Apr 11 2018 mnt
drwxr-xr-x 2 root root 4096 Apr 11 2018 opt
dr-xr-xr-x 309 root root 0 Mar 18 13:54 proc
dr-xr-x--- 2 root root 4096 Oct 1 01:16 root
drwxr-xr-x 11 root root 4096 Oct 1 01:16 run
lrwxrwxrwx 1 root root 8 Oct 1 01:15 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Mar 18 13:54 sys
drwxrwxrwt 7 root root 4096 Oct 1 01:16 tmp
drwxr-xr-x 13 root root 4096 Oct 1 01:15 usr
drwxr-xr-x 18 root root 4096 Oct 1 01:15 var
drwxr-xr-x 2 root root 4096 Mar 18 13:48 volume # 此处就会在c1容器内创建volume目录
在c3容器的volume中touch一个文本
[root@78e857e5757e /]# cd volume/
[root@78e857e5757e volume]# touch 1.txt
在c2和c1中分别查看volume目录
[root@b13704ec00d2 /]# cd volume/
[root@b13704ec00d2 volume]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 18 14:10 1.txt
[root@ca67242d9e9a /]# cd volume/
[root@ca67242d9e9a volume]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 18 14:10 1.txt
同样,在任意一个容器中,修改volume目录,其余挂载的容器均会同步