一.数据卷
1.docker中的数据卷
- 数据卷是目录或文件,不是块设备
- 容器可以读写volume中的数据
- volume数据可以持久化保存
2.bind mount
- 是将主机上的目录或文件mount到容器里
- 使用直观高效,易于理解
- 使用 -v 选项指定路径,格式 :
bind mount 默认权限是读写rw,可以在挂载时指定只读ro
-v选项指定的路径,如果不存在,挂载时会自动创建。
[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel7.3.repo:/rhel7.3:ro ubuntu
root@eabd93700cd2:/# ls
bin data1 dev home lib64 mnt proc root sbin sys usr
boot data2 etc lib media opt rhel7.3 run srv tmp var
root@eabd93700cd2:/# cd rhel7.3
bash: cd: rhel7.3: Not a directory
root@eabd93700cd2:/# cat rhel7.3
[rhel7.3]
name=rhel7.3
baseurl=http://172.25.61.250:/rhel7.3
gpgcheck=0
root@eabd93700cd2:/# vi rhel7.3
root@eabd93700cd2:/# ll rhel7.3
-rw-r--r--. 1 root root 73 May 1 22:03 rhel7.3
root@eabd93700cd2:/# id
uid=0(root) gid=0(root) groups=0(root)
root@eabd93700cd2:/# cd /data1/
root@eabd93700cd2:/data1# ls
root@eabd93700cd2:/data1# touch file1
root@eabd93700cd2:/data1# ls
file1
root@eabd93700cd2:/data1# cd ../data2/
root@eabd93700cd2:/data2# ls
root@eabd93700cd2:/data2# touch file2
touch: cannot touch 'file2': Read-only file system
root@eabd93700cd2:/data2# [root@server1 ~]#
3.docker managed volume
bind mount必须指定host文件系统路径,限制了移植性
docker managed volume 不需要指定mount源
执行docker inspect vm2 可以看到
[root@server1 ~]# docker run -it --name vm2 -v vol2:/data ubuntu
root@89dc1213ae92:/# cd /data/
root@89dc1213ae92:/data# ls
root@89dc1213ae92:/data# touch files
root@89dc1213ae92:/data# ls
files
root@89dc1213ae92:/data# exit
exit
[root@server1 ~]# docker rm vm2
vm2
[root@server1 ~]# docker run -it --name vm2 -v vol2:/data ubuntu
root@69619c58daa6:/# cd /data/
root@69619c58daa6:/data# ls
files
root@69619c58daa6:/data# rm -f files
root@69619c58daa6:/data# exit
exit
二.卷插件的NFS运行方式
1.在所有节点提前挂载NFS存储
下载软件:
https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
server1
yum install -y nfs-utils
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# systemctl start nfs-serve
server2
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]#
[root@server2 ~]# showmount -e 172.25.61.1
Export list for 172.25.61.1:
/mnt/nfs *
[root@server2 ~]# mount 172.25.61.1:/mnt/nfs/ /mnt/nfs
2.convoy卷插件安装
tar zxf convoy.tar.gz
cp convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/
mkdir -p /etc/docker/plugins/
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
3.创建卷
convoy create vol1
自动生成数据目录:/mnt/nfs/vol1/
[root@server1 plugins]# cd /mnt/nfs/
[root@server1 nfs]# ls
config
[root@server2 plugins]# cd /mnt/nfs/
[root@server2 nfs]# ls
config vol1
4.使用卷
docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu
可以在两个主机上同时运行容器,会发现数据目录中的数据是同步的
[root@server2 volumes]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu
[root@server1 nfs]# docker run -it --name vm3 -v vol1:/data --volume-driver=convoy ubuntu
server 1上创建文件
server 2 上同步