本文是《Docker必知必會系列》第五篇,原文發佈於個人博客:悟塵紀。
數據持久化存儲與性能調優
數據持久保存
默認情況下,在容器內創建的所有文件都存儲在可寫容器層上。這意味着當該容器不再存在時,數據也將丟失。
爲了讓數據脫離容器持久保存,Docker 提供了兩個選項來將文件持久存儲在主機中: volume
和 bind mount
。如果您在 Linux 上運行 Docker,則還可以使用 tmpfs 掛載。如果您在 Windows 上運行 Docker,則還可以使用命名管道。
- **volume(卷)**存儲在主機文件系統的一部分中,該文件系統由 Docker 管理(
/var/lib/docker/volumes/
在 Linux 上)。非 Docker 進程不應修改文件系統的這一部分。卷是在 Docker 中持久保存數據的最佳方法。 - **bind mount(綁定掛載)**可以存儲在主機系統上的任何位置。它們甚至可能是重要的系統文件或目錄。Docker 主機或 Docker 容器上的非 Docker 進程可以隨時對其進行修改。
tmpfs
掛載 僅存儲在主機系統的內存中,並且永遠不會寫入主機系統的文件系統中。
volume
和 bind mount
都可以使用 -v
或 --volume
標誌安裝到容器中,但是兩者的語法略有不同。
關於掛載類型的更多詳細信息:Manage data in Docker
掛載卷性能調優
在 macOS(和其他非 Linux 平臺)上,保證容器內和主機文件一致性的開銷很大。然而,在許多情況下,容器與主機之間不需要完美的一致性。區分不同情況可以顯着提高性能。
通過在 docker run -v
, --volume
的 option 中指定 cached
或 delegated
,可以顯着提高 Docker Desktop for Mac 上已裝載卷訪問的性能。您可以根據情況調整所需的一致性級別:
consistent
:默認值,完美的一致性,即主機和容器實時一致。cached
:主機具有權威性。容器執行的寫操作對主機是立即可見的,但是在主機上執行的寫操作可能不會立即反應在容器內。delegated
:容器的內容具有權威性。提供最弱保證,由容器執行的寫操作可能不會立即反映在主機文件系統上,提供的性能要比其他配置好得多。
爲每個掛載卷獨立設置緩存策略,例如:
docker run \
-v /Users/lixl.cn/project:/project:cached \
-v /host/another-path:/mount/another-point:consistent \
alpine command