您的位置:首页 > 运维架构 > Docker

Docker数据卷管理

2019-07-04 19:31 225 查看

前言

docker数据卷

数据卷是目录或文件,不是块设备。
容器可以读写volume中的数据。
volume数据可以持久化保存。

docker提供了两种卷:

bind mount

是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用 -v 选项指定路径,格式 <host path>:<container path>
bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
-v选项指定的路径,如果不存在,挂载时会自动创建。

docker managed volume

bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源。

bind mount与docker managed volume对比

  • 相同点:两者都是 host 文件系统中的某个路径。
  • 不同点:

一、bind mount卷示例

1.创建容器

[root@server1 tmp]# mkdir data1
[root@server1 tmp]# mkdir data2
[root@server1 tmp]# docker run -it --name vm1 -v /tmp/data1:/data1
> -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/my_yum.repo:/yum.repo:ro ubuntu

##data1目录为默认权限,data2和yum.repo为只读

2.测试挂载的目录权限

root@9b9faae9efac:/# ls
bin   data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  data2  etc  lib   media  opt  root  sbin  sys  usr  yum.repo
root@9b9faae9efac:/# cd data1
root@9b9faae9efac:/data1# touch file
root@9b9faae9efac:/data1# ls
file
root@9b9faae9efac:/data1# cd /data2
root@9b9faae9efac:/data2# touch file1
touch: cannot touch 'file1': Read-only file system
root@9b9faae9efac:/data2#
root@9b9faae9efac:/data2# cd
root@9b9faae9efac:~# echo 123 >> /yum.repo
bash: /yum.repo: Read-only file system

二、docker managed volume示例

1.查看现有的管理卷

[root@server1 ~]# docker volume ls			##前面实验留下的
DRIVER              VOLUME NAME
local               5da320924640e96fc6878df2d50436c532d4166acc31db2e2130624b516b6e9d
local               7a9f496f3b9d16fa9725ca107c39fa8b9d782c18f0dd3f8d04ea17022b72905a

2.删除上面创建的容器vm1后会,发现管理卷仍然存在,这是我们就需要去清理它,不然会占用我们的资源

[root@server1 ~]# docker rm -f vm1
[root@server1 ~]# docker volume  prune		##清理
Are you sure you want to continue? [y/N] y
Deleted Volumes:
7a9f496f3b9d16fa9725ca107c39fa8b9d782c18f0dd3f8d04ea17022b72905a
5da320924640e96fc6878df2d50436c532d4166acc31db2e2130624b516b6e9d

Total reclaimed space: 506B

[root@server1 ~]# docker volume ls			##再次查看
DRIVER              VOLUME NAME

3.使用registry镜像创建一个新的容器

[root@server1 ~]# docker run -d --name registry registry:2.3.1
4c49c9de5eac14bf5db5e8cfdbf93a8e3a0f164737377a0f1a0850c01d46a8e0
[root@server1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               48d0e2331db6d7f225b03d6dd6b29b79a8dc09c0d94816c10b4ad2228b91dd49

4.查看registry的相关信息

[root@server1 ~]# docker inspect registry | grep Source
"Source": "/var/lib/docker/volumes/48d0e2331db6d7f225b03d6dd6b29b79a8dc09c0d94816c10b4ad2228b91dd49/_data",

source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。
注意,即使删除容器,管理卷也不会删除。


我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。

首先,我们需要先创建卷

[root@server1 ~]# docker volume create voll			##创建卷voll


接下来,创建新的容器并将管理卷voll挂载到容器内的指定目录

[root@server1 ~]# docker run -d --name registry2 -v voll:/var/lib/registry registry:2.3.1

三、Docker卷插件

docker 卷默认使用的是local类型的驱动,只能存在宿主机,
跨主机的volume就需要使用第三方的驱动,可以查看一链接:

https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。

  • Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。

  • Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。

  • 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。

convoy卷插件

convoy卷插件支持三种运行方式:devicemapper、NFS、EBS。,我们下面的实验以nfs的运行方式来演示

准备两台主机,并安装好Dokcer服务

1.首先在server1和server2上搭建nfs文件系统

server1:

[root@server1 ~]# yum install -y nfs-utils	安装
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# mkdir /mnt/nfs	创建共享目录
[root@server1 ~]# chmod 777 /mnt/nfs	修改共享目录权限
[root@server1 ~]# vim /etc/exports	编辑共享目录文件,否则将不会被共享出去
[root@server1 ~]# cat /etc/exports
/mnt/nfs	*(rw,no_root_squash)
[root@server1 ~]# systemctl start nfs

值的注意的是:rpcbind服务必须是开启的。这是因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解rpc就是一个中介服务。

server2:

[root@server2 ~]# yum install -y nfs-utils
[r
7ff7
oot@server2 ~]# systemctl start nfs-server.service
[root@server2 ~]# showmount -e 172.25.6.1
Export list for 172.25.6.1:
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]#
[root@server2 ~]# mount 172.25.6.1:/mnt/nfs/ /mnt/nfs/
[root@server2 ~]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root   6486016 1751120   4734896  27% /
devtmpfs                 497244       0    497244   0% /dev
tmpfs                    508264       0    508264   0% /dev/shm
tmpfs                    508264   13108    495156   3% /run
tmpfs                    508264       0    508264   0% /sys/fs/cgroup
/dev/sda1               1038336  141700    896636  14% /boot
tmpfs                    101656       0    101656   0% /run/user/0
172.25.6.1:/mnt/nfs     6486016 2886912   3599104  45% /mnt/nfs


