1.背景
2.先来一个hello world
在上一节中我讲了容器数据卷,那么可以在自己建一个容器卷么
步骤:
第一步,在主机根目录下创建一个文件夹,名称为dockerFileData
第二步,file构建,即创建一个文件为dockerFile01,文件内容为:
# volume test01
FROM centos
VOLUME ["/c-dataFile01","/c-dataFile02","/c-dataFile03"]
CMD echo "finished....success"
CMD /bin/bash
第三步,上一步的文件build生成镜像,
docker build -f /dockerFileData/dockerFile01 -t testImage01/centos
大家这里注意观察,
截图中的Step0.....Step1....Step2.....Step3...几个步骤,
每一步其实就对应是我们上面的代码,
并且每一步都会产生一个镜像id,再次印证我们之前讲的镜像是一层包一层的。
第四步,run运行容器
第五步,查看运行后的根目录下是否有c-dataFile01,c-dataFile02,c-dataFile03三个容器共享文件夹;
第六步,使用 docker inspect 容器id,查看上一步中的上个共享文件对应的主机绑定的默认文件夹位置;
更多内容如下:

[
{
"Id": "9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa",
"Created": "2020-08-08T04:22:12.6184255Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 20613,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-08-08T04:22:13.0093046Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "a666d14bf5bac359135485a3cf4bf9ed6b8ee60fe65b87a2fd313f252df7bfd7",
"NetworkSettings": {
"Bridge": "",
"EndpointID": "080f5be425e241b0aad8cffb116740646b2952d34b356ad8ac571eadda22f523",
"Gateway": "172.17.42.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"HairpinMode": false,
"IPAddress": "172.17.0.11",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:0b",
"NetworkID": "d548d190550d9f5933f92e5843f0f27f69ae038b4313503ad73422cf089357be",
"PortMapping": null,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/9a28a87274f4",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null
},
"ResolvConfPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/hostname",
"HostsPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/hosts",
"LogPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa-json.log",
"Name": "/tender_almeida",
"RestartCount": 0,
"Driver": "devicemapper",
"ExecDriver": "native-0.2",
"MountLabel": "",
"ProcessLabel": "",
"Volumes": {
"/c-dataFile01": "/var/lib/docker/volumes/ecbaf289768f52d0aa5357ad37c0c8588e82e6e8d320c37ec463512a631adfb6/_data",
"/c-dataFile02": "/var/lib/docker/volumes/eeb5f75deed30c2798e8408d85cdaeb5e321cf5baf46e07da35004f58316bb32/_data",
"/c-dataFile03": "/var/lib/docker/volumes/2e3e45108937e55a6fe713991c52271853bc1e7cf8fb74da001a7c3e081d9922/_data"
},
"VolumesRW": {
"/c-dataFile01": true,
"/c-dataFile02": true,
"/c-dataFile03": true
},
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LxcConf": [],
"Memory": 0,
"MemorySwap": 0,
"CpuShares": 0,
"CpuPeriod": 0,
"CpusetCpus": "",
"CpusetMems": "",
"CpuQuota": 0,
"BlkioWeight": 0,
"OomKillDisable": false,
"Privileged": false,
"PortBindings": {},
"Links": null,
"PublishAllPorts": false,
"Dns": null,
"DnsSearch": null,
"ExtraHosts": null,
"VolumesFrom": null,
"Devices": [],
"NetworkMode": "bridge",
"IpcMode": "",
"PidMode": "",
"UTSMode": "",
"CapAdd": null,
"CapDrop": null,
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"SecurityOpt": null,
"ReadonlyRootfs": false,
"Ulimits": null,
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"CgroupParent": ""
},
"Config": {
"Hostname": "9a28a87274f4",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"PortSpecs": null,
"ExposedPorts": null,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "testimage01/centos",
"Volumes": {
"/c-dataFile01": {},
"/c-dataFile02": {},
"/c-dataFile03": {}
},
"VolumeDriver": "",
"WorkingDir": "",
"Entrypoint": null,
"NetworkDisabled": false,
"MacAddress": "",
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200611",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
}
}
]
查看主机中是否有对应文件夹
第七步,测试,
在主机的共享文件夹中添加或修改文件,是否能在对应的容器共享文件(c-dataFile01,c-dataFile02,c-dataFile03)中看到
主机中添加文件
容器中查看
在容器的共享文件夹中(c-dataFile01,c-dataFile02,c-dataFile03)添加或修改文件,是否能在对应的主机共享文件中看到
请自己验证
3.容器间传递共享
简单的说就是,假设运行3个cento实例,这个3个实例的数据可以同等级的共享数据;
案例设计思路:
1.镜像使用上一节我们自己build出来的 testimage01/centos,这个镜像启动后会自动创建3个共享的容器数据卷(c-dataFile01,c-dataFile02,c-dataFile03)
2.容器继承体系为 centos01--》centos02--》centos03
3.每次容器运行后都在c-dataFile01里面建立一个文件,看是否都能共享
4.如果删除centos02,分别在centos01和centos03中建立文件,是否还是能共享
具体步骤:
第一步,启动第一个容器,且命名为centos01,
并在数据卷c-dataFile01中创建test01-1.txt文件
docker run -it --name centos01 testimage01/centos
第二步,启动第二个容器,且命名为centos02,并且继承自centos01,
并在数据卷c-dataFile01中创建test02-1.txt文件,
docker run -it --name centos02 --volumes-from centos01 testimage01/centos
验证:
在当前容器(centos02)查看是否有容器centos01共享的test01-1.txt文件;
进入centos01,查看是否有centos02共享的test02-1.txt文件;
第三步,启动第三个容器,且命名为centos03,并且继承自centos02,
并在数据卷c-dataFile01中创建test03-1.txt文件
docker run -it --name centos03 --volumes-from centos02 testimage01/centos
验证,三个容器中的数据是否都一样,及都包括test01-1.txt、test02-1.txt、test03-1.txt文件
在当前容器(centos03)查看是否有容器centos01、centos02共享的test01-1.txt、test02-1.txt文件;
进入centos01,查看是否有容器centos02、centos03共享的test02-1.txt、test03-1.txt文件;
进入centos02,查看是否有容器centos01、centos03共享的test01-1.txt、test03-1.txt文件;
第四步,停止并删除容器centos02,在centos01、centos03分别创建文件test01-2.txt、test03-2.txt
检查是否仍然能共享
删除容器centos02
centos01中
centos03中
完美!
系统化学习docker教程: