docker 数据管理
1、挂载本地的目录到容器里
[root@localhost ~]# docker run -itd -v /data/:/data/ --name centos centos bash
4d5b368379e7733b7ec20c026c1d480698f8dea4fb2d0c9ebfa1c8b5ac9d5936
### -v 用来指定挂载目录, : 前面的/data/为宿主机本地目录,: 后面的为容器里的目录,会在容器中自动创建。
--name 指定容器的名字,不指定的话会随机一个,如下文的 NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d5b368379e7 centos "bash" 35 seconds ago Up 33 seconds centos
be56cb15e2c7 registry:latest "/entrypoint.sh /etc…" 4 hours ago Up 4 hours 0.0.0.0:5000->5000/tcp registry
2、挂载数据卷
就是把另一个容器挂载的刚刚创建的挂载本地目录的容器上。就是新建一个容器,并且使用上一个容器的数据卷。
[root@localhost ~]# docker run -itd --volumes-from centos centos bash
eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837
查询容器详情信息
[root@localhost ~]# docker inspect eebbb27a182e
[
{
"Id": "eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837",
"Created": "2020-11-06T21:37:51.662626023Z",
"Path": "bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 35115,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-11-06T21:37:52.20839083Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837/hostname",
"HostsPath": "/var/lib/docker/containers/eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837/hosts",
"LogPath": "/var/lib/docker/containers/eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837/eebbb27a182e88e5a428ca4818889c2bba4275ab9900d9cc1340457d44f60837-json.log",
"Name": "/upbeat_wescoff",
"RestartCount": 0,
"Driver": "devicemapper",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": [
"centos"
],
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "shareable",
"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,
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": 0,
"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": {
"DeviceId": "32",
"DeviceName": "docker-253:0-3666754-ec37fcd1a0f096b63ba7eef5f3e7441763b1ef3ab6815a9f37988b0df0f45d81",
"DeviceSize": "10737418240"
},
"Name": "devicemapper"
},
**"Mounts": [
{
"Type": "bind",
"Source": "/data",
"Destination": "/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"**
}
],
"Config": {
"Hostname": "eebbb27a182e",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": true,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"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": "26d9a8c1c014106f9ef4935a15d528524d30bb6bc236caecb74d9d8a1d32f187",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/26d9a8c1c014",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "11b4bbba08def7e06da0ce42db315acfd1f33332b6ab0222ab01eb7092116c13",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:04",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "793e77d072ed2f4d8eefcc5927d10669247c16bb706a6de8807e7eccfa224998",
"EndpointID": "11b4bbba08def7e06da0ce42db315acfd1f33332b6ab0222ab01eb7092116c13",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:04",
"DriverOpts": null
}
}
}
}
]
[root@localhost ~]# docker inspect -f{{.Mounts}} eebbb27a182e
[{bind /data /data true rprivate}]
2、定义数据卷容器
需要多个容器之间共享数据,就要搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷
方法一、
首先创建一个数据卷容器,再把其他容器挂载该数据卷
[root@localhost ~]# docker run -itd -v /data/ --name testvol centos bash
5f083acc9671a7943c6bc8397a9f04910ce147b8acf6a65f5a3df7e06ae901ae
[root@localhost ~]# docker run -itd --volumes-from testvol centos bash
306c3a4f7f5bb78136fe887cb23b0c1406f11a1eaa75d73c37d07f10166026fd
可以查看一下
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 8eef3696a7200b4b12147531b2eaccecfaac09c83fc7728ef301d3b0ff606f04
local 020bc38f1d7b23a9980b15f3d71c987e259e3485f68626e3db62fabd88dac53a
方法二、
首先,创建一个数据卷,再挂载rongqi
[root@localhost ~]# docker volume create aaa
aaa
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 8eef3696a7200b4b12147531b2eaccecfaac09c83fc7728ef301d3b0ff606f04
local 020bc38f1d7b23a9980b15f3d71c987e259e3485f68626e3db62fabd88dac53a
local aaa
[root@localhost ~]# docker run -itd -v aaa:/data --name aaa centos bash
ad720ce49c8034340034ded3feacfb48830e40528b06c868f48e344ef1032d29
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 8eef3696a7200b4b12147531b2eaccecfaac09c83fc7728ef301d3b0ff606f04
local 020bc38f1d7b23a9980b15f3d71c987e259e3485f68626e3db62fabd88dac53a
local aaa
3、数据卷的备份
首先,创建一个共享目录,
然后,把这个目录挂载到容器里,并且这个容器使用之前创建的数据卷容器,再不进入容器执行压缩命令。
最后,查看一下挂载的目录,有压缩包
(就是说,在容器里/backup目录压缩的包,备份到了宿主机里的/data/backup目录里)
[root@localhost ~]# mkdir /data/backup
[root@localhost ~]# docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data
tar: Removing leading `/' from member names
/data/
[root@localhost ~]# ll /data/backup
total 12
-rw-r--r--. 1 root root 10240 Nov 7 06:32 data.tar
4、数据卷的恢复
首先,一定要重新新建一个数据卷容器
然后,在新建一个新的容器并挂载该数据卷容器,再把tar包解压
[root@localhost ~]# docker run -itd -v /data/ --name testvol2 centos bash
56e7803f89546f12c370721a15d770311c62bbe88723db526ccf16a74838f5c7
[root@localhost ~]# docker run --volumes-from testvol2 -v /data/backup/:/backup centos tar xf /backup/data.tar
最后补充