Docker数据卷管理
前言
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数据卷管理相关推荐
- Docker(七)--Docker数据卷管理及插件
一.Docker 数据卷管理 在实际使用过程中,我们需要把容器和数据进行隔离,因为容器在使用过程中可能随时要进行销毁,但是数据要保留下来,所以我们要做数据的持久化. 为什么要用数据卷 docker分层 ...
- docker之数据卷管理
目录 1.docker使用 2.优化 在docker之网络访问中,通过启动了nginx服务进行了访问,只展示了nginx的首页信息,如果想访问我们自己的代码如何操作呢,这就需要使用到数据卷的知识了.在 ...
- Docker----(七)数据卷管理
Docker数据卷管理 1 Docker数据卷管理 1.1 为什么要用数据卷 1.2 bind mount 1.3 docker managed volume 2 卷插件简介 2.1 nfs的配置 2 ...
- docker入门实践之数据卷管理
在实际使用docker过程中,有时需要查看容器内应用产生的数据,或需要把容器内的数据进行备份,甚至是多个容器间需要共享数据,这势必涉及到数据管理,那么docker的数据怎么管理呢? 容器中数据管理主要 ...
- docker常用命令 | game2048网页游戏 | nginx镜像 | 数据卷管理 | docker网络管理 | 构建apache镜像 | Dockerfile常用的命令
DOCKER https://www.docker.com http://www.runoob.com/docker/docker-command-manual.html docker命令大全 镜像用 ...
- Docker 数据卷之进阶篇
Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇 笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入, ...
- Docker学习总结(68)—— Docker 数据卷相关知识总结
前言 在生产环境中使用 Docker,要想实现数据的持久化(所谓 Docker 的数据持久化即数据不随着 Container 的结束而结束)或者需要在多个容器之间进行数据共享,需要将数据从宿主机挂载到 ...
- Volumes 数据卷管理
文章目录 4. Volumes 数据卷管理 4.1 Volumes 数据卷的优势 4.2 Volumes 数据卷使用 4.2.1.创建并管理数据卷 1. 创建数据卷 2. 查看数据卷 3. 核查数据卷 ...
- Docker数据卷—Volumes
一.引入Docker数据卷的必然性 为了实现容器与主机之间.容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份.迁移.恢复等,Docker加入了数据卷(volumes)机制.简单的讲,就是 ...
最新文章
- 第一章 软件自动化测试的基础知识
- Centos7:update-initramfs -u:command not found
- Client向Server send数据,返回WSAEWOULDBLOCK错误
- CI持续集成系统环境---部署Gitlab环境完整记录
- linux运维决心书!
- access2003安装包百度云_阿里云服务器安装JDK与配置环境详细步骤
- mysql 通过存储过程 插入测试百万数据
- ROS 教程之 network:多台计算机之间网络通信(1)
- python读取文件特定内容_利用python代码获取文件特定的内容,并保存为文档
- u3d_shader_surface_shader_2
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
- 3dmax软件如何导入光网文件?
- 一键生成AppIcon 多种尺寸图标
- html如何设置banner,css设置banner图自适应的方法
- 【React】unmountComponentAtNode卸载组件
- JavaWeb登录案例带验证码(mysql+servlet+jsp+idea)
- DBeaver 给id设置为键 以及执行sql查询语句
- 设置Windows控制台颜色
- 用JavaScript编写的一个点名系统
- VA液晶屏底色发白是什么原因?
热门文章
- R语言使用vcd包的spine函数可视化spinogram图(spinogram图是被归一化的堆叠条形图、这样每个条形的高度一样、内部显示不同分布的比例)
- Matplotlib使用scatter函数在Python中绘制气泡图(bubble plot)、通过size参数指定数据点的大小
- R语言亚组分析 (Subgroup Analysis)及森林图绘制实战
- R语言伪相关性分析(Spurious Correlation)、相关关系不是因果关系:以缅因州离婚率数据集为例
- R系统抽样(systematic sampling)
- 巴菲特+查理芒格+投资理论+经典语录+给韭菜的启示
- ISLR_ANOVA
- AttributeError: module ‘tensorflow‘ has no attribute ‘Session‘错误解决
- 《开源者说》08期:聊聊Java那些事儿
- java JDK 11.0.5的安装