Docker - Docker Volume及Volume命令详解
什么是数据卷(Volume)
Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。
所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。
为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。
为什么需要数据卷(Volume)
这得从Docker容器的文件系统说起。出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:
- 不能在宿主机上很方便地访问容器中的文件。
- 无法在多个容器之间共享数据。
- 当容器删除时,容器中产生的数据将会丢失。
为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Docker文件系统的形式存在于宿主机中。数据卷的最大特点是:其生存周期独立于容器的生存周期。
数据卷的设计目的就是数据的持久化,因为其生存周期独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。所以数据卷可以带来以下好处:
- 数据卷可在容器之间共享或重用数据。
- 数据卷的更改可以直接生效。
- 数据卷的生命周期一直持续到没有容器使用它为止。
- 对数据卷操作不会影响到镜像本身。
- 数据卷可以完成容器到宿主机、宿主机到容器以及容器到容器之间的数据共享。
Volume命令
通过docker volume help
可以查看Volume有哪些命令。
[root@izoq008ryseuupz docker]# docker volume help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
通过docker volume COMMAND --help
可以查看每个Volume命令的详情。
docker volume ls
列出所有的数据卷。
[root@izoq008ryseuupz docker]# docker volume ls --help
Usage: docker volume ls [OPTIONS]
List volumes
Aliases:
ls, list
Options:
-f, --filter filter Provide filter values (e.g. 'dangling=true')
--format string Pretty-print volumes using a Go template
-q, --quiet Only display volume names
查看本地所有的数据卷。
docker volume ls
[root@izoq008ryseuupz docker]# docker volume ls
DRIVER VOLUME NAME
local 3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local 5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local 8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local 08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local 31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local 208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local 3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
只需要展示数据卷的名称,可以使用-q
选项。
docker volume ls -q
[root@izoq008ryseuupz docker]# docker volume ls -q
3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
其他的选项可以自己去试一试。
docker volume create
创建一个数据卷。
[root@izoq008ryseuupz docker]# docker volume create --help
Usage: docker volume create [OPTIONS] [VOLUME]
Create a volume
Options:
-d, --driver string Specify volume driver name (default "local")
--label list Set metadata for a volume
-o, --opt map Set driver specific options (default map[])
创建数据卷centos-volume
。
[root@izoq008ryseuupz docker]# docker volume create centos-volume
centos-volume
[root@izoq008ryseuupz docker]# docker volume ls
DRIVER VOLUME NAME
local 3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local 5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local 8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local 08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local 31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local 208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local 3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local centos-volume
local db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
其他的选项可以自己去试一试。
docker volume inspect
展示一个或多个数据卷的详细信息。
[root@izoq008ryseuupz _data]# docker volume inspect --help
Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...]
Display detailed information on one or more volumes
Options:
-f, --format string Format the output using the given Go template
展示数据卷centos-volume
的详细信息。
[root@izoq008ryseuupz _data]# docker volume inspect centos-volume
[
{
"CreatedAt": "2020-11-25T17:30:06+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/centos-volume/_data",
"Name": "centos-volume",
"Options": {},
"Scope": "local"
}
]
其他的选项可以自己去试一试。
docker volume prune
移除未使用的数据卷。
[root@izoq008ryseuupz _data]# docker volume prune --help
Usage: docker volume prune [OPTIONS]
Remove all unused local volumes
Options:
--filter filter Provide filter values (e.g. 'label=<label>')
-f, --force Do not prompt for confirmation
docker volume prune
[root@izoq008ryseuupz _data]# docker volume ls
DRIVER VOLUME NAME
local 3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local 5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local 6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local 8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local 08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local 31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local 208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local 3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4
local centos-volume
local db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
[root@izoq008ryseuupz _data]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
centos-volume
08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
Total reclaimed space: 94.79MB
[root@izoq008ryseuupz _data]# docker volume ls
DRIVER VOLUME NAME
local 6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4
其他的选项可以自己去试一试。
docker volume rm
移除一个或多个数据卷,不能移除被容器使用的数据卷。
[root@izoq008ryseuupz _data]# docker volume rm --help
Usage: docker volume rm [OPTIONS] VOLUME [VOLUME...]
Remove one or more volumes. You cannot remove a volume that is in use by a container.
Aliases:
rm, remove
Examples:
$ docker volume rm hello
hello
Options:
-f, --force Force the removal of one or more volumes
查询容器centos.9
的详细信息。
[root@izoq008ryseuupz ~]# docker inspect centos.9
可以得到容器ID、数据卷挂载等信息。
"Id": "857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49"
"Mounts": [
{
"Type": "volume",
"Name": "8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496",
"Source": "/var/lib/docker/volumes/8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496/_data",
"Destination": "centos-nwe",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
[root@izoq008ryseuupz ~]# docker volume rm 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
Error response from daemon: remove 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496: volume is in use - [857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49]
很显然不能移除该数据卷,因为它正在被容器ID为857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49
(容器名称为centos.9
)的容器使用。
所以需要先移除该容器(只停止是不行的)。
[root@izoq008ryseuupz ~]# docker stop centos.9
centos.9
[root@izoq008ryseuupz ~]# docker rm centos.9
centos.9
再移除该数据卷。
[root@izoq008ryseuupz ~]# docker volume rm 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
[root@izoq008ryseuupz ~]# docker volume ls
DRIVER VOLUME NAME
local 6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local 3799beaa4dfc538280ecb0817a57ad92d160b6a46611e914c5c5ab832a66d3a7
local c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4
其他的选项可以自己去试一试。
Docker Volume及Volume命令详解就介绍到这里。
写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!