第六章 容器数据卷

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值