该文为《深入浅出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]#
Driver
和Scope
都是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
这个卷,系统会自动创建一个卷。
- 如果指定了已经存在的卷,Docker会使用该卷
- 如果指定的卷不存在,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
文件。
- 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#
- 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探索之旅
,大家一起学习进步