目录
前言
一、容器中的管理数据
1、方式
2、数据卷
3、数据卷容器
二、数据卷
1、创建数据卷
2、查看信息
2.1 列出已知的所有卷
2.2 显示一个或多个卷上的详细信息
2.3 查看 /var/lib/docker/volumes路径下,会发现所创建的数据卷
3、 删除数据卷
4、 挂载数据卷
三、数据卷容器
1、创建数据卷容器
2、查看数据卷
3、启动一个挂载数据卷的容器
4、查看容器挂载的数据卷信息
5、进入容器修改文件,删掉容器,起一个新容器,文件仍在
6、多个容器挂载相同数据卷容器
四、数据卷容器的备份、恢复
1、 备份
2、恢复
总结
Docker 数据管理在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
数据卷 Data Volumes 容器内数据直接映射到本地主机环境;
数据卷容器(Data Volume Containers 使用特定容器维护数据卷;
数据卷就是在宿主中可以在容器之间进行共享和重用的一系列和文件和文件夹,通过docker run -v命令可以将数据卷挂载到对应的容器目录空间,进行文件读取,容器卷特性如下
* 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便
* 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
* 对数据卷的更新不会影响镜像,解耦了应用和数据
* 卷会一直存在,直到没有容器使用,可以安全地卸载它
已经存在一个挂载了数据卷的容器;由于数据卷在容器之前是可以共享的,所以此时如果存在其他容器通过docker run --volumes-from [容器别名]命令挂载到该容器上,则该容器可以被称之为数据卷容器,其主要功能是提供数据卷供其他容器挂载。当数据卷容器宕机后,并不会造成数据卷的回收卸载,数据卷会继续挂载在其他容器中。当全部挂载该数据卷的容器全部宕机后,该数据卷才会卸载。
[root@docker ~]# docker volume create vtest1
vtest1
[root@docker ~]# docker volume create
93960c97d9ecdb820403d32e288e3fc844dcdadee757b46b3a7bb20a9c7950c0
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local 93960c97d9ecdb820403d32e288e3fc844dcdadee757b46b3a7bb20a9c7950c0
local vtest1
[root@docker ~]# docker volume inspect vtest1
[
{
"CreatedAt": "2020-09-13T22:08:32+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vtest1/_data",
"Name": "vtest1",
"Options": {},
"Scope": "local"
}
]
[root@docker ~]# ls /var/lib/docker/volumes
93960c97d9ecdb820403d32e288e3fc844dcdadee757b46b3a7bb20a9c7950c0
vtest1
Volume 只有在下列情况下才能被删除:
1)docker rm -v删除容器时添加了-v选项
2)docker run --rm运行容器时添加了--rm选项
否则,会在/var/lib/docker/volumes目录中遗留很多不明目录。
可以使用下面方式找出,然后删除_data目录下的数据文件
[root@docker]# docker inspect huihui|grep /var/lib/docker/volumes
"Source": "/var/lib/docker/volumes/97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b/_data",
可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:
[root@docker]# docker run -d -P --name huihui -v /www docker.io/centos
69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
[root@docker]# docker volume ls
DRIVER VOLUME NAME
local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local 97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b
local data_volume
[root@docker]# docker rm -vf huihui
huihui
[root@docker]# docker volume ls
DRIVER VOLUME NAME
local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local data_volume
可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。
注意:
-v后面的映射关系是"宿主机文件/目录:容器里对应的文件/目录",其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
数据卷权限:
挂载的数据默认为可读写权限。
但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。如下实例:
1)挂载宿主机文件到容器上
[root@docker ~]# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
[root@docker ~]# docker run -t -i --name test -v /etc/web.list:/etc/web.list:ro docker.io/centos /bin/bash
[root@e21a3fefa3ae /]# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
[root@e21a3fefa3ae /]# echo "192.168.1.115" >> /etc/web.list
bash: /etc/web.list: Read-only file system
[root@e21a3fefa3ae /]#
在宿主机上修改共享数据
[root@docker ~]# echo "192.168.1.115" >> /etc/web.list
[root@docker ~]#
[root@e21a3fefa3ae /]# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
192.168.1.115
2)挂载宿主机目录到容器上
[root@docker ~]# mkdir /var/huanqiupc
[root@docker ~]# echo "test" > /var/huanqiupc/test
[root@docker ~]# echo "test1" > /var/huanqiupc/test1
[root@docker ~]# docker run -t -i --name hqsb -v /var/huanqiupc:/opt/huantime docker.io/centos /bin/bash
[root@87cf93ce46a9 /]# cd /opt/huantime/
[root@87cf93ce46a9 huantime]# ls
test test1
[root@87cf93ce46a9 huantime]# cat test
test
[root@87cf93ce46a9 huantime]# cat test1
test1
[root@87cf93ce46a9 huantime]# echo "1231" >>test
[root@87cf93ce46a9 huantime]# echo "44444" >>test1
宿主机上查看
[root@docker ~]# cat /var/huanqiupc/test
test
1231
[root@docker ~]# cat /var/huanqiupc/test1
test1
44444
3)挂载多个目录
[root@docker ~]# mkdir /opt/data1 /opt/data2
[root@docker ~]# echo "123456" > /opt/data1/test1
[root@docker ~]# echo "abcdef" > /opt/data2/test2
[root@docker ~]# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -t -i docker.io/ubuntu /bin/bash
root@cf2d57b9bee1:/# ls /var/www/data1
test1
root@cf2d57b9bee1:/# ls /var/www/data2
test2
root@cf2d57b9bee1:/# cat /var/www/data1/test1
123456
root@cf2d57b9bee1:/# cat /var/www/data2/test2
abcdef
root@cf2d57b9bee1:/# echo "date1" >> /var/www/data1/test1
root@cf2d57b9bee1:/# echo "date2" >> /var/www/data2/test2
bash: /var/www/data2/test2: Read-only file system
root@cf2d57b9bee1:/#
[root@docker opt]# docker volume create wangxu
wangxu
[root@docker opt]# docker volume ls
DRIVER VOLUME NAME
local wangxu
[root@docker xiaoniao]# docker volume inspect wangxu
[
{
"CreatedAt": "2019-08-08T12:15:36+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/wangxu/_data",
"Name": "wangxu",
"Options": {},
"Scope": "local"
}
]
[root@docker opt]# docker run -d -p 82:80 -v wangxu:/usr/share/nginx/html --name web-3 nginx
dcd933b52a86429ca962113058073f92b362b6f40d25ba0d44d4084cf6167669
[root@docker opt]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcd933b52a86 nginx "nginx -g 'daemon of…" 10 seconds ago Up 8 seconds 0.0.0.0:82->80/tcp web-3
[root@docker ~]# docker inspect web-4
"Mounts": [
{
"Type": "volume",
"Name": "wangxu",
"Source": "/var/lib/docker/volumes/wangxu/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
[root@docker opt]# docker exec -it web-3 /bin/bash
root@dcd933b52a86:/# cd /usr/share/nginx/html/
root@dcd933b52a86:/usr/share/nginx/html# ls
50x.html index.html
root@dcd933b52a86:/usr/share/nginx/html# echo 'docker-test' > index.html
[root@docker opt]# docker stop web-3
web-3
[root@docker opt]# docker rm web-3
web-3
[root@docker opt]# docker run -d -p 83:80 -v wangxu:/usr/share/nginx/html --name web-4 nginx
1ffa3f8e10414776956570b19d88ef8db91fd868ee35c4cc92daa18bef8bcef0
[root@docker opt]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ffa3f8e1041 nginx "nginx -g 'daemon of…" 5 seconds ago Up 2 seconds 0.0.0.0:83->80/tcp web-4
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ffa3f8e1041 nginx "nginx -g 'daemon of…" 28 minutes ago Up 33 seconds 0.0.0.0:83->80/tcp web-4
a7275fc9ab5c nginx "nginx -g 'daemon of…" 35 minutes ago Up 35 minutes 0.0.0.0:80-81->80-81/tcp web2
[root@docker ~]# docker run -d -p 84:80 --volumes-from web-4 --name web-5 nginx
751a38fb4f99a8c15ec61ca55769b682a0f8dce6c191149f0136c0c344870fa4
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
751a38fb4f99 nginx "nginx -g 'daemon of…" 6 seconds ago Up 2 seconds 0.0.0.0:84->80/tcp web-5
1ffa3f8e1041 nginx "nginx -g 'daemon of…" 28 minutes ago Up 45 seconds 0.0.0.0:83->80/tcp web-4
a7275fc9ab5c nginx "nginx -g 'daemon of…" 35 minutes ago Up 35 minutes 0.0.0.0:80-81->80-81/tcp web2
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c330d1e5721 centos:7 "/bin/bash" 21 hours ago Up 33 seconds db2
f2df8cdc7b2b centos:7 "/bin/bash" 21 hours ago Up 37 seconds db1
a33fb1c89ad2 centos:7 "/bin/bash" 21 hours ago Up 15 seconds vdbctos7
# docker run --name 'backupcon' --volumes-from vdbctos7 -v $(pwd):/backup centos:7 tar cvf /backup/backup.tar /dbdata
具体分析:
首先利用 centos:7 镜像创建了一个容器backupcon;
使用--volumes-from vdbctos7 参数来让 backupcon容器挂载vdbctos7数据卷容器的数据卷(即dbdata 数据卷);
使用 -v $(pwd):/backup参数来挂载本地的当前目录到backupcon容器的/backup目录。
backupcon容器创建启动后,使用 tar cvf /backup/backup.tar /dbdata 命令将 /dbdata下内容备份为容器内的/backup/backup.tar文件。
即宿主机当前目录下的backup.tar
例如:完成备份操作后让backupcon容器销毁
[root@docker ~]# mkdir /root/vbackup
[root@docker ~]# docker run --rm --name 'backupcon' --volumes-from vdbctos7 -v /root/vbackup:/backup centos:7 tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/db1.txt
/dbdata/db2.txt
/dbdata/vdbctos7.txt
/dbdata/vdbdata.txt
[root@docker ~]# ls /root/vbackup/
backup.tar
# docker run --name 'backupcon2' --volumes-from vdbctos7 -v $(pwd):/backup centos:7 tar xvf /backup/backup.tar -C /
具体分析:
首先利用 centos:7 镜像创建了一个容器backupcon2;
使用--volumes-from vdbctos7参数来让 backupcon容器挂载vdbctos7数据卷容器的数据卷(即dbdata 数据卷);
使用 -v $(pwd):/backup参数来挂载本地的当前目录到backupcon2容器的/backup目录。
backupcon2容器创建启动后,使用 tar xvf /backup/backup.tar -C / 命令将 /backup/backup.tar拆到到 backupcon2容器的 / 目录下(或者其他目录,然后文件迁移到容器之间共享的卷中)。
所以,与 dbdata 数据卷有映射关联的容器都可以看到恢复的数据。
实例:先把 vdbctos7容器的卷数据删除,然后恢复。
[root@f2df8cdc7b2b dbdata]# rm -rf db1.txt db2.txt vdbctos7.txt vdbdata.txt
[root@f2df8cdc7b2b dbdata]# ll
total 0
[root@docker~]# docker run --rm --name 'backupcon2' --volumes-from vdbctos7 -v /root/vbackup:/backup2 centos:7 tar xvf /backup2/backup.tar -C /
dbdata/
dbdata/db1.txt
dbdata/db2.txt
dbdata/vdbctos7.txt
dbdata/vdbdata.txt
[root@f2df8cdc7b2b dbdata]# ls
db1.txt db2.txt vdbctos7.txt vdbdata.txt
利用数据卷对其中的数据进行进行备份、恢复和迁移,其实就是创建新容器,挂载数据卷(挂载目录自定义),实现容器之间数据共享,最后使用 tar命令打包拆包。