从Docker-08-企业级私有仓库我们已经了解到了 Docker
的 volumes
,当我们需要将 Host
上的目录共享给多个容器或者希望实现容器数据持久化(即使容器被删除,数据卷也不会被删除)的时候,我们就需要用到 volumes
。
什么是 volumes
volumes
是一个可供一个或多个容器使用的特殊目录,它绕过了 UFS
。
voulmes 有什么特点
- 容器间可共用
- 修改 volumes 即可生效
- 修改 volumes 不影响镜像
- volumes 具有持久性
volumes 的用法
参数:-v
或者--mount
这两个参数的区别:
使用
-v
进行卷挂载,如果Host
上的卷不存在,则会自动创建。使用
--mount
进行卷挂载,如果Host
的卷不存在,则会报错并退出。我们一般推荐使用
--mount
,因为它更加优雅。
直接挂载 test
到 apline
容器中的/test
:
查看当前的 volumes
列表:
在 test
下创建一个 test.test
的文件,并且将 test
挂载到另一个容器 apline2
的/test2
下:
查看 test 这个 volume 的详细信息:
root@phyger-xubuntu:/home/phyger# docker volume inspect test [ { "CreatedAt": "2020-06-26T11:29:45+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/test/_data", "Name": "test", "Options": null, "Scope": "local" } ] root@phyger-xubuntu:/home/phyger# 复制代码
volumes 的清理
一般情况下,volumes
独立于容器的生命周期,即容器被删除时 volumes
不受影响,但如果用户想要删除容器的时候也删除 volumes
,可以在删除容器的时候加上-v
参数进行同步删除。
你可能发现了名为 test
的 volume
还存在,为什么没有被删除?这是因为我们在使用 volume
的时候使用了它的名称,使用 volume
的名称进行挂载的卷用 docker rm -v
是无法删除的,因为 docker rm -v
只删除链接数为 0
的匿名卷。
举个例子:
root@phyger-xubuntu:/home/phyger# docker run -it -v /test --name alpine_test alpine sh / # ls bin dev etc home lib media mnt opt proc root run sbin srv sys test tmp usr var / # ^Proot@phyger-xubuntu:/home/phyger# docker volume ls DRIVER VOLUME NAME local a4588769d7f4a23745c632124fd308f233aac0c8be880cfedc61f5db8da7d241 local nexus-data local nexus-etc local nexus-opt local test root@phyger-xubuntu:/home/phyger# 复制代码
上面 VOLUME NAME
为一串 ID
的就是匿名卷。(一般不建议使用匿名卷)
root@phyger-xubuntu:/home/phyger# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19aea8644fe2 alpine "sh" 2 minutes ago Up About a minute alpine_test df5b9dc452b3 sonatype/nexus3 "sh -c ${SONATYPE_DI…" 22 hours ago Up 39 minutes 0.0.0.0:8081-8082->8081-8082/tcp nexus3 root@phyger-xubuntu:/home/phyger# docker rm -f -v 19aea8644fe2 19aea8644fe2 root@phyger-xubuntu:/home/phyger# docker volume ls DRIVER VOLUME NAME local nexus-data local nexus-etc local nexus-opt local test root@phyger-xubuntu:/home/phyger# 复制代码
如上,匿名卷使用 docker rm -v
参数可以删除掉。
对于有命名的 volume
,我们使用 docker volume rm
进行删除:
root@phyger-xubuntu:/home/phyger# docker volume rm test test root@phyger-xubuntu:/home/phyger# docker volume ls DRIVER VOLUME NAME local nexus-data local nexus-etc local nexus-opt root@phyger-xubuntu:/home/phyger#