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
其他的選項可以自己去試一試。