Persistant Data

運行 Container 時,會在 Image 的最後再疊加一層可以讀/寫的 layer。

在 Container 中創建的任何資料會跟著 Container 的刪除而消亡。

如果要將這些資料保留下來,則需要用到 Container Volume 或是 Bind Mount 技術。

Container Volume

將 Container filesystem 中的指定路徑與主機做連結。

  • Volumn 創建及內部資料的更新皆由 Docker 管理,不建議直接操作。
  • Volume 可以同時用在 Linux 及 Windows 系統。
  • Volume 可以安全地被多個 Container 共用。
  • 使用 Volume 可以避免 Container 變肥。

創建 Volume

docker volume create [VOLUME_NAME]

Volume 與 Container 連結

  • docker run -v [VOLUME_NAME]:[FS_PATH_IN_CONTAINER]
    • 沒有事先 docker create [VOLUME_NAME] 也沒關係,Docker 會自己創建。
  • docker run -v [FS_PATH_IN_CONTAINER]:隨著啟動 Container 創建 Anonymous Volume。
  • docker run --mount [MOUNT_CONFIG]

經此設定後,[FS_PATH_IN_CONTAINER] 即與 Volume 同步。

Readonly Volume

docker run -v [VOLUME_NAME]:[FS_PATH_IN_CONTAINER]:ro

看看 Volume 在哪裏

docker volume inspect [VOLUME_NAME]

[
  {
    "CreatedAt": "2019-09-26T02:18:36Z",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/VOLUME_NAME/_data",
    "Name": "VOLUME_NAME",
    "Options": {},
  	"Scope": "local"
	}
]

Mountpoint 即為資料儲存的路徑。

  • 桌機版的 Docker 實際上是運行在 VM 中的,如果要存取 Volume 中的資料,可能需要先存取 VM 中的環境。

Volume Driver

可以透過 Volume Driver 機制,把 Volume 存在其他機器上。

Bind Mount

將 Container filesystem 中的指定路徑與主機中的指定路徑做連結。

  • 使用方式與 Volume,但不交由 Docker 管理。
  • 通常用在將資料掛載至 Container 中使用,例如:Server 所需的靜態資源。

資料與 Container 連結

docker run -v [HOST_PATH]:[FS_PATH_IN_CONTAINER]

  • [HOST_PATH] 設定為 $(pwd) 怎表示為當前路徑。