Cloud ❀ Docker的数据卷介绍
文章目录
- 1、数据卷概念
- 2、数据卷的使用
- (1)直接命令添加
- (2)DockerFile添加
- 3、数据卷容器
- (1)数据卷容器是什么
- (2)vloumes-from的使用
1、数据卷概念
Docker产生的数据如果不通过Docker commit生成新的镜像,数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就被删除了,为了保护数据此处使用卷;
容器之间可以数据共享;
卷 就是目录和文件,存在与一个或多个容器中,由Docker挂载到容器,但是不属于联合文件系统,因此能够绕过Union File System提供一下用于持续存储或共享数据的特征:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷;
从容器内复制文件到某主机上
[root@localhost ~]# docker cp 容器ID:容器内路径 目标主机路径
2、数据卷的使用
容器内添加数据卷
(1)直接命令添加
命令格式:docker run -it -v /宿主机绝对路径:/容器内目录 镜像名
[root@localhost ~]# ls / | grep -w myDataVolume[root@localhost ~]# docker run -it centos
[root@7896967b6746 /]# ls | grep -w dataVolumeContainer[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos /数据共享;
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos /写保护;
写保护使得宿主机单向进行写操作,容器只能查看;[root@475fabb64590 /]# ls / | grep -w dataVolumeContainer /注意容器ID;
dataVolumeContainer
[root@localhost ~]# ls / | grep -w myDataVolume
myDataVolume[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
475fabb64590 centos "/bin/bash" 4 minutes ago Up 4 minutes amazing_williamson
7896967b6746 centos "/bin/bash" 8 minutes ago Up 8 minutes affectionate_keldysh
查看是否挂载成功
[root@localhost ~]# docker inspect 475fabb64590
[{"Id": "475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe","Created": "2021-03-08T09:03:59.643698063Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 6245,"ExitCode": 0,"Error": "","StartedAt": "2021-03-08T09:04:00.089636568Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55","ResolvConfPath": "/var/lib/docker/containers/475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe/resolv.conf","HostnamePath": "/var/lib/docker/containers/475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe/hostname","HostsPath": "/var/lib/docker/containers/475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe/hosts","LogPath": "/var/lib/docker/containers/475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe/475fabb64590421b2ecd129614c4b66d6fc655e3ce1894b9965b3c2d6d32dafe-json.log","Name": "/amazing_williamson","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": ["/myDataVolume:/dataVolumeContainer"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/f3f73c128842aa3d106287d5efe63bfdc7f67450283b1fe48ad06ad5f8f60faa-init/diff:/var/lib/docker/overlay2/4a9db94f13d4540530cd143cb0be0720bcf47eef0e35edb78c5c30a223617005/diff","MergedDir": "/var/lib/docker/overlay2/f3f73c128842aa3d106287d5efe63bfdc7f67450283b1fe48ad06ad5f8f60faa/merged","UpperDir": "/var/lib/docker/overlay2/f3f73c128842aa3d106287d5efe63bfdc7f67450283b1fe48ad06ad5f8f60faa/diff","WorkDir": "/var/lib/docker/overlay2/f3f73c128842aa3d106287d5efe63bfdc7f67450283b1fe48ad06ad5f8f60faa/work"},"Name": "overlay2"},"Mounts": [ /数据盘挂载;{"Type": "bind","Source": "/myDataVolume","Destination": "/dataVolumeContainer","Mode": "","RW": true, /是否存在写保护"Propagation": "rprivate"}],"Config": { /配置文件;"Hostname": "475fabb64590","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": [ /执行终端;"/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20201204","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": { /网络配置;"Bridge": "","SandboxID": "57558675c2087cfaa484926919023cd9010d5dada5c951fc3bb22201e313ce98","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/57558675c208","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "c0f4cf5ce14b3c5fa8a740769a5a87b4e8a7fe17254fb5ef53e30298e6ab07f7","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:03","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "2581e70a11b247a522326b69da1c598f088db7d5ba10fe51ee1d7dd88d6d94a9","EndpointID": "c0f4cf5ce14b3c5fa8a740769a5a87b4e8a7fe17254fb5ef53e30298e6ab07f7","Gateway": "172.17.0.1","IPAddress": "172.17.0.3","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:03","DriverOpts": null}}}}
]
验证数据是否共享
[root@localhost ~]# touch /myDataVolume/test.txt
[root@475fabb64590 /]# ls /dataVolumeContainer/
test.txt
[root@475fabb64590 /]# echo this is test! > /dataVolumeContainer/test.txt
[root@localhost ~]# cat /myDataVolume/test.txt
this is test!
配置容器停止数据同步
[root@475fabb64590 /]# exit /容器退出;
[root@localhost ~]# touch test2.txt
[root@localhost ~]# echo this is test2! > /myDataVolume/test2.txt[root@localhost ~]# docker start 475fabb64590
475fabb64590
[root@localhost ~]# docker attach 475fabb64590 /重新登录容器;
[root@475fabb64590 /]# cat /myDataVolume/test2.txt
this is test2!
配置写保护数据共享
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
[root@493b11d40260 /]# [root@localhost ~]# docker inspect 493b11d40260
~"Mounts": [{"Type": "bind","Source": "/myDataVolume","Destination": "/dataVolumeContainer","Mode": "ro","RW": false,"Propagation": "rprivate"
~
(2)DockerFile添加
DockerFile是Docker images的编程,类似于Linux的Shell;
命令格式:VOLUME ["容器内路径","容器内路径","容器内路径"...]
出于可以移植和分享的考虑,-v 主机目录:容器目录这种方法不能够直接在DockerFile中实现,由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录;
[root@Docker ~]# mkdir /myDocker
[root@Docker ~]# vim /myDocker/DockerFile
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------successl"
CMD /bin/bash
[root@Docker ~]# docker build -f /myDocker/DockerFile -t zxc/centos .
Sending build context to Docker daemon 12.16MB
Step 1/4 : FROM centos---> 300e315adb2f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]---> Running in 26c85da57a92
Removing intermediate container 26c85da57a92---> d719126ef7c3
Step 3/4 : CMD echo "finished,--------successl"---> Running in be54681b353f
Removing intermediate container be54681b353f---> 38faacfc353d
Step 4/4 : CMD /bin/bash---> Running in 12770df16d5e
Removing intermediate container 12770df16d5e---> cc068d02bff6
Successfully built cc068d02bff6
Successfully tagged zxc/centos:latest
[root@Docker ~]# docker images zxc/centos
REPOSITORY TAG IMAGE ID CREATED SIZE
zxc/centos latest cc068d02bff6 11 seconds ago 209MB
[root@Docker ~]# docker run -it zxc/centos
[root@dac174d83dc5 /]# ls /
bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var
dataVolumeContainer1 dev home lib64 media opt root sbin sys usr[root@Docker ~]# docker inspect dac174d83dc5
~"Mounts": [{"Type": "volume","Name": "6f803f6075d4cb8138f7c9d9080f75dcd2e388ef6968756763e78e4b403c3326","Source": "/var/lib/docker/volumes/6f803f6075d4cb8138f7c9d9080f75dcd2e388ef6968756763e78e4b403c3326/_data","Destination": "/dataVolumeContainer1","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume","Name": "4f2ac33d13c287f97990a73a741f649b9ccc3a4d6e99aa1f298875bf964346e2","Source": "/var/lib/docker/volumes/4f2ac33d13c287f97990a73a741f649b9ccc3a4d6e99aa1f298875bf964346e2/_data","Destination": "/dataVolumeContainer2","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
~[root@Docker ~]# ll /var/lib/docker/volumes/
total 24
drwx-----x. 3 root root 19 Mar 9 23:41 4f2ac33d13c287f97990a73a741f649b9ccc3a4d6e99aa1f298875bf964346e2
drwx-----x. 3 root root 19 Mar 9 23:41 6f803f6075d4cb8138f7c9d9080f75dcd2e388ef6968756763e78e4b403c3326
brw-------. 1 root root 8, 3 Mar 9 23:38 backingFsBlockDev
-rw-------. 1 root root 32768 Mar 9 23:41 metadata.db
验证数据是否共享
[root@dac174d83dc5 /]# echo this is aaa! > /dataVolumeContainer1/test_file1
[root@dac174d83dc5 /]# cat /dataVolumeContainer1/test_file1
this is aaa!
[root@Docker ~]# cat /var/lib/docker/volumes/6f803f6075d4cb8138f7c9d9080f75dcd2e388ef6968756763e78e4b403c3326/_data/test_file1
this is aaa!
3、数据卷容器
(1)数据卷容器是什么
命名的容器挂载数据卷,其他容器通过挂载这个实现数据共享,挂载数据卷的容器,称之为数据卷容器;
(2)vloumes-from的使用
[root@Docker ~]# docker images zxc/centos
REPOSITORY TAG IMAGE ID CREATED SIZE
zxc/centos latest cc068d02bff6 47 minutes ago 209MB
以新的镜像zxc/centos创建三个Docker容器分别为a b c,容器b数据共享与容器a,容器c数据共享与容器b;
[root@Docker ~]# docker run -it --name docker_a zxc/centos
[root@bd8cf8bdc1ae /]# ls /
bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumeContainer1 dev home lib64 media opt root sbin sys usr
[root@bd8cf8bdc1ae /]# touch /dataVolumeContainer1/test_a.txt
[root@bd8cf8bdc1ae /]# [root@Docker ~]# [root@Docker ~]# docker run -it --name docker_b --volumes-from docker_a zxc/centos
[root@d01c3386d06e /]# ls /dataVolumeContainer1/
test_a.txt
[root@d01c3386d06e /]# touch /dataVolumeContainer1/test_b.txt
[root@d01c3386d06e /]# [root@Docker ~]# [root@Docker ~]# docker run -it --name docker_c --volumes-from docker_b zxc/centos
[root@d23497032be0 /]# ls /dataVolumeContainer1/
test_a.txt test_b.txt
[root@d23497032be0 /]# touch /dataVolumeContainer1/test_c.txt
[root@d23497032be0 /]# [root@Docker ~]# [root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d23497032be0 zxc/centos "/bin/sh -c /bin/bash" 30 seconds ago Up 29 seconds docker_c
d01c3386d06e zxc/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute docker_b
bd8cf8bdc1ae zxc/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes docker_a
[root@Docker ~]# docker attach bd8cf8bdc1ae
[root@bd8cf8bdc1ae /]# ls /dataVolumeContainer1/ /容器a也存在容器b与容器c的数据;
test_a.txt test_b.txt test_c.txt
逐一删除容器a b,并观察数据状态;
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d23497032be0 zxc/centos "/bin/sh -c /bin/bash" 4 minutes ago Up 4 minutes docker_c
d01c3386d06e zxc/centos "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes docker_b
bd8cf8bdc1ae zxc/centos "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes docker_a
[root@Docker ~]# docker rm -f bd8cf8bdc1ae
bd8cf8bdc1ae
[root@Docker ~]# docker attach d01c3386d06e
[root@d01c3386d06e /]# ls /dataVolumeContainer1/ /删除掉a后,b仍存在全部数据;
test_a.txt test_b.txt test_c.txt
[root@d01c3386d06e /]# read escape sequence[root@Docker ~]# docker rm -f d01c3386d06e
d01c3386d06e
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d23497032be0 zxc/centos "/bin/sh -c /bin/bash" 5 minutes ago Up 5 minutes docker_c
[root@Docker ~]# docker attach d23497032be0
[root@d23497032be0 /]# ls /dataVolumeContainer1/ /删除掉a b后,c仍存在全部数据;
test_a.txt test_b.txt test_c.txt
[root@d23497032be0 /]# read escape sequence
结论验证
- 容器之间的配置信息的传递,数据卷的生命周期一直持续到没有容器;
Cloud ❀ Docker的数据卷介绍相关推荐
- Docker容器数据卷详解
文章目录 1. 数据卷介绍 2. 简单使用 3. MySQL容器建立数据卷同步数据 4. 常用命令 5. 具名挂载和匿名挂载 5.1 匿名挂载 5.2 具名挂载 6. Dockerfile中设置数据卷 ...
- Docker 基本操作 数据卷 -- docker 数据卷基本操作、挂载数据卷
文章目录 1. docker 数据卷基本操作 1.1 容器与数据耦合的问题 1.2 数据卷介绍 1.3 数据卷的基本语法 1.4 创建一个数据卷,并查看数据卷在宿主机的目录位置 1.5 小结 2. 挂 ...
- Docker系列 五.Docker容器数据卷
五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...
- docker基础---数据卷volumes
1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...
- Docker容器数据卷讲解
概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...
- docker和数据卷问题探究
参考博文:Docker : 数据卷(创建.挂载.查看.删除) <Docker实践>第二版 <深入浅出Docker>
- Docker——Docker 容器数据卷(Volumes)
Docker 容器数据卷 容器数据卷(Volumes) 容器数据卷概述 使用数据卷 实现mysql数据同步 具名挂载和匿名挂载 匿名挂载 具名挂载 DockerFile里写Volumes配置 多个数据 ...
- 【Docker学习笔记 五】深入理解Docker容器数据卷机制
前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷 ...
- Docker 挂载数据卷、查看数据卷、清理数据卷
Docker 挂载数据卷.查看数据卷.清理数据卷 创建容器并设置数据卷挂载 查看所有数据卷列表 查看`RabbitMQ`插件数据卷的具体信息 清除数据卷 创建容器并设置数据卷挂载 这里以允许Rabbi ...
最新文章
- Google Test(GTest)使用方法和源码解析——断言的使用方法和解析
- ★核心关注点_《信息系统项目管理师考试考点分析与真题详解》
- jsp开发,拼接项目前缀
- golang中的httptest
- [读书] Computer Vision: Algorithms and Applications
- makefile中变量有哪些?
- tomcat部署web應用時涉及到的基本概念
- 编程学习--从入门到放弃
- python学习day17 递归函数
- Qt之QThread用法
- Tomcat学习总结(15)—— Apache Tomcat各版本比较
- 第十五章 面向对象程序设计
- 华三 h3c ospf、rip 路由引入和路由策略
- Android渐变色画笔 自定义View渐变色
- 采集淘宝网的10个经典方法
- 百度离线地图APIV2.0
- Cloud Hosted Notebook Showdown(云托管笔记本)
- 使用微软官方工具制作Windows10的U盘启动盘
- 荣耀折叠旗舰Magic Vs系列;卡西欧搭配可拆卸表圈的G-SHOCK新品;联发科天玑8200 5G移动芯片 | 科技新品...
- 红外摄像机应用原理与常见技术问题分析
热门文章
- 进步的奥秘:自下而上的演变 //转载
- DES加密算法|密码学|网络空间安全
- 陕西山阳中学2021高考成绩查询,陕西高中排名2021最新排名
- 虚幻3(导演动画)一动画触发器
- 什么是ChinaNet,ChinaNet介绍
- 神舟K580s i7 D0 光驱厚度12.7mm mSATA接口不可用
- 从人工智障到人工智能:人工智能在数字化转型中的应用案例
- 读书笔记-适当表现愤怒而不是悲伤和内疚
- dalek-cryptography/zkp——基于merlin的Schnorr零知识证明
- Android 中handlemessage方法获取数据赋值全局变量