tmpfs 掛載
卷(Volumes)和繫結掛載(bind mounts)允許您在宿主機和容器之間共享檔案,以便即使在容器停止後資料也能持久化。
如果您在 Linux 上執行 Docker,您還有第三個選擇:tmpfs 掛載。當您建立一個帶有 tmpfs 掛載的容器時,該容器可以在其可寫層之外建立檔案。
與卷和繫結掛載不同,tmpfs 掛載是臨時的,並且只儲存在宿主機的記憶體中。當容器停止時,tmpfs 掛載會被移除,寫入其中的檔案不會被持久化。
當您不希望資料在宿主機或容器內持久化時,最適合使用 tmpfs 掛載。這可能是出於安全原因,或者當您的應用程式需要寫入大量非永續性狀態資料時,為了保護容器的效能。
重要Docker 中的 tmpfs 掛載直接對映到 Linux 核心中的 tmpfs。因此,臨時資料可能會被寫入交換檔案(swap file),從而持久化到檔案系統中。
覆蓋現有資料掛載
如果您在容器中已存在檔案或目錄的路徑上建立了一個 tmpfs 掛載,那麼預先存在的檔案將被該掛載所遮蓋。這類似於您在 Linux 主機上將檔案儲存到 /mnt
,然後將一個 USB 驅動器掛載到 /mnt
。在 USB 驅動器被解除安裝之前,/mnt
的內容將被 USB 驅動器的內容所遮蓋。
對於容器,沒有直接的方法可以移除掛載以再次顯示被遮蔽的檔案。最好的選擇是重新建立沒有該掛載的容器。
tmpfs 掛載的侷限性
- 與卷和繫結掛載不同,您不能在容器之間共享 tmpfs 掛載。
- 此功能僅在您於 Linux 上執行 Docker 時可用。
- 在 tmpfs 上設定許可權可能會導致它們在容器重啟後重置。在某些情況下,設定 uid/gid 可以作為一種變通方法。
語法
要使用 docker run
命令掛載 tmpfs,您可以使用 --mount
或 --tmpfs
標誌。
$ docker run --mount type=tmpfs,dst=<mount-path>
$ docker run --tmpfs <mount-path>
通常情況下,推薦使用 --mount
。主要區別在於 --mount
標誌更明確。另一方面,--tmpfs
更簡潔,並允許您設定更多的掛載選項,從而提供更大的靈活性。
--tmpfs
標誌不能用於 swarm 服務。您必須使用 --mount
。
--tmpfs 的選項
--tmpfs
標誌由兩個欄位組成,以冒號 (:
) 分隔。
$ docker run --tmpfs <mount-path>[:opts]
第一個欄位是要掛載到 tmpfs 的容器路徑。第二個欄位是可選的,允許您設定掛載選項。--tmpfs
的有效掛載選項包括:
選項 | 描述 |
---|---|
ro | 建立一個只讀的 tmpfs 掛載。 |
rw | 建立一個讀寫的 tmpfs 掛載(預設行為)。 |
nosuid | 在執行期間阻止 setuid 和 setgid 位生效。 |
suid | 允許在執行期間 setuid 和 setgid 位生效(預設行為)。 |
nodev | 可以建立裝置檔案,但無法使用(訪問會導致錯誤)。 |
dev | 可以建立裝置檔案並且功能齊全。 |
exec | 允許在掛載的檔案系統中執行可執行二進位制檔案。 |
noexec | 不允許在掛載的檔案系統中執行可執行二進位制檔案。 |
sync | 對檔案系統的所有 I/O 操作都同步進行。 |
async | 對檔案系統的所有 I/O 操作都非同步進行(預設行為)。 |
dirsync | 檔案系統內的目錄更新同步進行。 |
atime | 每次訪問檔案時更新檔案訪問時間。 |
noatime | 訪問檔案時不更新檔案訪問時間。 |
diratime | 每次訪問目錄時更新目錄訪問時間。 |
nodiratime | 訪問目錄時不更新目錄訪問時間。 |
size | 指定 tmpfs 掛載的大小,例如 size=64m 。 |
mode | 指定 tmpfs 掛載的檔案模式(許可權)(例如,mode=1777 )。 |
uid | 指定 tmpfs 掛載所有者的使用者 ID(例如,uid=1000 )。 |
gid | 指定 tmpfs 掛載所有者的組 ID(例如,gid=1000 )。 |
nr_inodes | 指定 tmpfs 掛載的最大 inode 數量(例如,nr_inodes=400k )。 |
nr_blocks | 指定 tmpfs 掛載的最大塊數(例如,nr_blocks=1024 )。 |
$ docker run --tmpfs /data:noexec,size=1024,mode=1777
並非所有 Linux mount 命令中可用的 tmpfs 掛載特性都受 --tmpfs
標誌支援。如果您需要高階的 tmpfs 選項或特性,您可能需要使用特權容器或在 Docker 之外配置掛載。
警告使用
--privileged
執行容器會授予提升的許可權,並可能使主機系統面臨安全風險。僅在絕對必要且在受信任的環境中使用此選項。
$ docker run --privileged -it debian sh
/# mount -t tmpfs -o <options> tmpfs /data
--mount 選項
--mount
標誌由多個鍵值對組成,用逗號分隔,每個鍵值對由一個 <key>=<value>
元組構成。鍵的順序不重要。
$ docker run --mount type=tmpfs,dst=<mount-path>[,<key>=<value>...]
--mount type=tmpfs
的有效選項包括:
選項 | 描述 |
---|---|
destination , dst , target | 要掛載到 tmpfs 的容器路徑。 |
tmpfs-size | tmpfs 掛載的大小(以位元組為單位)。如果未設定,tmpfs 卷的預設最大大小為主機總 RAM 的 50%。 |
tmpfs-mode | tmpfs 的檔案模式(八進位制)。例如,700 或 0770 。預設為 1777 或全域性可寫。 |
$ docker run --mount type=tmpfs,dst=/app,tmpfs-size=21474836480,tmpfs-mode=1770
在容器中使用 tmpfs 掛載
要在容器中使用 tmpfs
掛載,請使用 --tmpfs
標誌,或者使用帶有 type=tmpfs
和 destination
選項的 --mount
標誌。tmpfs
掛載沒有 source
。以下示例在 Nginx 容器中的 /app
處建立了一個 tmpfs
掛載。第一個示例使用 --mount
標誌,第二個示例使用 --tmpfs
標誌。
$ docker run -d \
-it \
--name tmptest \
--mount type=tmpfs,destination=/app \
nginx:latest
透過檢視 docker inspect
輸出中的 Mounts
部分,驗證該掛載是否為 tmpfs
掛載:
$ docker inspect tmptest --format '{{ json .Mounts }}'
[{"Type":"tmpfs","Source":"","Destination":"/app","Mode":"","RW":true,"Propagation":""}]
$ docker run -d \
-it \
--name tmptest \
--tmpfs /app \
nginx:latest
透過檢視 docker inspect
輸出中的 Mounts
部分,驗證該掛載是否為 tmpfs
掛載:
$ docker inspect tmptest --format '{{ json .Mounts }}'
{"/app":""}
停止並移除容器
$ docker stop tmptest
$ docker rm tmptest