1.背景
通俗的理解就是容器运行中产生的数据会随着容器关闭而消失,所以我们希望使用卷(磁盘)来保存,大家可以理解为业务数据,与镜像无关;
特点:
1.卷中的更改可以直接生效
2.数据卷中的更改不会包含在镜像的更新中
3.数据卷可在容器之间共享或重用数据
4.数据卷的生命周期一直持续到没有容器使用它为止
本质:主机与容器数据共享
2.简单使用
执行命令:
docker run -it -v /h-dada01:/c-dada01 centos /bin/bash
/h-dada01 表示主机中的磁盘位置
/c-dada01 表示容器中的磁盘位置
这个两个文件加的内容会实时共享同步,
即:在容器中的c-dada01 增加或修改文件,在主机中的h-dada01也会跟着变,反过来也一样,
大家可以自己再文件中操作观察结果
容器中:
主机中:
注意:
学到这里,可能有的童鞋会问,
如果把容器关了,然后直接在主机里面修改文件,即修改h-data01里面的内容,
那么当容器再次启动后,c-dada01里面的数据会同步更新么?
答案是会改变的,因为是实时同步的,大家可以自己测试。
3.查看挂载情况
docker inspect 容器id
内容太多,不能完整的截图,直接把内容拷贝出来如下:

1 [root@localhost h-dada01]# docker inspect 5803a2ce204e 2 [ 3 { 4 "Id": "5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2", 5 "Created": "2020-08-07T13:13:01.776487Z", 6 "Path": "/bin/bash", 7 "Args": [], 8 "State": { 9 "Running": true, 10 "Paused": false, 11 "Restarting": false, 12 "OOMKilled": false, 13 "Dead": false, 14 "Pid": 11709, 15 "ExitCode": 0, 16 "Error": "", 17 "StartedAt": "2020-08-07T13:13:02.4827852Z", 18 "FinishedAt": "0001-01-01T00:00:00Z" 19 }, 20 "Image": "86ac386aa02e523765549ff1f78f226464865c941a0dec5ccd33149024d23ad5", 21 "NetworkSettings": { 22 "Bridge": "", 23 "EndpointID": "bf4f04bdc2881896c9329644ded148e243f2288f08279f7d65d6b86286e6c50d", 24 "Gateway": "172.17.42.1", 25 "GlobalIPv6Address": "", 26 "GlobalIPv6PrefixLen": 0, 27 "HairpinMode": false, 28 "IPAddress": "172.17.0.9", 29 "IPPrefixLen": 16, 30 "IPv6Gateway": "", 31 "LinkLocalIPv6Address": "", 32 "LinkLocalIPv6PrefixLen": 0, 33 "MacAddress": "02:42:ac:11:00:09", 34 "NetworkID": "d548d190550d9f5933f92e5843f0f27f69ae038b4313503ad73422cf089357be", 35 "PortMapping": null, 36 "Ports": {}, 37 "SandboxKey": "/var/run/docker/netns/5803a2ce204e", 38 "SecondaryIPAddresses": null, 39 "SecondaryIPv6Addresses": null 40 }, 41 "ResolvConfPath": "/var/lib/docker/containers/5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2/resolv.conf", 42 "HostnamePath": "/var/lib/docker/containers/5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2/hostname", 43 "HostsPath": "/var/lib/docker/containers/5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2/hosts", 44 "LogPath": "/var/lib/docker/containers/5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2/5803a2ce204eb107a7c47a2ef1c554d04ce70effeac1cd3dc9de4c46f94f48e2-json.log", 45 "Name": "/gloomy_darwin", 46 "RestartCount": 0, 47 "Driver": "devicemapper", 48 "ExecDriver": "native-0.2", 49 "MountLabel": "", 50 "ProcessLabel": "", 51 "Volumes": { 52 "/c-dada01": "/h-dada01" 53 }, 54 "VolumesRW": { 55 "/c-dada01": true 56 }, 57 "AppArmorProfile": "", 58 "ExecIDs": null, 59 "HostConfig": { 60 "Binds": [ 61 "/h-dada01:/c-dada01" 62 ], 63 "ContainerIDFile": "", 64 "LxcConf": [], 65 "Memory": 0, 66 "MemorySwap": 0, 67 "CpuShares": 0, 68 "CpuPeriod": 0, 69 "CpusetCpus": "", 70 "CpusetMems": "", 71 "CpuQuota": 0, 72 "BlkioWeight": 0, 73 "OomKillDisable": false, 74 "Privileged": false, 75 "PortBindings": {}, 76 "Links": null, 77 "PublishAllPorts": false, 78 "Dns": null, 79 "DnsSearch": null, 80 "ExtraHosts": null, 81 "VolumesFrom": null, 82 "Devices": [], 83 "NetworkMode": "bridge", 84 "IpcMode": "", 85 "PidMode": "", 86 "UTSMode": "", 87 "CapAdd": null, 88 "CapDrop": null, 89 "RestartPolicy": { 90 "Name": "no", 91 "MaximumRetryCount": 0 92 }, 93 "SecurityOpt": null, 94 "ReadonlyRootfs": false, 95 "Ulimits": null, 96 "LogConfig": { 97 "Type": "json-file", 98 "Config": {} 99 }, 100 "CgroupParent": "" 101 }, 102 "Config": { 103 "Hostname": "5803a2ce204e", 104 "Domainname": "", 105 "User": "", 106 "AttachStdin": true, 107 "AttachStdout": true, 108 "AttachStderr": true, 109 "PortSpecs": null, 110 "ExposedPorts": null, 111 "Tty": true, 112 "OpenStdin": true, 113 "StdinOnce": true, 114 "Env": [ 115 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 116 ], 117 "Cmd": [ 118 "/bin/bash" 119 ], 120 "Image": "centos", 121 "Volumes": null, 122 "VolumeDriver": "", 123 "WorkingDir": "", 124 "Entrypoint": null, 125 "NetworkDisabled": false, 126 "MacAddress": "", 127 "OnBuild": null, 128 "Labels": { 129 "org.label-schema.build-date": "20200611", 130 "org.label-schema.license": "GPLv2", 131 "org.label-schema.name": "CentOS Base Image", 132 "org.label-schema.schema-version": "1.0", 133 "org.label-schema.vendor": "CentOS" 134 } 135 } 136 } 137 ] 138 [root@localhost h-dada01]#
重点是可以看这句:
4.挂载磁盘权限控制
主机可读可写,容器只可以读
执行命令:docker run -it -v /h-dada02-rw:/c-dada02-ro:ro centos /bin/bash
/h-dada02-rw ,主机共享文件夹名称,只是为了便于理解加了一个-rw,原则上可以任意取名称
/c-dada02-ro ,容器中共享文件夹名称,只是为了便于理解加了一个-ro,原则上可以任意取名称
ro ,执行命令的参数表示可读,ro(read only)
大家可以自己测试:
在主机文件夹h-dada02-rw,添加或修改文件,能正常操作;
在容器文件夹c-dada02-ro,添加或修改文件,不能正常操作;
查看挂载情况
docker inspect a21b03b3b8f5
系统化学习docker教程: