容器可拋棄,資料要靠 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