為什麼需要資料持久化?
容器被刪除後,裡面的所有檔案變更都會一併消失。如果是資料庫、使用者上傳的檔案這類重要資料,就需要透過掛載(mount)的方式,把資料存放在容器外部,容器重建也不會遺失。
Bind Mount:掛載主機目錄
podman run -d \
-v /home/user/data:/var/lib/mydata \
--name myapp myimage
-v 主機路徑:容器內路徑,主機上對該路徑的修改會即時反映到容器內,反之亦然,適合開發環境或設定檔。
Volume:Podman 管理的資料卷
podman volume create mydata # 建立 volume
podman volume ls # 列出所有 volume
podman run -d -v mydata:/var/lib/mydata --name myapp myimage
podman volume inspect mydata # 查看 volume 實際存放位置
Volume 由 Podman 統一管理位置與權限,比起 bind mount 更適合用在正式環境的資料庫等場景。
網路:連接埠對應
podman run -d -p 8080:80 nginx
-p 主機埠:容器埠 讓外部可以透過主機的連接埠存取容器內的服務。
網路:自訂網路讓容器互相溝通
podman network create mynet
podman run -d --network mynet --name db postgres
podman run -d --network mynet --name app myapp
在同一個自訂網路中的容器,可以直接用容器名稱當作主機名稱互相連線(例如 app 容器可以連到 db:5432),不需要知道對方的 IP。
SELinux 與 Volume
在啟用 SELinux 的系統上,掛載目錄時常會看到 :Z 或 :z 後綴:
podman run -v /home/user/data:/data:Z myimage
這會自動調整目錄的 SELinux context,讓容器能正常存取,否則可能會遇到「權限明明對了卻讀不到檔案」的情況。