5.1 volume 卷命令词条:create、ls、inspect、rm、prune


5.1 volume 卷命令词条:create、ls、inspect、rm、prune

本节摘要:「卷」(volume)是 Docker 托管的数据持久化正牌词条:由守护进程在宿主机专用目录里划出一块,独立于容器生死,可命名、可查看、可备份、可批量清理。本节给全 volume 命令族的语法与义项,用生命周期图钉牢卷与容器的解耦关系,并回收 3.1 里 rm -v 埋下的伏笔。

卷这个词在伍部是主角:它解决"容器可写层靠不住"的问题——容器一删,写进可写层的数据陪葬;写进卷的数据则安然无恙。数据库文件、上传附件这类要传家的数据,一律住卷里。本节先把卷的生命周期立起来,再逐条给命令词条。

生命周期:卷与容器的生死解耦

生命周期:卷与容器的生死解耦

先建立体感:卷的实体是宿主机上的一个目录(Linux 默认在 /var/lib/docker/volumes/ 下),容器只是"借用"它。借用者可以换,被借的目录不动。

词条卡:volume 命令族

docker volume create [名字] # 创建卷,不给名则生成匿名卷 docker volume ls [-q] [--filter] # 列出卷 docker volume inspect 卷 # 看卷的元数据 docker volume rm 卷 [卷...] # 删除指定卷(被引用时拒绝) docker volume prune [-a] [-f] # 批量清未被引用的卷

现场一:创建、挂载与换容器不换数据

$ docker volume create appdata appdata $ docker volume inspect appdata [ { "Name": "appdata", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/appdata/_data", "Labels": {}, "Scope": "local" } ] $ docker run -d --name db -v appdata:/var/lib/postgresql/data postgres:16 $ docker exec db psql -U postgres -c "CREATE TABLE demo(id int);" CREATE TABLE $ docker rm -f db db $ docker run -d --name db2 -v appdata:/var/lib/postgresql/data postgres:16 $ docker exec db2 psql -U postgres -c "\dt" List of relations Schema | Name | Type | Owner --------+-------+-------+---------- public | demo | table | postgres

这组会话是卷词条的灵魂演示:db 删掉后,新容器 db2 挂同一个 appdata,建过的表原样还在。inspect 里的 Mountpoint 指出数据在宿主机的真实位置——备份直接对这个目录打 tar 即可。create 时不给名字会得到一串随机哈希名的匿名卷,这正是 3.1 提到的隐患来源:run 忘了写 -v 卷名:路径 而只写 -v /data 时,Docker 每次都会现场造一个匿名卷,用一次丢一个,越积越多。

现场二:盘点与清理

$ docker volume ls DRIVER VOLUME NAME local appdata local registry-data local 4f8a2c...(匿名卷若干) local 9d31b7... $ docker volume ls -q --filter dangling=true | wc -l 14 $ 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: 4f8a2c... 9d31b7... Total reclaimed space: 3.8GB

prune 只清"当前没有任何容器引用"的卷,命名卷 appdata 与 registry-data 因为各有容器引用而幸免。但注意它的杀伤半径比看起来大:停着的数据库容器引用的卷也算"被引用"吗?算——只要容器还在(哪怕 exited),卷就安全;可容器一旦被 rm,卷立刻降级为可清对象。磁盘紧张时先 docker volume ls 盘点名册,确认没有"暂时下线的珍贵数据",再动手清。

⚠️ 常见坑:卷的默认行为里藏着一条"首次挂载复制"规则——挂载到空卷时,镜像里该路径已有的文件会先复制进卷;但挂载到非空卷时,容器内路径会被卷内容覆盖。数据库镜像能预置初始化脚本全靠前者,而"升级后配置文件变回旧版"的怪事多半是后者。判断不清时先 inspect 卷、看 Mountpoint 里实际有什么。

备份词条:卷的打包带走

$ docker run --rm -v appdata:/source -v /backup:/dest debian:12-slim \ tar czf /dest/appdata-20260903.tar.gz -C /source . $ ls -lh /backup/ -rw-r--r-- 1 root root 46M Sep 3 16:20 appdata-20260903.tar.gz

这条"临时容器备份法"是卷运维的固定套路:起一个一次性容器,把卷挂成 /source、宿主机备份目录挂成 /dest,打完包容器自删(--rm 词条在叁部)。它不需要停数据库容器,代价是备份瞬间数据可能仍在写入,追求一致性时先 pause 或用数据库自带的一致性快照。

备份的另一半是恢复,方向反过来即可:

$ docker run --rm -v appdata:/dest -v /backup:/source debian:12-slim \ tar xzf /source/appdata-20260903.tar.gz -C /dest

演练恢复与演练备份同样重要——备份包打不开的灾难,永远不要等到真出事那天才发现。顺手核对恢复结果也很便宜:再起一个临时容器把卷挂上来 ls 一眼,比在生产容器里翻腾安全得多。

本节要点回顾

  • 卷是 Docker 托管的宿主机目录:生命周期独立于容器,传家数据住这里。
  • 换容器不换卷:同名挂载即数据无缝衔接,inspect 看 Mountpoint 找真实位置。
  • 匿名卷是遗忘的产物:-v 只写容器路径不写卷名时自动生成,dangling 过滤盘点、prune 批清。
  • prune 的安全边界:容器还在(含 exited)引用的卷不动;rm 过容器后卷即裸奔。
  • 临时容器备份法:一次性容器挂卷打 tar,不停库完成备份。

卷管"数据传家",但开发场景要的是另一件事——宿主机上的代码改完立即在容器里生效。绑定挂载词条,下一节开讲。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U