Docker 卷与持久化数据 学习笔记

该文为《深入浅出Docker》的学习笔记,感谢查看,如有错误,欢迎指正

一、简介

Docker同时支持持久化非持久化数据,区别如下:

  • 非持久化数据的生命周期和容器一致,容器删除以后,数据也会删除
  • 持久化数据保存在卷中,即使容器被删除,卷仍然保留,数据还在,并且该卷还能重新挂载到新的容器或者服务中
  • 卷与容器之间是解耦
二、卷的创建和管理
2.1 创建卷

命令:docker volume create

[root@huanzi-001 docker]# docker volume create huanzi-volume
huanzi-volume
[root@huanzi-001 docker]# docker volume ls
DRIVER              VOLUME NAME
local               huanzi-volume
[root@huanzi-001 docker]#

2.2 查看卷详情

命令:docker volume inspect

[root@huanzi-001 docker]# docker volume inspect huanzi-volume 
[
    {
        "CreatedAt": "2020-02-05T11:25:55 08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/huanzi-volume/_data",
        "Name": "huanzi-volume",
        "Options": {},
        "Scope": "local"
    }
]
[root@huanzi-001 docker]# 

DriverScope都是local,说明卷使用默认 local 驱动创建,只能用于当前 Docker 主机上的容器。
Mountpoint说明卷位于Docker主机上的位置。

[root@huanzi-001 /]# cd /var/lib/docker/volumes/huanzi-volume/_data/
[root@huanzi-001 _data]# ls
[root@huanzi-001 _data]# pwd
/var/lib/docker/volumes/huanzi-volume/_data
[root@huanzi-001 _data]# 

目前卷中无数据。

2.3 挂载卷至容器

使用docker container run传入--mount参数完成挂载

[root@huanzi-001 _data]# docker container run -dit --name my-nginx --mount source=jj-volume,target=/hh nginx:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.
c0fdca34429aebf4ff0851fa5f136a9c2c91e5841fbde6ca4cebed707c73c235
[root@huanzi-001 _data]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c0fdca34429a        nginx:latest        "nginx -g 'daemon of…"   14 seconds ago      Up 13 seconds       80/tcp              my-nginx
[root@huanzi-001 _data]# docker volume ls
DRIVER              VOLUME NAME
local               huanzi-volume
local               jj-volume
[root@huanzi-001 _data]# 

上述命令表明,创建了一个my-nginx的容器,并且将卷jj-volume挂载至了容器的/hh路径下。
由于没有jj-volume这个卷,系统会自动创建一个卷。

  1. 如果指定了已经存在的卷,Docker会使用该卷
  2. 如果指定的卷不存在,Docker会创建一个卷

2.4 卷的持久化数据

查看容器内部,可以看到hh这个路径,只要是容器中hh路径下的数据,全部会同步至卷中,进行持久化

[root@huanzi-001 _data]# docker container exec -it my-nginx bash
root@c0fdca34429a:/# ls
bin  boot  dev	etc  hh  home  lib  lib64  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@c0fdca34429a:/#

给hh中新增一个文件,看一下Docker主机中,卷的路径下,是否有该文件

root@c0fdca34429a:/# echo "hh like jj" >/hh/jj.txt
root@c0fdca34429a:/# cat /hh/jj.txt 
hh like jj
root@c0fdca34429a:/# exit
exit
[root@huanzi-001 _data]# cd /var/lib/docker/volumes/jj-volume/_data/
[root@huanzi-001 _data]# ls
jj.txt
[root@huanzi-001 _data]# cat jj.txt 
hh like jj
[root@huanzi-001 _data]# 

可以看到,卷中已经有jj.txt文件了,且数据也正常。
现在我们删除容器,观察一下卷中数据是否还在。

[root@huanzi-001 _data]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c0fdca34429a        nginx:latest        "nginx -g 'daemon of…"   12 minutes ago      Up 12 minutes       80/tcp              my-nginx
[root@huanzi-001 _data]# docker container stop my-nginx
my-nginx
[root@huanzi-001 _data]# docker container rm my-nginx
my-nginx
[root@huanzi-001 _data]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@huanzi-001 _data]# 

容器已删除,看一下卷数据

[root@huanzi-001 _data]# cd /var/lib/docker/volumes/jj-volume/_data/
[root@huanzi-001 _data]# ls
jj.txt
[root@huanzi-001 _data]# cat jj.txt 
hh like jj
[root@huanzi-001 _data]# 

可以看到,即使容器删除,卷中数据仍在

我们还可以把jj-volume再挂载到一个新的容器或者服务中,我们以服务为例

[root@huanzi-001 _data]# docker service create --name nginx-hh --mount source=jj-volume,target=/jj --replicas 3 nginx:latest
4vnkqul4ba17ceg75iimuswjf
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
[root@huanzi-001 _data]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
4vnkqul4ba17        nginx-hh            replicated          3/3                 nginx:latest        

如果不指定--replicas,就只会创建一个副本,看一下副本分布情况

[root@huanzi-001 _data]# docker service ps nginx-hh 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
98mwqyhxogk0        nginx-hh.1          nginx:latest        huanzi-002          Running             Running 16 seconds ago                        
ts5i8luuvtfe        nginx-hh.2          nginx:latest        huanzi-001          Running             Running 16 seconds ago                       
l700p2ylqaip        nginx-hh.3          nginx:latest        huanzi-001          Running             Running 16 seconds ago 

分布在2个节点,看一下容器内部是否有jj文件夹,以及jj.txt文件。

  1. huanzi-001节点
[root@huanzi-001 _data]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
090c040ffe46        nginx:latest        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        80/tcp              nginx-hh.3.l700p2ylqaip1z89mpm66d1ks
06a00af9d548        nginx:latest        "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        80/tcp              nginx-hh.2.ts5i8luuvtfeqw8byzzomjsx8
[root@huanzi-001 _data]# docker container exec -it 090c040ffe46 bash
root@090c040ffe46:/# ls
bin  boot  dev	etc  home  jj  lib  lib64  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@090c040ffe46:/# cd jj
root@090c040ffe46:/jj# ls
jj.txt
root@090c040ffe46:/jj# cat jj.txt 
hh like jj
root@090c040ffe46:/jj# 
  1. huanzi-002节点
[root@huanzi-002 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e1ebd66742f4        nginx:latest        "nginx -g 'daemon of…"   10 minutes ago      Up 10 minutes       80/tcp              nginx-hh.1.98mwqyhxogk0k67j66tdjyuph
[root@huanzi-002 ~]# docker container exec -it e1ebd66742f4 bash
root@e1ebd66742f4:/# ls
bin  boot  dev	etc  home  jj  lib  lib64  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@e1ebd66742f4:/# cd jj
root@e1ebd66742f4:/jj# ls
root@e1ebd66742f4:/jj# 

可以看到,卷中数据,只有卷所在的Docker主机中的容器,能看到数据,由于另一个工作节点是另一台主机,因此看不到数据。

有一种共享存储的方法,可以在集群节点间共享存储,一般采用外部存储作为共享,但是需要注意数据损坏的情况发生,一般是通过在应用程序中避免。


2.5 删除卷

命令:docker volume prune:删除所有未使用的卷
命令:docker volume rm:删除未被使用的指定卷

使用中的卷无法删除

感谢阅读,有兴趣的小伙伴可以关注我的公众号DevOps探索之旅,大家一起学习进步
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值