volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。
默认容器的数据存储
在这里我们在容器中创建一些模拟的数据,然后模式容器停止或删除后数据是否丢失。
## 创建数据
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0316d74ef5d 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 bash
root@a0316d74ef5d:/usr/src/app# ls
Dockerfile app.js fonts node_modules package.json server.js
LICENSE backend index.html package-lock.json readme.md site.css
root@a0316d74ef5d:/usr/src/app# cd
root@a0316d74ef5d:~# ls
root@a0316d74ef5d:~# mkdir data
root@a0316d74ef5d:~# ls
data
root@a0316d74ef5d:~# cd data/
root@a0316d74ef5d:~/data# ls
root@a0316d74ef5d:~/data# echo 12323 > tst.txt
root@a0316d74ef5d:~/data# cat tst.txt
12323
root@a0316d74ef5d:~/data# pwd
/root/data
root@a0316d74ef5d:~/data#
## 停止并重新启动容器数据还是存在的
## 删除容器(加入对镜像做了修改)数据丢失
[root@myserver ~]# docker run -itd --name bb bulletinboard:1.0
98e14379e2109c9230d1d265ac586ce3bba433efb7d2ef544ef93cb58c859f0a
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98e14379e210 bulletinboard:1.0 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 8080/tcp bb
[root@myserver ~]# docker exec -it bb bash
root@98e14379e210:/usr/src/app# cd
root@98e14379e210:~# ls
root@98e14379e210:~#
Volume使用方法
我们来通过docker volume
命令管理volume。创建volume到将volume挂载到容器中。
## 创建一个volume
[root@myserver ~]# docker volume create --name myvolume
myvolume
[root@myserver ~]# docker volume ls
DRIVER VOLUME NAME
local 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]# ls
a.txt
[root@myserver _data]# cd -
/root
## 将卷挂载给容器
[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.0
1ed40ff338280def96b4c395d33977219b3e3a47e10444cf23d16f4bb83e0e27
[root@myserver ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ed40ff33828 bulletinboard:1.0 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 8080/tcp bb
[root@myserver ~]# docker exec -it bb bash
root@1ed40ff33828:/usr/src/app# cd
root@1ed40ff33828:~# ls
root@1ed40ff33828:~# cd /
root@1ed40ff33828:/# ls
bin data etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
root@1ed40ff33828:/# cd data/
root@1ed40ff33828:/data# ls
a.txt
root@1ed40ff33828:/data# cat a.txt
11111
root@1ed40ff33828:/data# echo 12323423 >> a.txt
root@1ed40ff33828:/data# cat a.txt
11111
12323423
root@1ed40ff33828:/data# cd
root@1ed40ff33828:~# mkdir /data/test
root@1ed40ff33828:~# echo 12312312 > /data/test/a.txt
root@1ed40ff33828:~# exit
exit
### 删除容器后重新启动容器发现数据还在。
[root@myserver ~]# docker rm --force bb
bb
[root@myserver ~]# docker run -itd --name bb -v myvolume:/data:rw bulletinboard:1.0
17f0178d062e8fe041aae55229e1f522237ca5753e01515a451c68d9c2aaf51b
[root@myserver ~]# docker exec -it bb bash
root@17f0178d062e:/usr/src/app# cd /data/
root@17f0178d062e:/data# ls
a.txt test
root@17f0178d062e:/data# ls test/
a.txt
容器挂载volume的另外一种方式
我们也可以在启动容器的时候通过-v参数指定volume,如果volume不存在则会自动创建。
[root@myserver ~]# docker run -itd --name cc -v /tmp/test:/data:rw bulletinboard:1.0
c0fd785c403040c0f3fa0840a738359da5f54aa28f4201cdada0e8de19f8f88a
[root@myserver ~]# docker volume ls
DRIVER VOLUME NAME
local 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]# ls
a.txt
[root@myserver test]#
[root@myserver test]#
[root@myserver test]# cd
[root@myserver ~]# docker exec -it cc bash
root@c0fd785c4030:/usr/src/app# cd /data/
root@c0fd785c4030:/data# ls
a.txt
root@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:v1
007d2a504410e435c260d6271d970056fc629880a6654b6777bec206008c4006
docker 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
更多精彩请关注 DevOps云学堂
添加微信小助手devopsvip 回复 "加群",自动加入群聊
点亮 ,告诉大家你也在看