與容器共享本機檔案
說明
每個容器都具備運作所需的一切,無需依賴主機上預先安裝的任何相依套件。由於容器在隔離環境中執行,它們對主機和其他容器的影響降至最低。這種隔離的主要優勢在於:容器將與主機系統和其他容器的衝突降至最低。然而,這種隔離也意味著容器預設無法直接存取主機上的資料。
考慮一種情況:您有一個 Web 應用程式容器,需要存取儲存在主機系統檔案中的設定。此檔案可能包含敏感資料,如資料庫憑證或 API 金鑰。將此類敏感資訊直接儲存在容器映像檔中會帶來安全風險,尤其是在分享映像檔時。為了應對這一挑戰,Docker 提供了連結容器隔離與主機資料的儲存選項。
Docker 為持久化資料以及在主機與容器之間共享檔案提供了兩種主要的儲存選項:Volumes(資料卷)與 Bind mounts(繫結掛載)。
Volume 與 bind mount 的比較
如果您希望確保在容器停止執行後,容器內生成或修改的資料仍然存在,您應該選擇 Volume。請參閱 持久化容器資料 以了解更多關於 Volume 及其使用場景的資訊。
如果您有主機系統上特定的檔案或目錄,希望直接與容器共享,例如設定檔或開發程式碼,則應該使用 bind mount。它就像在主機與容器之間開啟了一條直接共享的通道。對於需要主機與容器之間即時存取與共享檔案的開發環境,bind mount 是理想選擇。
在主機與容器之間共享檔案
搭配 docker run 指令使用的 -v(或 --volume)與 --mount 標記,皆可讓您在本地機器(主機)與 Docker 容器之間共享檔案或目錄。不過,它們在行為與使用上有幾個關鍵差異。
-v 標記對於基礎的 volume 或 bind mount 操作而言更簡單方便。使用 -v 或 --volume 時,若主機上的位置不存在,系統會自動建立一個目錄。
假設您是一位開發人員。您的開發機器上有一個存放程式碼的原始碼目錄。當您編譯或構建程式碼時,生成的產物(編譯後的程式碼、執行檔、映像檔等)會儲存在原始碼目錄內的子目錄中。在以下範例中,此子目錄為 /HOST/PATH。現在,您希望正在執行應用程式的 Docker 容器能夠存取這些構建產物。此外,您還希望在每次重新構建程式碼時,容器能自動存取最新的構建產物。
以下是如何使用 docker run 啟動一個使用 bind mount 並將其對應到容器內檔案位置的範例。
$ docker run -v /HOST/PATH:/CONTAINER/PATH -it nginx
--mount 標記提供更多進階功能與細粒度控制,適用於複雜的掛載場景或生產環境部署。如果您使用 --mount 來繫結掛載一個尚未存在於 Docker 主機上的檔案或目錄,docker run 指令不會自動為您建立它,而是會產生錯誤。
$ docker run --mount type=bind,source=/HOST/PATH,target=/CONTAINER/PATH,readonly nginx
注意Docker 建議使用
--mount語法而非-v。它對掛載過程提供了更好的控制,並避免了因缺少目錄而導致的潛在問題。
Docker 存取主機檔案的權限
使用 bind mount 時,確保 Docker 具備存取主機目錄的必要權限至關重要。若要授予讀/寫權限,您可以在建立容器時,搭配 -v 或 --mount 標記使用 :ro(唯讀)或 :rw(讀寫)。例如,以下指令授予讀寫權限。
$ docker run -v HOST-DIRECTORY:/CONTAINER-DIRECTORY:rw nginx
唯讀 bind mount 允許容器存取主機上的掛載檔案以進行讀取,但無法變更或刪除這些檔案。使用讀寫 bind mount 時,容器可以修改或刪除掛載的檔案,這些變更或刪除操作也會反映在主機系統上。唯讀 bind mount 可確保主機上的檔案不會被容器意外修改或刪除。
同步檔案共享
隨著程式碼庫日益龐大,傳統的檔案共享方法(如 bind mount)可能會變得低效或緩慢,特別是在需要頻繁存取檔案的開發環境中。同步檔案共享 (Synchronized file shares) 透過利用同步檔案系統快取來提高 bind mount 的效能。這種最佳化確保了主機與虛擬機器 (VM) 之間的檔案存取快速且高效。
試試看
在此實作指南中,您將練習如何建立並使用 bind mount,以在主機與容器之間共享檔案。
執行容器
下載並安裝 Docker Desktop。
使用以下指令啟動一個使用 httpd 映像檔的容器:
$ docker run -d -p 8080:80 --name my_site httpd:2.4這將在背景啟動
httpd服務,並將網頁發佈至主機的8080連接埠。開啟瀏覽器並存取 https://:8080,或使用 curl 指令來驗證它是否正常運作。
$ curl localhost:8080
使用 bind mount
透過 bind mount,您可以將主機電腦上的設定檔對應到容器內部的特定位置。在此範例中,您將了解如何透過 bind mount 來更改網頁的外觀與感受。
使用 Docker Desktop 儀表板刪除現有的容器。

在您的主機系統上建立一個名為
public_html的新目錄。$ mkdir public_html進入剛建立的
public_html目錄,並建立一個名為index.html的檔案,內容如下。這是一份基礎的 HTML 文件,會建立一個以友善的鯨魚歡迎您的簡單網頁。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> My Website with a Whale & Docker!</title> </head> <body> <h1>Whalecome!!</h1> <p>Look! There's a friendly whale greeting you!</p> <pre id="docker-art"> ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === { / ===- \______ O __/ \ \ __/ \____\_______/ Hello from Docker! </pre> </body> </html>現在可以執行容器了。
--mount與-v範例會產生相同的結果。在執行第一個容器之後,除非您先刪除my_site容器,否則無法同時執行這兩者。$ docker run -d --name my_site -p 8080:80 -v .:/usr/local/apache2/htdocs/ httpd:2.4$ docker run -d --name my_site -p 8080:80 --mount type=bind,source=./,target=/usr/local/apache2/htdocs/ httpd:2.4提示在 Windows PowerShell 中使用
-v或--mount標記時,您需要提供目錄的絕對路徑,而不是僅使用./。這是因為 PowerShell 處理相對路徑的方式與 bash(通常用於 Mac 與 Linux 環境)不同。當一切準備就緒並執行後,您應該可以透過 https://:8080 存取該網站,並看到一個以友善鯨魚歡迎您的新網頁。
在 Docker Desktop 儀表板存取檔案
您可以透過選擇容器的檔案 (Files) 標籤,然後選擇
/usr/local/apache2/htdocs/目錄下的檔案來檢視容器內掛載的檔案。接著,選擇開啟檔案編輯器 (Open file editor)。

刪除主機上的檔案並驗證容器內的檔案是否也已被刪除。您會發現這些檔案不再存在於 Docker Desktop 儀表板的檔案 (Files) 區塊中。

重新在主機系統上建立該 HTML 檔案,您會看到該檔案重新出現在 Docker Desktop 儀表板中容器 (Containers) 下的檔案 (Files) 標籤內。現在,您也將能夠存取該網站。
停止容器
容器將持續執行,直到您將其停止。
前往 Docker Desktop 儀表板中的容器 (Containers) 視圖。
找到您想要停止的容器。
在「動作 (Actions)」欄中選擇刪除 (Delete) 動作。

其他資源
以下資源將協助您深入了解 bind mount:
下一步
現在您已經了解如何與容器共享本地檔案,接下來是時候了解多容器應用程式了。
多容器應用程式