容器的可写层不是长期保存重要数据的可靠位置。练习持久化时,先分清两种常见挂载:命名卷由 Docker 管理,bind mount 直接对应宿主机上的路径。
用命名卷做一个最小实验
docker volume create notes-data
docker run --rm --mount type=volume,source=notes-data,target=/data busybox sh -c 'echo hello > /data/note.txt'
docker run --rm --mount type=volume,source=notes-data,target=/data busybox cat /data/note.txt两个容器都用 --rm 运行,容器结束后会消失,但第二次仍能读到 hello,因为数据留在 notes-data 卷中。可以用 docker volume inspect notes-data 看它的元信息。
bind mount 适合什么时候
本地开发时,想让容器直接读取宿主机上的配置或源码,可用 --mount type=bind,source=绝对路径,target=容器内路径。路径必须真实存在,并要考虑读写权限。挂载敏感目录或 Docker socket 会扩大容器对主机的访问能力,练习时不要这样做。
别把持久化误当备份
命名卷能跨容器生命周期保存数据,却不能代替异地备份。重要资料仍要验证备份文件能否恢复。docker compose down -v 会删除 Compose 管理的卷;看到 -v 先确认数据是否还需要。
参考:Docker volumes 文档 · Compose volumes 文档
封面插画:unDraw(https://undraw.co/license)。
增加只读挂载验证
练习 bind mount 时先 mkdir -p ~/linux-lab/share 并写入一个测试文件,再把该目录的绝对路径只读挂入容器。验证能读取,但写入返回只读错误。SELinux 环境还需理解挂载标签,不要直接关闭保护机制。命名卷即便容器被删也可能存在,明确不再需要且已核对后再清理;external 卷不由 compose down -v 删除。
内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
评论 (0)