容器可拋棄,資料要靠 Volume 留在容器外
容器的可寫層跟容器綁在一起,
docker rm一下就永久消失。資料庫容器如果沒掛 volume,刪掉容器的那一刻所有資料就沒了。
注意 stop 不等於 rm:stop 後容器還在(docker ps -a 看得到,Exited),可寫層資料也還在,docker start 可以復活;只有 rm 才是真的消失。
三種掛載
| 類型 | 寫法 | 用途 |
|---|---|---|
| Named Volume(推薦) | -v pgdata:/var/lib/postgresql/data | 資料庫資料。Docker 管位置,效能最好、跨平台一致 |
| Bind Mount | -v $(pwd):/app | 開發時掛原始碼做熱重載 |
| tmpfs | --tmpfs /tmp | 只在記憶體,容器停就消失 |
docker run -d --name pg -v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=dev123 postgres:16-alpine
docker rm -f pg # 容器整個砍掉
docker run -d --name pg2 -v pgdata:/var/lib/postgresql/data ... # 資料還在🚨 docker volume prune 要小心
它會刪掉所有「目前沒有容器在用」的 volume——包括你只是暫時停掉的那個資料庫。刪掉沒有回頭路。(docker system prune -a 則不會動 volume,除非加 --volumes。)
開發用 bind mount 有個經典坑 → bind mount 掛原始碼會蓋掉 image 裡的 node_modules。