前言

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
5da320924640e96fc6878df2d50436c532d4166acc31db2e2130624b516b6e9dTotal 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
[root@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起个名字,不然会是数字

Docker数据卷管理相关推荐

  1. Docker(七)--Docker数据卷管理及插件

    一.Docker 数据卷管理 在实际使用过程中,我们需要把容器和数据进行隔离,因为容器在使用过程中可能随时要进行销毁,但是数据要保留下来,所以我们要做数据的持久化. 为什么要用数据卷 docker分层 ...

  2. docker之数据卷管理

    目录 1.docker使用 2.优化 在docker之网络访问中,通过启动了nginx服务进行了访问,只展示了nginx的首页信息,如果想访问我们自己的代码如何操作呢,这就需要使用到数据卷的知识了.在 ...

  3. Docker----(七)数据卷管理

    Docker数据卷管理 1 Docker数据卷管理 1.1 为什么要用数据卷 1.2 bind mount 1.3 docker managed volume 2 卷插件简介 2.1 nfs的配置 2 ...

  4. docker入门实践之数据卷管理

    在实际使用docker过程中,有时需要查看容器内应用产生的数据,或需要把容器内的数据进行备份,甚至是多个容器间需要共享数据,这势必涉及到数据管理,那么docker的数据怎么管理呢? 容器中数据管理主要 ...

  5. docker常用命令 | game2048网页游戏 | nginx镜像 | 数据卷管理 | docker网络管理 | 构建apache镜像 | Dockerfile常用的命令

    DOCKER https://www.docker.com http://www.runoob.com/docker/docker-command-manual.html docker命令大全 镜像用 ...

  6. Docker 数据卷之进阶篇

    Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...

  7. Docker学习总结(68)—— Docker 数据卷相关知识总结

    前言 在生产环境中使用 Docker,要想实现数据的持久化(所谓 Docker 的数据持久化即数据不随着 Container 的结束而结束)或者需要在多个容器之间进行数据共享,需要将数据从宿主机挂载到 ...

  8. Volumes 数据卷管理

    文章目录 4. Volumes 数据卷管理 4.1 Volumes 数据卷的优势 4.2 Volumes 数据卷使用 4.2.1.创建并管理数据卷 1. 创建数据卷 2. 查看数据卷 3. 核查数据卷 ...

  9. Docker数据卷—Volumes

    一.引入Docker数据卷的必然性 为了实现容器与主机之间.容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份.迁移.恢复等,Docker加入了数据卷(volumes)机制.简单的讲,就是 ...

最新文章

  1. 第一章 软件自动化测试的基础知识
  2. Centos7:update-initramfs -u:command not found
  3. Client向Server send数据,返回WSAEWOULDBLOCK错误
  4. CI持续集成系统环境---部署Gitlab环境完整记录
  5. linux运维决心书!
  6. access2003安装包百度云_阿里云服务器安装JDK与配置环境详细步骤
  7. mysql 通过存储过程 插入测试百万数据
  8. ROS 教程之 network:多台计算机之间网络通信(1)
  9. python读取文件特定内容_利用python代码获取文件特定的内容,并保存为文档
  10. u3d_shader_surface_shader_2
  11. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
  12. 3dmax软件如何导入光网文件?
  13. 一键生成AppIcon 多种尺寸图标
  14. html如何设置banner,css设置banner图自适应的方法
  15. 【React】unmountComponentAtNode卸载组件
  16. JavaWeb登录案例带验证码(mysql+servlet+jsp+idea)
  17. DBeaver 给id设置为键 以及执行sql查询语句
  18. 设置Windows控制台颜色
  19. 用JavaScript编写的一个点名系统
  20. VA液晶屏底色发白是什么原因?

热门文章

  1. R语言使用vcd包的spine函数可视化spinogram图(spinogram图是被归一化的堆叠条形图、这样每个条形的高度一样、内部显示不同分布的比例)
  2. Matplotlib使用scatter函数在Python中绘制气泡图(bubble plot)、通过size参数指定数据点的大小
  3. R语言亚组分析 (Subgroup Analysis)及森林图绘制实战
  4. R语言伪相关性分析(Spurious Correlation)、相关关系不是因果关系:以缅因州离婚率数据集为例
  5. R系统抽样(systematic sampling)
  6. 巴菲特+查理芒格+投资理论+经典语录+给韭菜的启示
  7. ISLR_ANOVA
  8. AttributeError: module ‘tensorflow‘ has no attribute ‘Session‘错误解决
  9. 《开源者说》08期:聊聊Java那些事儿
  10. java JDK 11.0.5的安装