赞
踩
管理方式:
数据卷
数据卷容器
一个或多个容器专门指定绕过Union File System的目录,为持续性或共享数据提供一些有用的功能:
数据卷可以在容器间共享和重用
数据卷数据改变是直接修改的
数据卷数据改变不会被包括在容器中
数据卷是持续性的,直到没有容器使用它们
新建数据卷 /data
[root@controller ~]# docker run --name testdocker2 -v /data -it centos /bin/bash
[root@353023e9517c /]# ls -ld /data/
drwxr-xr-x 2 root root 6 Apr 1 03:24 /data/
[root@353023e9517c /]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 108G 8.0G 100G 8% /
tmpfs tmpfs 68M 0 68M 0% /dev
tmpfs tmpfs 4.1G 0 4.1G 0% /sys/fs/cgroup
shm tmpfs 68M 0 68M 0% /dev/shm
/dev/vda1 xfs 108G 8.0G 100G 8% /data
tmpfs tmpfs 4.1G 0 4.1G 0% /proc/asound
tmpfs tmpfs 4.1G 0 4.1G 0% /proc/acpi
tmpfs tmpfs 4.1G 0 4.1G 0% /proc/scsi
tmpfs tmpfs 4.1G 0 4.1G 0% /sys/firmware
查看数据卷目录
docker inspect testdocker2 |grep /var/lib/docker/volumes
"Source": "/var/lib/docker/volumes/249223bc043ad59ec60cfc069d69ec99e9b0106f366a7f8389c50496d40ea0fb/_data",
可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据
参数:
-v后面的映射关系是"宿主机文件/目录:容器里对应的文件/目录",其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
1)挂载宿主机文件到容器上
[root@controller ~]# cat /etc/testnode
This is a test data file
[root@controller ~]# docker run -it --name testdocker3 -v /etc/testnode:/etc/testnode docker.io/centos /bin/bash
[root@10e59ae7c8aa /]# cat /etc/testnode
This is a test data file
[root@10e59ae7c8aa /]# echo "This is added content in container" >> /etc/testnode
[root@10e59ae7c8aa /]# cat /etc/testnode
This is a test data file
This is added content in container
[root@controller ~]# cat /etc/testnode
This is a test data file
This is added content in container
2) 挂载宿主机目录到容器上
root@controller ~]# mkdir /var/xugcom
[root@controller ~]# echo "testdocker2" > /var/xugcom/testdocker2
[root@controller ~]# echo "testdocker3" > /var/xugcom/tsetdocker3
[root@controller ~]# docker run -it --name xug -v /var/xugcom:/opt/xugtime centos /bin/bash
[root@ece9f309f7ab /]# cd /opt/xugtime/
[root@ece9f309f7ab xugtime]# ls
testdocker2 tsetdocker3
[root@ece9f309f7ab xugtime]# cat testdocker2
testdocker2
[root@ece9f309f7ab xugtime]# echo "20220401" >> testdocker2
[root@ece9f309f7ab xugtime]# exit
exit
[root@controller ~]# cat /var/xugcom/testdocker2
testdocker2
20220401
挂载多个目录
[root@controller ~]# mkdir /opt/data1 /opt/data2
[root@controller ~]# echo "123456" > /opt/data1/test1
[root@controller ~]# echo "098765" > /opt/data2/test2
[root@controller ~]# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -it centos /bin/bash
[root@27e7f0c0477b /]# ls /var/www/data1
test1
[root@27e7f0c0477b /]# ls /var/www/data2
test2
[root@27e7f0c0477b /]# cat /var/www/data1/test1
123456
[root@27e7f0c0477b /]# cat /var/www/data2/test2
098765
启动一个名为testvolume容器,此容器包含两个数据卷/var/volume1和/var/volume2(这两个数据卷目录是在容器里的,容器创建的时候会自动生成这两目录)
# 此行命令未加 -it 参数,所以这个容器创建好之后是登陆不了的。要想创建容器后能正常登陆,就需要添加上面两个参数
[root@controller ~]# docker run -v /var/volume1 -v /var/volume2 --name testvolume centos /bin/bash
#查看宿主机上与数据卷对应的目录路径:
[root@controller ~]# docker inspect testvolume |grep /var/lib/docker/volumes/
"Source": "/var/lib/docker/volumes/5dc2ab11abc737577df00757391493c83dfac441a51fcd2c38f079ce754abb1d/_data",
"Source": "/var/lib/docker/volumes/d896cfc0e49397e6dcb996306054bbe9f45729fd0b783d588efa993519868bce/_data",
#创建AppContainer容器,挂载testvolume容器中的数据卷
[root@controller ~]# docker run -it --rm --volumes-from testvolume --name AppContainer centos /bin/bash
[root@6f46b9402c8e /]# ls /var/volume1
[root@6f46b9402c8e /]# ls /var/volume2
[root@6f46b9402c8e /]# echo "Content of volume1" > /var/volume1/test1
[root@6f46b9402c8e /]# echo "Content of volume2" > /var/volume2/test2
#创建一个容器xu,包含两个数据卷/var/volume1和/var/volume2(这两个目录是在容器里的数据卷路径)
[root@controller ~]# docker run -it -v /var/volume1 -v /var/volume2 --name xu centos /bin/bash
#add test data
[root@9f10977912dd volume1]# echo "test1" > test1
[root@9f10977912dd volume1]# echo "test2" > test2
[root@9f10977912dd volume1]# echo "test3" > test3
[root@9f10977912dd volume1]# ls
test1 test2 test3
[root@9f10977912dd volume1]# cd ../volume2
[root@9f10977912dd volume2]# echo "test4" > test4
[root@9f10977912dd volume2]# echo "test5" > test5
[root@9f10977912dd volume2]# echo "test6" > test6
[root@9f10977912dd volume2]# ls
test4 test5 test6
#启动容器
[root@controller ~]# docker start xu
xu
[root@controller ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f10977912dd centos "/bin/bash" 3 minutes ago Up 4 seconds xu
#为了利用数据卷容器备份,使用--volumes-from标记来创建一个加载xu容器卷的容器,并从主机挂载当前目录到容器的/backup目录。并备份xu卷中的数据,执行完成之后删除容器--rm,此时备份就在当前的目录下了。
#备份xu容器中的/var/volume1数据卷数据
#命令中的-i和-t这两个参数加不加都可以;--rm加上,备份后就会自动删除这个容器,如果不加这个--rm参数,那么备份后的容器就会保留,docker ps -a就会查看到
[root@controller ~]# docker run -it --rm --volumes-from xu -v $(pwd):/backup centos tar cvf /backup/backup1.tar /var/volume1
tar: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test2
/var/volume1/test3
#备份xu容器中的/var/volume2数据卷数据
[root@controller ~]# docker run -it --rm --volumes-from xu -v $(pwd):/backup centos tar cvf /backup/backup2.tar /var/volume2
tar: Removing leading `/' from member names
/var/volume2/
/var/volume2/test4
/var/volume2/test5
/var/volume2/test6
#备份xu容器中的/var/volume1 /var/volume2数据卷数据
[root@localhost ~]# docker run -i -t --rm --volumes-from xu -v $(pwd):/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2
tar: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test11
/var/volume1/test111
/var/volume2/
/var/volume2/test2
/var/volume2/test22
/var/volume2/test222
[root@controller ~]# ls
192.168.143.192 admin-openrc anaconda-ks.cfg backup1.tar backup2.tar cirros-0.4.0-x86_64-disk.img original-ks.cfg
先创建一个容器,并挂载要备份的容器数据卷,再挂载数据卷(pwd):/backup目录到容器/backup,在容器中执行备份/data目录到/backup,也就是备份到宿主机$(pwd):/backup目录。
恢复给同一个容器或者另外的容器,新建容器并解压备份文件到新的容器数据卷
语法
docker run -t -i -d -v /test --name test4 ubuntu:14.04 /bin/bash
docker run --rm --volumes-from test4 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/test.tar -C /
1)恢复数据给同一个容器
#先删除数据卷
[root@controller ~]# docker attach xu
[root@9f10977912dd /]# ls /var/volume1
test1 test2 test3
[root@9f10977912dd /]# ls /var/volume2
test4 test5 test6
[root@9f10977912dd /]# rm -rf /var/volume1 /var/volume2
rm: cannot remove '/var/volume1': Device or resource busy
rm: cannot remove '/var/volume2': Device or resource busy
[root@9f10977912dd /]# ls /var/volume1
[root@9f10977912dd /]# ls /var/volume2
# 恢复
[root@controller ~]# docker run --rm --volumes-from xu -v $(pwd):/backup centos tar xvf /backup/backup2.tar -C /
var/volume1/
var/volume1/test1
var/volume1/test2
var/volume1/test3
var/volume2/
var/volume2/test4
var/volume2/test5
var/volume2/test6
2)恢复数据给另外的容器,新建容器并解压备份文件到新的容器数据卷
#新建一个容器backuptest,将上面备份的数据卷数据恢复到这个新容器里。
docker run -it -v /var/volume1 -v /var/volume2 --name backuptest centos /bin/bash
[root@controller ~]# docker run --rm --volumes-from backuptest -v $(pwd):/backup centos tar xvf /backup/backup2.tar -C /
var/volume1/
var/volume1/test1
var/volume1/test2
var/volume1/test3
var/volume2/
var/volume2/test4
var/volume2/test5
var/volume2/test6
Volume 只有在下列情况下才能被删除:
1)docker rm -v删除容器时添加了-v选项
2)docker run --rm运行容器时添加了–rm选项
docker 允许把多个容器连接在一起,相互交互信息。docker 链接会创建一种容器父子级别的关系,其中父容器可以看到其子容器提供的信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。