1、容器数据卷
容器技术使用rootfs机制与Namespace,构建出与宿主机隔离开的文件
数据卷解决的问题:Docker将应用与运行环境打包成容器运行,用户希望在运行过程中产生的部分数据是可以持久化的,并且容器之间可以实现数据通信
数据卷:Docker中的数据可以存储在类似与虚拟机磁盘的介质
##为容器添加一个数据卷,有的docker.io是Docker.io
[root@localhost ~]# docker run -it --name volume -v /web/app docker.io/centos
[root@f813ab8fe31d /]# ls web/
app
[root@f813ab8fe31d /]# exit
exit
##查看挂载信息,宿主机已经在/var/lib/docker/volumes/下自动生成了挂载目录
[root@localhost ~]# docker inspect volume
......
"Mounts": [
{
"Type": "volume",
"Name": "2ba3b608fa7c1a988f21c6dd0c9e24d2e73f781bdea4a9ab97be8c73bcf31664",
"Source": "/var/lib/docker/volumes/2ba3b608fa7c1a988f21c6dd0c9e24d2e73f781bdea4a9ab97be8c73bcf31664/_data",
"Destination": "/web/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
......
......
##后台运行了一个被命名为test的Nginx容器,并为它挂载数据卷
[root@localhost ~]# docker run -it -d --name test -v /webapp:/app docker.io/nginx
3d68fc2e2bc7047ccb9fee36cbcf1a7829585014f2cd03e91c9f523c61bd49ff
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d68fc2e2bc7 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp test
2、docker与宿主机之间实现数据共享
##创建一个容器,将容器/app目录挂载至宿主机的/web/webapp路径下
[root@localhost ~]# docker run -it --name test11 -v /web/webapp:/app docker.io/centos
##查看下面目录多了一个app
[root@365951f5b2d7 /]# ls
app bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
##此时web目录下没有文件
[root@localhost ~]# ls /
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var web webapp
[root@localhost ~]# cd /web/webapp/
[root@localhost ~]# ls
[root@localhost ~]#
##在宿主机上创建两个文件
[root@localhost webapp]# touch a.txt b.txt
[root@localhost webapp]# ls
a.txt b.txt
##启用之前的容器
[root@localhost ~]# docker start 365
365
##进入容器
[root@localhost ~]# docker attach 3659
##切换到app目录查看有两个文件,已经挂载成功
[root@365951f5b2d7 /]# cd app/
[root@365951f5b2d7 app]# ls
a.txt b.txt
##在容器目录创建文件c.txt
[root@365951f5b2d7 app]# touch c.txt
[root@365951f5b2d7 app]# ls
a.txt b.txt c.txt
##在宿主机上查看挂在卷,多了c.txt
[root@localhost ~]# cd /web/webapp
[root@localhost webapp]# ls
a.txt b.txt c.txt
3、对挂载设置权限
[root@localhost ~]# docker run -it --name volumee -v /src/test:/webapp:ro docker.io/centos
[root@fba37305807b /]# ##ctrl+P+Q退出容器且不关闭容器
[root@localhost ~]# docker inspect volumee
.
.
.
"Mounts": [
{
"Type": "bind",
"Source": "/src/test",
"Destination": "/webapp",
"Mode": "ro",
"RW": false,
"Propagation": "rprivate"
}
],
.
.
.
##创建一个文件,并且写入文本
[root@localhost ~]# cd /src/test
[root@localhost test]# ls
[root@localhost test]# echo hello world > a.txt
[root@localhost test]# cat a.txt
hello world
##进入上面创建的容器,挂载目录webapp中查看c.txt内容,与宿主机的同步
[root@localhost test]# docker attach fba37
[root@fba37305807b /]# cd /webapp
[root@fba37305807b webapp]# ls
a.txt
[root@fba37305807b webapp]# cat a.txt
hello world
4、备份数据卷
##创建一个名为data-volum1的CentOS容器
##对其挂载的两个数据卷volume1和volume2进行备份
[root@localhost ~]# docker run -it --name data-volum1 -v /var/volume1 -v /var/volume2 docker.io/centos
[root@7d52377f4f41 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7d52377f4f41 /]# ls /var
adm crash empty games kerberos local log nis preserve spool volume1 yp
cache db ftp gopher lib lock mail opt run tmp volume2
##对容器挂载目录中创建文件并添加内容
[root@7d52377f4f41 /]# echo hello container1 > /var/volume1/a.txt
[root@7d52377f4f41 /]# echo hello container > /var/volume2/a.txt
[root@7d52377f4f41 /]# cat /var/volume1/a.txt
hello container1
[root@7d52377f4f41 /]# cat /var/volume2/b.txt
hello container
##
[root@localhost ~]# docker run --rm --volumes-from data-volum1 -v /root/backup:/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1
##--rm: 该容器执行命令后自动删除
##挂载宿主机/root/backup目录到容器的/backup目录
##创建、运行容器
/var/volume1/
/var/volume1/a.txt
tar: Removing leading `/' from member names
##执行tar命令,备份数据卷,停止并删除容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d52377f4f41 centos "/bin/bash" 9 minutes ago Up 9 minutes data-volum1
##备份文件已存在
[root@localhost ~]# ls /root/backup/
backup1.tar
##相同方法对volume2文件进行备份
[root@localhost ~]# docker run --rm --volumes-from data-volum1 -v /root/backup:/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2
tar: Removing leading `/' from member names
/var/volume2/
/var/volume2/a.txt
[root@localhost ~]# ls /root/backup/
backup1.tar backup2.tar
##解压备份文件
[root@localhost ~]# tar -xf backup/backup1.tar
[root@localhost ~]# tree .
.
├── anaconda-ks.cfg
├── apache.yml
├── backup
│ ├── backup1.tar
│ └── backup2.tar
├── dockerfile
├── Dockerfile
├── hello.sh
├── test
│ ├── a.txt
│ └── b.txt
├── test0
└── var
└── volume1
└── a.txt
5 directories, 10 files
5、恢复数据卷
##进入上面的容器
[root@localhost backup]# docker attach data-volum1
[root@7d52377f4f41 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
##查看文件存在
[root@7d52377f4f41 /]# ls /var/volume1/
a.txt
[root@7d52377f4f41 /]# ls /var/volume2/
b.txt
##删除两个目录下的文件
[root@7d52377f4f41 /]# rm -rf /var/volume1/a.txt
[root@7d52377f4f41 /]# rm -rf /var/volume2/b.txt
##恢复volume1目录下的a.txt
[root@localhost ~]# docker run --rm --volumes-from data-volum1 -v /root/backup/:/backup docker.io/centos tar xvf /backup/backup1.tar -C /
var/volume1/
var/volume1/a.txt
##恢复volume1目录下的b.txt
[root@localhost ~]# docker run --rm --volumes-from data-volum1 -v /root/backup/:/backup docker.io/centos tar xvf /backup/backup2.tar -C /
var/volume2/
var/volume2/b.txt
##进入容器查看已经删除的文件已经恢复
[root@localhost ~]# docker attach data-volum1
[root@7d52377f4f41 /]# ls /var/volume1/
a.txt
[root@7d52377f4f41 /]# ls /var/volume2/
a.txt