测试:

[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# touch file
[root@server2 nfs]# ls
file

[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
file



2.配置convoy环境

docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。

[root@server1 ~]# tar zxf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy* /usr/local/bin/  				##将二进制文件加入到PATH路径
[root@server1 convoy]# mkdir /etc/docker/plugins				##创建docker的插件目录
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 8677
##值的注意的是:第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除
,不然客户端的convoy命令就会用不了

[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
config  file
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec

##将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,
docker就可以识别。(其中convoy.spec文件之前是不存在的)
[root@server1 nfs]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock

3.创建卷

[root@server1 nfs]# docker volume ls
DRIVER              VOLUME NAME
[root@server1 nfs]# convoy create voll
voll
[root@server1 nfs]#
[root@server1 nfs]# ll
total 0
drwx------ 2 root root 34 Jul  4 19:19 config
-rw-r--r-- 1 root root  0 Jul  4 19:11 file
drwx------ 2 root root  6 Jul  4 19:19 voll


4.将解压convoy目录给server2复制一份,配置convoy环境

[root@server1 ~]# scp -r convoy server2:
root@server2's password:
convoy-pdata_tools                                                      100%   22MB  22.0MB/s   00:00
convoy                                                                  100%   19MB  19.5MB/s   00:00
SHA1SUMS                                                                100%  124     0.1KB/s   00:00
[root@server1 ~]#

[root@server2 ~]# cd convoy/
[root@server2 convoy]# cp convoy* /usr/local/bin/
[root@server2 convoy]# mkdir /etc/docker/plugins
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 2851
[root@server2 convoy]# cd /mnt/nfs/
[root@server2 nfs]# ls
config  file  voll


5.操作卷

列出所有卷

[root@server2 nfs]# convoy list
{
"voll": {
"Name": "voll",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Jul 04 19:19:16 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/mnt/nfs/voll",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Jul 04 19:19:16 +0800 2019",
"VolumeName": "voll"
},
"Snapshots": {}
}
}

使用卷

[root@server2 ~]# docker run -it --name vm1 -v voll:/data --volume-driver=convoy ubuntu
root@6f49d646230b:/#
root@6f49d646230b:/# cd /data/
root@6f49d646230b:/data# ls
root@6f49d646230b:/data# touch file{1..10}
root@6f49d646230b:/data# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
root@6f49d646230b:/data# exit
[root@server2 ~]#
[root@server2 ~]# cd /mnt/nfs/voll/
[root@server2 voll]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
[root@server2 voll]#



由上可知server1和server2上看到的内容一致,即不同主机间实现了共享存储。

创建convoy卷的快照

[root@server1 vol1]# convoy snapshot create voll --name voll_pic
vol1_pic
--name前面的是卷名,加个--name起个名字,不然会是数字

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: