Docker 数据卷入门实战:容器删了,数据还在
关键词:Docker 数据卷、Volume、Bind Mount、数据持久化
上一篇我们用 Compose 一条命令跑起了“网页 + 接口”两个服务。但有个问题还没解决:容器本身是不存数据的——docker compose down 一删容器,容器里写的东西就跟着没了。如果接口服务要存点数据,或者网页要经常改内容,总不能每次重建都从头来。这时候就该用数据卷:把数据存在容器外面,容器换了,数据还在。
本文接着上一篇的 my-app 结构讲,假设服务器上已经装好 Docker 和 Docker Compose。
一、数据卷是什么
可以把它理解成“容器外挂的一个文件夹”:容器里某个目录挂到外面,容器往那个目录写东西,实际落到了宿主机上。容器删了重建,只要重新挂同一个卷,数据就又回来了。
Docker 里常用的挂载有两种,先分清再用:
| 方式 | 写法 | 数据存在哪 | 适合干什么 |
|---|---|---|---|
| 具名卷(Named Volume) | mydata:/data |
Docker 自己管理的一块地方 | 数据库、接口存的数据,不用你操心路径 |
| 绑定挂载(Bind Mount) | ./web:/usr/share/nginx/html |
你指定的宿主机目录 | 网页源码这种你经常要改的文件 |
一句话记:数据交给 Docker 管,用具名卷;文件你要经常改,用绑定挂载。
二、先看问题:容器删了数据就没了
不用卷的时候,验证一下问题本身。进到上一篇的 my-app 目录,跑起服务后往接口容器里写个文件做实验:
docker compose up -d
docker compose exec api sh -c "echo hello > /app/data.txt"
docker compose down
docker compose up -d
docker compose exec api cat /app/data.txt
最后一步会报错找不到文件——容器重建后,里面写的东西已经没了。这就是数据卷要解决的问题。
三、给接口服务加一个具名卷
改一下上一篇的 docker-compose.yml,给 api 加一行 volumes,再在文件底部声明这个卷:
services:
web:
build: ./web
ports:
- "80:80"
api:
build: ./api
ports:
- "8000:8000"
volumes:
- apidata:/app/data
volumes:
apidata:
逐行看:
volumes: - apidata:/app/data表示把名叫apidata的卷挂到容器的/app/data目录- 冒号左边是卷名,右边是容器里的路径,和端口映射“左边主机、右边容器”的方向是一个思路
- 文件底部的
volumes: apidata:是声明这个卷,不写它 Compose 会报错
再跑一遍刚才的实验,这次把文件写到挂载的目录里:
docker compose up -d
docker compose exec api sh -c "echo hello > /app/data/data.txt"
docker compose down
docker compose up -d
docker compose exec api cat /app/data/data.txt
这次能读出 hello——容器换了一批,数据还在。
四、给网页服务加一个绑定挂载
网页源码是你经常要改的,适合绑定挂载:宿主机上的 web 目录直接挂进容器,改了 index.html,刷新浏览器就能看到,不用重新构建镜像。
services:
web:
build: ./web
ports:
- "80:80"
volumes:
- ./web:/usr/share/nginx/html
这里 ./web 是宿主机上 docker-compose.yml 旁边的 web 目录,/usr/share/nginx/html 是上一篇 Dockerfile 里 Nginx 放网页的目录。挂上去之后,容器里的网页文件就是宿主机上的这份,改动即时生效。
但要注意一个细节:挂载会盖住容器里原来的目录内容。上面这个例子没问题,因为 web 目录里的 index.html 就是要放的网页;如果宿主机目录是空的,容器里那个目录看起来也会是空的,别误以为是镜像坏了。
五、日常管理就四个命令
| 命令 | 作用 |
|---|---|
docker volume ls |
列出所有卷 |
docker volume inspect apidata |
看某个卷存在宿主机的哪个位置 |
docker compose down |
停掉并删掉容器,但卷保留,数据还在 |
docker compose down -v |
连卷一起删,数据清空 |
最后一条最容易误伤:平时重建服务只用 docker compose down 就够了,-v 是“连数据一起不要了”才用的,敲之前先确认。
六、两个新手最容易踩的坑
1. down 和 down -v 分不清
数据丢了,十有八九是多敲了 -v。记住:down 只删容器,down -v 连卷一起删。删卷之前没有回收站,删了就真没了。
2. 绑定挂载的路径写错
./web 前面的 ./ 不能省,省了它会被当成具名卷名,而不是当前目录。还有宿主机路径和容器路径别写反:左边是你电脑(服务器)上的位置,右边是容器里的位置,写反了挂载就对不上。
结语
从 Nginx 到 Docker,再到 Compose 和数据卷,这条线就完整了:单容器是“把服务装箱”,Compose 是“把一整套服务写成清单”,数据卷是“让数据活得比容器久”。下一篇可以换个方向:给这套服务加上反向代理和 HTTPS,让它能用域名对外提供服务。
- 点赞
- 收藏
- 关注作者
评论(0)