volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。
默认容器的数据存储
在这里我们在容器中创建一些模拟的数据,然后模式容器停止或删除后数据是否丢失。
## 创建数据[root@myserver ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa0316d74ef5d bulletinboard:1.0 "docker-entrypoint.s…" 55 minutes ago Up 16 minutes 0.0.0.0:8000->8080/tcp bb[root@myserver ~]# docker exec -it bb bashroot@a0316d74ef5d:/usr/src/app# lsDockerfile app.js fonts node_modules package.json server.jsLICENSE backend index.html package-lock.json readme.md site.cssroot@a0316d74ef5d:/usr/src/app# cdroot@a0316d74ef5d:~# lsroot@a0316d74ef5d:~# mkdir dataroot@a0316d74ef5d:~# lsdataroot@a0316d74ef5d:~# cd data/root@a0316d74ef5d:~/data# lsroot@a0316d74ef5d:~/data# echo 12323 > tst.txtroot@a0316d74ef5d:~/data# cat tst.txt12323root@a0316d74ef5d:~/data# pwd/root/dataroot@a0316d74ef5d:~/data### 停止并重新启动容器数据还是存在的## 删除容器(加入对镜像做了修改)数据丢失 [root@myserver ~]# docker run -itd --name bb bulletinboard:1.098e14379e2109c9230d1d265ac586ce3bba433efb7d2ef544ef93cb58c859f0a[root@myserver ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES98e14379e210 bulletinboard:1.0 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 8080/tcp bb[root@myserver ~]# docker exec -it bb bashroot@98e14379e210:/usr/src/app# cdroot@98e14379e210:~# lsroot@98e14379e210:~#
VOLUME使用方法
我们来通过docker volume命令管理volume。 创建volume到将volume挂载到容器中。
## 创建一个volume[root@myserver ~]# docker volume create --name myvolumemyvolume[root@myserver ~]# docker volume lsDRIVER VOLUME NAMElocal myvolume[root@myserver ~]# docker volume inspect myvolume[ { "CreatedAt": "2020-07-11T21:52:26-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/myvolume/_data", "Name": "myvolume", "Options": {}, "Scope": "local" }]## 在挂载点创建数据[root@myserver ~]# cd /var/lib/docker/volumes/myvolume/_data[root@myserver _data]# ls[root@myserver _data]# echo 11111 > a.txt[root@myserver _data]# lsa.txt[root@myserver _data]# cd -/root## 将卷挂载给容器[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.01ed40ff338280def96b4c395d33977219b3e3a47e10444cf23d16f4bb83e0e27[root@myserver ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1ed40ff33828 bulletinboard:1.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 8080/tcp bb[root@myserver ~]# docker exec -it bb bashroot@1ed40ff33828:/usr/src/app# cdroot@1ed40ff33828:~# lsroot@1ed40ff33828:~# cd /root@1ed40ff33828:/# lsbin data etc lib media opt root sbin sys usrboot dev home lib64 mnt proc run srv tmp varroot@1ed40ff33828:/# cd data/root@1ed40ff33828:/data# lsa.txtroot@1ed40ff33828:/data# cat a.txt11111root@1ed40ff33828:/data# echo 12323423 >> a.txtroot@1ed40ff33828:/data# cat a.txt1111112323423root@1ed40ff33828:/data# cdroot@1ed40ff33828:~# mkdir /data/testroot@1ed40ff33828:~# echo 12312312 > /data/test/a.txtroot@1ed40ff33828:~# exitexit### 删除容器后重新启动容器发现数据还在。[root@myserver ~]# docker rm --force bbbb[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.017f0178d062e8fe041aae55229e1f522237ca5753e01515a451c68d9c2aaf51b[root@myserver ~]# docker exec -it bb bashroot@17f0178d062e:/usr/src/app# cd /data/root@17f0178d062e:/data# lsa.txt testroot@17f0178d062e:/data# ls test/a.txt
容器挂载VOLUME的另外一种方式
我们也可以在启动容器的时候通过-v参数指定volume,如果volume不存在则会自动创建。
[root@myserver ~]# docker run -itd --name cc -v /tmp/test:/data:rw bulletinboard:1.0c0fd785c403040c0f3fa0840a738359da5f54aa28f4201cdada0e8de19f8f88a[root@myserver ~]# docker volume lsDRIVER VOLUME NAMElocal myvolume[root@myserver ~]# cd /tmp/test/[root@myserver test]# ls[root@myserver test]# echo 111 >a.txt[root@myserver test]#[root@myserver test]#[root@myserver test]# lsa.txt[root@myserver test]#[root@myserver test]#[root@myserver test]# cd[root@myserver ~]# docker exec -it cc bashroot@c0fd785c4030:/usr/src/app# cd /data/root@c0fd785c4030:/data# lsa.txtroot@c0fd785c4030:/data#
DOCKER 存储卷
volume 创建后默认挂载数据目录:/var/lib/docker/volumes/volumeID/_data
[root@myserver ~]# docker volume inspect myvolume[ { "CreatedAt": "2020-07-11T21:59:36-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/myvolume/_data", "Name": "myvolume", "Options": {}, "Scope": "local" }]
共享VOLUME
--volumes-from 容器名称,共享容器的volume
方式一:挂载相同的volume
[root@myserver volumes]# docker run -itd --name server01 -v vtest:/data webserver:v1007d2a504410e435c260d6271d970056fc629880a6654b6777bec206008c4006docker run -itd --name server02 -v vtest:/data webserver:v1##创建数据[root@myserver volumes]# docker volume inspect vtest[ { "CreatedAt": "2020-07-13T07:59:36-04:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/vtest/_data", "Name": "vtest", "Options": null, "Scope": "local" }][root@myserver volumes]# echo 123>/var/lib/docker/volumes/vtest/_data/a.txt
方式二: 使用--volumes-from
docker run -itd --name server02 --volumes-from server01 webserver:v1# 将server01容器所挂载的卷同步给server02
#Docker# #容器云# #DevOps#