您的位置:首页 > 运维架构 > Docker

docker 存储

2022-01-01 21:20 691 查看

 

查看系统默认驱动

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]$

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: