docker 存储
查看系统默认驱动
Storage Driver: overlay2 默认驱动,这里用的centos7系统 Backing Filesystem: xfs 底层文件系统 Docker Root Dir: /var/lib/docker 各层数据存放目录 [root@mcw1 ~]$ docker info Client: Context: default Debug Mode: false Plugins: app: Docker App (Docker Inc., v0.9.1-beta3) buildx: Docker Buildx (Docker Inc., v0.7.1-docker) scan: Docker Scan (Docker Inc., v0.12.0) Server: Containers: 19 Running: 8 Paused: 0 Stopped: 11 Images: 6 Server Version: 20.10.12 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2 Default Runtime: runc Init Binary: docker-init containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d runc version: v1.0.2-0-g52b36a2 init version: de40ad0 Security Options: seccomp Profile: default Kernel Version: 3.10.0-693.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 976.3MiB Name: mcw1 ID: XBZE:DN6Z:UQMS:2FCM:YSA4:XZFO:EPFV:LVET:UP3V:OJFK:WLGF:7Q64 Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 10.0.0.131:5000 127.0.0.0/8 Registry Mirrors: https://hub-mirror.c.163.com/ Live Restore Enabled: false WARNING: API is accessible on http://0.0.0.0:2375 without encryption. Access to the remote API is equivalent to root access on the host. Refer to the 'Docker daemon attack surface' section in the documentation for more informatio: https://docs.docker.com/go/attack-surface/ [root@mcw1 ~]$ ls /var/lib/docker/ buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
bind mount ,指定挂载源
,将host目录挂载到容器中使用,容器删除,host目录还存在,数据不被删除,可供下一次使用。还可以设置目录在容器中的读写情况,默认读写,可以设置为ro只读,如果容器中已存在文件的目录被挂载,这些文件会被隐藏起来,使用的是host挂载进来的文件
[root@mcw1 ~]$ mkdir htdocs #创建挂载目录并创建文件 [root@mcw1 ~]$ echo machangwei>./htdocs/index.html [root@mcw1 ~]$ docker run -d -p 10002:80 --name=mcw2 -v ~/htdocs:/usr/local/apache2/htdocs httpd #-v挂载目录到容器 6fc2c03fb2150a37b4d96fcb40f2d2f9d3891dfc42eb1326a2b1ad5ff546a156 [root@mcw1 ~]$ curl 127.0.0.1:10002 machangwei [root@mcw1 ~]$ docker ps |grep mcw2 6fc2c03fb215 httpd "httpd-foreground" 32 seconds ago Up 31 seconds 0.0.0.0:10002->80/tcp, :::10002->80/tcp mcw2 [root@mcw1 ~]$ docker exec -it 6fc /bin/bash root@6fc2c03fb215:/usr/local/apache2# ls bin build cgi-bin conf error htdocs icons include logs modules root@6fc2c03fb215:/usr/local/apache2# cat htdocs/index.html #查看容器中指定目录下的文件是挂载后的 machangwei root@6fc2c03fb215:/usr/local/apache2# exit [root@mcw1 ~]$ docker stop 6fc2 #将容器停止并删除,host中的数据不随之删除 6fc2 [root@mcw1 ~]$ docker rm 6fc2 6fc2 [root@mcw1 ~]$ cat htdocs/index.html machangwei 只读验证 [root@mcw1 ~]$ docker run -d -p 10003:80 --name=mcw3 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd #添加ro只读, e736d8c025152cf06bb1077fdac8e5e5e7a0a0a948fc4bb7523821f1be57dd40 [root@mcw1 ~]$ docker exec -it e736 /bin/bash root@e736d8c02515:/usr/local/apache2# echo mcw >htdocs/index.html #进入容器,无法修改只读方式挂载进来的数据 bash: htdocs/index.html: Read-only file system root@e736d8c02515:/usr/local/apache2# exit [root@mcw1 ~]$ curl 127.0.0.1:10003 machangwei [root@mcw1 ~]$ echo mcw2>>~/htdocs/index.html #在host中修改挂载目录数据。访问容器时,数据也是修改后的host文件中数据 [root@mcw1 ~]$ curl 127.0.0.1:10003 machangwei mcw2
[root@mcw1 ~]$ docker run -d -p 10004:80 --name=mcw4 -v ~/htdocs/index.html:/usr/local/apache2/htdocs/index.html httpd #还可以只挂载单个文件,不过容器中必须得有这个文件,不然会作为新目录将容器中的文件都隐藏掉
8ccd479b3d57eda42004e27c3c504019a99a32c234a30f7237b9ed47000865bf
[root@mcw1 ~]$ curl 127.0.0.1:10004
machangwei
mcw2
[root@mcw1 ~]$
docker managed volume 不指定挂载源
[root@mcw1 ~]$ docker run -d -p 10005:80 --name=mcw5 -v /usr/local/apache2/htdocs/ httpd 95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3 [root@mcw1 ~]$ docker inspect 95d5 [ { "Id": "95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3", "Created": "2022-01-01T21:34:15.559176855Z", "Path": "httpd-foreground", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 4758, "ExitCode": 0, "Error": "", "StartedAt": "2022-01-01T21:34:16.275229672Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:dabbfbe0c57b6e5cd4bc089818d3f664acfad496dc741c9a501e72d15e803b34", "ResolvConfPath": "/var/lib/docker/containers/95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3/resolv.conf", "HostnamePath": "/var/lib/docker/containers/95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3/hostname", "HostsPath": "/var/lib/docker/containers/95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3/hosts", "LogPath": "/var/lib/docker/containers/95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3/95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3-json.log", "Name": "/mcw5", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": { "80/tcp": [ { "HostIp": "", "HostPort": "10005" } ] }, "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/8e90d3967e3c8ef0a3aa4267c0a2ffc5e0dec17be90e94716b9b5576de8ca762-init/diff:/var/lib/docker/overlay2/3f76496187fef1b5cd536812868752884233fed42fdfd1f606b748fa88001a17/diff:/var/lib/docker/overlay2/961e08da79100b71d0315b987cc723499c9dd022b43a700ef523b4f8e4f59783/diff:/var/lib/docker/overlay2/3daf3db1b8305a52235ed15e0166111ead8d04cef4125dd4cdb112a9361deb2f/diff:/var/lib/docker/overlay2/8b7ec8b3305c70a95021097e8b78d963745e5013159d7d6f50b53d77b4a13b8a/diff:/var/lib/docker/overlay2/fa380ffe836ecbf76429cde75e5ee384fe90f67ac3e4eea9ddb7aaaee7a814c6/diff", "MergedDir": "/var/lib/docker/overlay2/8e90d3967e3c8ef0a3aa4267c0a2ffc5e0dec17be90e94716b9b5576de8ca762/merged", "UpperDir": "/var/lib/docker/overlay2/8e90d3967e3c8ef0a3aa4267c0a2ffc5e0dec17be90e94716b9b5576de8ca762/diff", "WorkDir": "/var/lib/docker/overlay2/8e90d3967e3c8ef0a3aa4267c0a2ffc5e0dec17be90e94716b9b5576de8ca762/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "volume", "Name": "480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c", "Source": "/var/lib/docker/volumes/480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c/_data", "Destination": "/usr/local/apache2/htdocs", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], "Config": { "Hostname": "95d57f9771c3", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "HTTPD_PREFIX=/usr/local/apache2", "HTTPD_VERSION=2.4.52", "HTTPD_SHA256=0127f7dc497e9983e9c51474bed75e45607f2f870a7675a86dc90af6d572f5c9", "HTTPD_PATCHES=" ], "Cmd": [ "httpd-foreground" ], "Image": "httpd", "Volumes": { "/usr/local/apache2/htdocs/": {} }, "WorkingDir": "/usr/local/apache2", "Entrypoint": null, "OnBuild": null, "Labels": {}, "StopSignal": "SIGWINCH" }, "NetworkSettings": { "Bridge": "", "SandboxID": "3eadf66aea44697c210ffd6423b3e712c4a7476db82107604496567b90ea9d92", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "10005" }, { "HostIp": "::", "HostPort": "10005" } ] }, "SandboxKey": "/var/run/docker/netns/3eadf66aea44", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "2ad8de46a50658e84f8b6aafb6dd278c49d5e7886faddda0a643fdf3c410f7ae", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.8", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:08", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "0480c7596189fe6eb000b2b54f808dce3e121179ddea20c6e1900fac8db6757f", "EndpointID": "2ad8de46a50658e84f8b6aafb6dd278c49d5e7886faddda0a643fdf3c410f7ae", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.8", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:08", "DriverOpts": null } } } } ] [root@mcw1 ~]$ [root@mcw1 ~]$ docker run -d -p 10005:80 --name=mcw5 -v /usr/local/apache2/htdocs/ httpd 95d57f9771c36cd1c254daae0ce2b0d3b23a0c3e45686fd8a9f01713e98656e3 [root@mcw1 ~]$ docker inspect 95d5 [ { ......... }, "Mounts": [ { "Type": "volume", "Name": "480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c", "Source": "/var/lib/docker/volumes/480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c/_data", "Destination": "/usr/local/apache2/htdocs", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], "Config": { ......... } ] [root@mcw1 ~]$ [root@mcw1 ~]$ ls /var/lib/docker/volumes/480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c/_data/ index.html #在这个volumes下随机生成目录,目录名是Name,源是目录下的_data数据目录,如果容器中Destination存在数据,那么就会复制过来,然后挂载到容器中 [root@mcw1 ~]$ curl 127.0.0.1:10005 <html><body><h1>It works!</h1></body></html> [root@mcw1 ~]$ echo machangwei >/var/lib/docker/volumes/480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c/_data/index.html [root@mcw1 ~]$ curl 127.0.0.1:10005 #直接修改目录文件,就能修改访问到容器的数据 machangwei [root@mcw1 ~]$ [root@mcw1 ~]$ docker volume ls #出来inspect查看volume,还可以用下面命令 DRIVER VOLUME NAME local 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c [root@mcw1 ~]$ docker volume inspect 480c09c2beab5a9aebc191f218 #必须得用全的,不能用短id [] Error: No such volume: 480c09c2beab5a9aebc191f218 [root@mcw1 ~]$ docker volume ls DRIVER VOLUME NAME local 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c [root@mcw1 ~]$ docker volume inspect 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c [ { "CreatedAt": "2022-01-02T05:34:15+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c/_data", "Name": "480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c", "Options": null, "Scope": "local" } ]
容器的数据共享
数据共享主要有三种,可以将单个host挂载源,bind mount到多个容器;可以用managed volume,将文件从host直接cp到不指定挂载源的容器中;还可以使用volume container
容器与host共享数据,用bind ,或者managed volume方式
如下,可以用managed volume,将文件从host直接cp到不指定挂载源的容器目录中。
[root@mcw1 ~]$ docker run -d -p 10006:80 --name=mcw6 -v /usr/local/apache2/htdocs/ httpd 8a2facb7dd5c9d67ae5de20a5be00f05647c9734e4b6ee37516dd4f67a3e5c48 [root@mcw1 ~]$ echo "mcw host data">~/htdocs/index.html [root@mcw1 ~]$ curl 127.0.0.1:10006 <html><body><h1>It works!</h1></body></html> [root@mcw1 ~]$ docker cp ~/htdocs/index.html 8a2f:/usr/local/apache2/htdocs/ [root@mcw1 ~]$ curl 127.0.0.1:10006 mcw host data
容器之间共享数据,用bind挂载到多个容器
[root@mcw1 ~]$ docker run -d -p 10007:80 --name=mcw7 -v ~/htdocs/:/usr/local/apache2/htdocs/ httpd ce8a2f86f553da7c3030996a53f3af628c90c39fd41d3b2b856ad83c96413624 [root@mcw1 ~]$ docker run -d -p 10008:80 --name=mcw8 -v ~/htdocs/:/usr/local/apache2/htdocs/ httpd 2b38c3fbb35b029495807a0417a618f0e11c92062aba112cc8d7c776fbaf7999 [root@mcw1 ~]$ docker run -d -p 10009:80 --name=mcw9 -v ~/htdocs/:/usr/local/apache2/htdocs/ httpd bf07fd7de9830ba1ad0a217a04b3c643af9bc24bcaf2df5d5a8389d6defd7f02 [root@mcw1 ~]$ curl 127.0.0.1:10007 mcw host data [root@mcw1 ~]$ curl 127.0.0.1:10008 mcw host data [root@mcw1 ~]$ curl 127.0.0.1:10009 mcw host data
volume container
[root@mcw1 ~]$ docker create --name vc_data \ > -v ~/htdocs:/usr/local/apache2/htdocs \ > -v /other/useful/tools \ > busybox 6feed5d45bf49c846f608544270fa9f4670f41fadae656e5b356bf37d0ef3f7b [root@mcw1 ~]$ docker inspect vc_data [ { "Id": "6feed5d45bf49c846f608544270fa9f4670f41fadae656e5b356bf37d0ef3f7b", "Created": "2022-01-01T22:11:33.3294462Z", "Path": "sh", "Args": [], "State": { "Status": "created", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 0, "Error": "", "StartedAt": "0001-01-01T00:00:00Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:ffe9d497c32414b1c5cdad8178a85602ee72453082da2463f1dede592ac7d5af", "ResolvConfPath": "", "HostnamePath": "", "HostsPath": "", "LogPath": "", "Name": "/vc_data", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": [ "/root/htdocs:/usr/local/apache2/htdocs" ], "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/d81b36941eb3370ae6c4aab6e732d496a71b48b39e52d4b3b611b4015bef9130-init/diff:/var/lib/docker/overlay2/117fe33877fe8caa7455904e6ecf1c1eb2e4020f8d54a4c5d27e9cff014aa465/diff", "MergedDir": "/var/lib/docker/overlay2/d81b36941eb3370ae6c4aab6e732d496a71b48b39e52d4b3b611b4015bef9130/merged", "UpperDir": "/var/lib/docker/overlay2/d81b36941eb3370ae6c4aab6e732d496a71b48b39e52d4b3b611b4015bef9130/diff", "WorkDir": "/var/lib/docker/overlay2/d81b36941eb3370ae6c4aab6e732d496a71b48b39e52d4b3b611b4015bef9130/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "volume", "Name": "c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908", "Source": "/var/lib/docker/volumes/c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908/_data", "Destination": "/other/useful/tools", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "bind", "Source": "/root/htdocs", "Destination": "/usr/local/apache2/htdocs", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "6feed5d45bf4", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ], "Image": "busybox", "Volumes": { "/other/useful/tools": {} }, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "", "EndpointID": "", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } } } ] [root@mcw1 ~]$ 挂载里面有两个挂载 "Mounts": [ { "Type": "volume", "Name": "c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908", "Source": "/var/lib/docker/volumes/c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908/_data", "Destination": "/other/useful/tools", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "bind", "Source": "/root/htdocs", "Destination": "/usr/local/apache2/htdocs", "Mode": "", "RW": true, "Propagation": "rprivate" } ], 创建三个容器,指定逻辑卷的容器。这样容器中有哪些挂载的文件,多个其它容器使用它后也有这些挂载 [root@mcw1 ~]$ docker run -d -p 10010:80 --name=mcw10 --volumes-from vc_data httpd 11f761db182bf0f7691f3b3c54e93d67addb2cf30d09ce801e1def8f8b6c4988 [root@mcw1 ~]$ docker run -d -p 10011:80 --name=mcw11 --volumes-from vc_data httpd a29fea380748de524248a4e1f735701fd60080b873749ed97c03dd8fda610d9d [root@mcw1 ~]$ docker run -d -p 10012:80 --name=mcw12 --volumes-from vc_data httpd 7f4272c2b40b382476460c3c336f25857d7c421fdeb36dd5f383d071270e7b1b [root@mcw1 ~]$ curl 127.0.0.1:10010 mcw host data [root@mcw1 ~]$ curl 127.0.0.1:10011 mcw host data [root@mcw1 ~]$ curl 127.0.0.1:10012 mcw host data [root@mcw1 ~]$ cat htdocs/index.html mcw host data [root@mcw1 ~]$
data-packed volume container
FROM busybox:latest #使用这个镜像 ADD htdocs /usr/local/apache2/htdocs #将本地目录htdocs添加为容器这个目录 VOLUME /usr/local/apache2/htdocs #等同于-v,不指定挂载源,让docker自己创建挂载源 [root@mcw1 ~]$ cd mcwdocker/ [root@mcw1 ~/mcwdocker]$ cp -a ../htdocs/ . [root@mcw1 ~/mcwdocker]$ vim Dockerfile [root@mcw1 ~/mcwdocker]$ cat Dockerfile htdocs/ [root@mcw1 ~/mcwdocker]$ cat Dockerfile FROM busybox:latest #使用这个镜像 ADD htdocs /usr/local/apache2/htdocs #将本地目录htdocs添加为容器这个目录 VOLUME /usr/local/apache2/htdocs #等同于-v,不指定挂载源,让docker自己创建挂载源 [root@mcw1 ~/mcwdocker]$ docker build -t datapacked . #Dockerfile可以用注释。但是注释不能是放在命令后面 Sending build context to Docker daemon 3.584kB Error response from daemon: dockerfile parse error line 1: FROM requires either one or three arguments [root@mcw1 ~/mcwdocker]$ vim Dockerfile [root@mcw1 ~/mcwdocker]$ cat Dockerfile FROM busybox:latest ADD htdocs /usr/local/apache2/htdocs VOLUME /usr/local/apache2/htdocs [root@mcw1 ~/mcwdocker]$ docker build -t datapacked . Sending build context to Docker daemon 3.584kB Step 1/3 : FROM busybox:latest ---> ffe9d497c324 Step 2/3 : ADD htdocs /usr/local/apache2/htdocs ---> e2b5e7a21788 Step 3/3 : VOLUME /usr/local/apache2/htdocs ---> Running in 7103ed392b15 Removing intermediate container 7103ed392b15 ---> ee835e293230 Successfully built ee835e293230 Successfully tagged datapacked:latest 创建容器并不运行容器 [root@mcw1 ~/mcwdocker]$ docker create --name vc_mcwdata datapacked #以包含需要挂载数据的镜像创建容器vc_mcwdata,并不需要运行 7a50c2670a7d55b019812907c196b0f302a9446f9653cb1965108ed010438c32 [root@mcw1 ~/mcwdocker]$ docker run -d -p 10013:80 --name mcw13 --volumes-from vc_mcwdata httpd 7c30a69d0e337caf3114b06ed9e2a0f3dce7a26e5c7801d5422832519a2306d3 #运行容器,让容器的挂载源 #来自于vc_mcwdata容器,其它容器共享这个容器数据。,提高可移植性 [root@mcw1 ~/mcwdocker]$ curl 127.0.0.1:10013 mcw host data [root@mcw1 ~/mcwdocker]$ docker ps |grep vc_mcwdata [root@mcw1 ~/mcwdocker]$ docker ps -a|grep vc_mcwdata 7a50c2670a7d datapacked "sh" 3 minutes ago Created vc_mcwdata
Data Volume 的生命周期管理
1、备份
将本地镜像存到镜像仓库中,本地镜像都保存在host的/registry目录中,定期备份目录。下面这个本地仓库,好像存在点问题,有时间再研究
[root@mcw1 ~/mcwdocker]$ docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2 98a061dffafcbab97c74375d6e0d59c2d2569494c0a03377c1bea86a4bd4a36f [root@mcw1 ~/mcwdocker]$ ls /myregistry/ [root@mcw1 ~/mcwdocker]$ docker push datapacked Using default tag: latest ^C [root@mcw1 ~/mcwdocker]$ [root@mcw1 ~/mcwdocker]$ docker push 10.0.0.131:5000/datapacked Using default tag: latest The push refers to repository [10.0.0.131:5000/datapacked] An image does not exist locally with the tag: 10.0.0.131:5000/datapacked [root@mcw1 ~/mcwdocker]$ docker images datapacked REPOSITORY TAG IMAGE ID CREATED SIZE datapacked latest ee835e293230 33 minutes ago 1.24MB [root@mcw1 ~/mcwdocker]$ docker push 10.0.0.131:5000/datapacked:latest The push refers to repository [10.0.0.131:5000/datapacked] An image does not exist locally with the tag: 10.0.0.131:5000/datapacked [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/ docker [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/ registry [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/ v2 [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/v2/ blobs repositories [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/v2/repositories/ machangwei [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/v2/repositories/machangwei/ mcw-httpd01 [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/v2/repositories/machangwei/mcw-httpd01/ _layers _manifests _uploads [root@mcw1 ~/mcwdocker]$ ls /mcwregistry/docker/registry/v2/blobs/ sha256 [root@mcw1 ~/mcwdocker]$
2、恢复
数据损坏,直接用之前备份的数据复制到/mytegistry
3、迁移
更新Registry,涉及数据迁移。
(1)docker stop 当前Registry容器
(2)启动新版本容器并mount原有volume
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest
4、销毁
正在使用的一般是无法删除的 [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME local 7c550c0a1efdc7ab9d5cc4d3c6b9760fab2f8fde9081d7ae177456872afa4c32 local 186f29d1968cd35f00310a5dcda1c5351c0c893d99661fdfcfe4739c68a65867 local 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c local c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908 [root@mcw1 ~/mcwdocker]$ docker volume create inspect ls prune rm [root@mcw1 ~/mcwdocker]$ docker volume rm 7c550c0a1efdc7ab9d5cc4d3c6b9760fab2f8fde9081d7ae177456872afa4c32 Error response from daemon: remove 7c550c0a1efdc7ab9d5cc4d3c6b9760fab2f8fde9081d7ae177456872afa4c32: volume is in use - [8a2facb7dd5c9d67ae5de20a5be00f05647c9734e4b6ee37516dd4f67a3e5c48] [root@mcw1 ~/mcwdocker]$ docker ps -a|grep 8a2facb #因为volume有在使用的,所以无法删除 8a2facb7dd5c httpd "httpd-foreground" 2 hours ago Up 2 hours 0.0.0.0:10006->80/tcp, :::10006->80/tcp mcw6 批量删除孤儿volume,慎用,删了就回不来了 docker volume rm $(docker volume ls -q) [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME local 7c550c0a1efdc7ab9d5cc4d3c6b9760fab2f8fde9081d7ae177456872afa4c32 local 186f29d1968cd35f00310a5dcda1c5351c0c893d99661fdfcfe4739c68a65867 local 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c local c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908 [root@mcw1 ~/mcwdocker]$ docker volume rm $(docker volume ls -q) 7c550c0a1efdc7ab9d5cc4d3c6b9760fab2f8fde9081d7ae177456872afa4c32 186f29d1968cd35f00310a5dcda1c5351c0c893d99661fdfcfe4739c68a65867 480c09c2beab5a9aebc191f2183692f94a82baa037924152e9edb6588371d26c c07497348a37550e0f07c3944e05a3a9915fc7ae13163679c676ab9cb0c00908 [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME volume从创建到删除 [root@mcw1 ~/mcwdocker]$ docker volume ls #没有 DRIVER VOLUME NAME [root@mcw1 ~/mcwdocker]$ docker run --name mcw1 -v /test/data busybox #-v未指定host挂载源,创建volume [root@mcw1 ~/mcwdocker]$ docker volume ls # DRIVER VOLUME NAME local 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf [root@mcw1 ~/mcwdocker]$ docker volume inspect 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf [ { "CreatedAt": "2022-01-02T08:24:36+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf/_data", "Name": "556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf", "Options": null, "Scope": "local" } ] [root@mcw1 ~/mcwdocker]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@mcw1 ~/mcwdocker]$ [root@mcw1 ~/mcwdocker]$ [root@mcw1 ~/mcwdocker]$ docker volume rm 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf Error response from daemon: remove 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf: volume is in use - [005f476f8dd474acd88f07852a026fe54106a8bcc10e8c333431459d5024f6b0] [root@mcw1 ~/mcwdocker]$ docker rm mcw1 #删除容器未使用-v,是会遗留下来volume,如果确认需要删除,对于 mcw1 [root@mcw1 ~/mcwdocker]$ docker volume ls #这种孤儿volume,可以docker volume rm删除 DRIVER VOLUME NAME local 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf [root@mcw1 ~/mcwdocker]$ docker volume inspect 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf [ { "CreatedAt": "2022-01-02T08:24:36+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf/_data", "Name": "556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf", "Options": null, "Scope": "local" } ] [root@mcw1 ~/mcwdocker]$ docker volume rm 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf 556abb1e167191ed9aea60a37fbc2a7fc7e93a84b620e63cb13f75d371de24cf [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME [root@mcw1 ~/mcwdocker]$ 指定-v删除volume,这个慎用,可能其它有在用的,回头验证是否就无法删除 [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME [root@mcw1 ~/mcwdocker]$ docker run -d --name mcw2 -v /test/data httpd fa0ce00a840f10dc5712ce13448ac418b90f9a92b761a1231c2a9cc1efbc748d [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME local 6b1d081d0fcf0bcd0b205ca3473ea37f80c65408b49d6129116c2eebb6b7d429 [root@mcw1 ~/mcwdocker]$ docker stop fa0 fa0 [root@mcw1 ~/mcwdocker]$ docker rm fa0 -v fa0 [root@mcw1 ~/mcwdocker]$ docker volume ls DRIVER VOLUME NAME [root@mcw1 ~/mcwdocker]$