tmpfs 掛載

繫結掛載 允許您在主機和容器之間共享檔案,以便即使在容器停止後也能持久化資料。

如果您在 Linux 上執行 Docker,還有第三個選項:tmpfs 掛載。當您使用 tmpfs 掛載建立容器時,容器可以在容器的可寫層之外建立檔案。

與卷和繫結掛載不同,tmpfs 掛載是臨時的,並且只儲存在主機記憶體中。當容器停止時,tmpfs 掛載會被移除,寫入其中的檔案不會持久化。

tmpfs 掛載最適用於不希望資料在主機或容器內持久化的情況。這可能是出於安全考慮,或者當您的應用程式需要寫入大量非永續性狀態資料時,為了保護容器的效能。

重要提示

Docker 中的 tmpfs 掛載直接對映到 Linux 核心中的 tmpfs。因此,臨時資料可能會被寫入交換檔案,從而持久化到檔案系統。

覆蓋現有資料進行掛載

如果您在容器中已存在檔案或目錄的目錄中建立 tmpfs 掛載,則現有檔案將被掛載所覆蓋。這類似於在 Linux 主機上將檔案儲存到 /mnt,然後將 USB 驅動器掛載到 /mnt/mnt 的內容將被 USB 驅動器的內容覆蓋,直到 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不允許在執行期間遵從 setuidsetgid 位。
suid允許在執行期間遵從 setuidsetgid 位(預設行為)。
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-sizetmpfs 掛載的大小(位元組)。如果未設定,tmpfs 卷的預設最大大小是主機總記憶體的 50%。
tmpfs-modetmpfs 的檔案模式(八進位制)。例如,7000770。預設為 1777 或世界可寫。
示例
$ docker run --mount type=tmpfs,dst=/app,tmpfs-size=21474836480,tmpfs-mode=1770

在容器中使用 tmpfs 掛載

要在容器中使用 tmpfs 掛載,請使用 --tmpfs 標誌,或使用帶 type=tmpfsdestination 選項的 --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

下一步

頁面選項