與容器共享本地檔案
解釋
每個容器都擁有其執行所需的一切,不依賴於主機上任何預先安裝的依賴項。由於容器在隔離環境中執行,它們對主機和其他容器的影響微乎其微。這種隔離有一個主要好處:容器最大限度地減少了與主機系統和其他容器的衝突。然而,這種隔離也意味著容器預設情況下無法直接訪問主機上的資料。
設想一個場景,你有一個 Web 應用程式容器,需要訪問儲存在主機系統檔案中的配置設定。該檔案可能包含敏感資料,如資料庫憑據或 API 金鑰。將此類敏感資訊直接儲存在容器映象中會帶來安全風險,尤其是在共享映象時。為了應對這一挑戰,Docker 提供了儲存選項,以彌合容器隔離與主機資料之間的鴻溝。
Docker 提供了兩種主要的儲存選項來持久化資料並在主機和容器之間共享檔案:卷和繫結掛載。
卷與繫結掛載對比
如果你想確保容器內部生成或修改的資料在容器停止執行後仍然存在,你應該選擇卷。請參閱持久化容器資料,瞭解更多關於卷及其用例的資訊。
如果你想將主機系統上的特定檔案或目錄(如配置檔案或開發程式碼)直接共享給容器,那麼你應該使用繫結掛載。這就像在你的主機和容器之間開啟一個直接共享的門戶。繫結掛載非常適合開發環境,因為在這些環境中,主機和容器之間的即時檔案訪問和共享至關重要。
在主機和容器之間共享檔案
在 `docker run` 命令中使用的 `-v`(或 `--volume`)和 `--mount` 標誌都允許你在本地計算機(主機)和 Docker 容器之間共享檔案或目錄。但是,它們在行為和用法上存在一些關鍵差異。
對於基本的卷或繫結掛載操作,`-v` 標誌更簡單、更方便。當使用 `-v` 或 `--volume` 時,如果主機位置不存在,將自動建立一個目錄。
想象一下你是一名正在開發專案的開發者。你的開發機器上有一個原始碼目錄,存放著你的程式碼。當你編譯或構建程式碼時,生成的工件(編譯後的程式碼、可執行檔案、映象等)會儲存在原始碼目錄下的一個單獨子目錄中。在以下示例中,此子目錄為 `/HOST/PATH`。現在,你希望這些構建工件在執行你的應用程式的 Docker 容器中是可訪問的。此外,你還希望每當你重新構建程式碼時,容器都能自動訪問最新的構建工件。
以下是使用 `docker run` 啟動一個使用繫結掛載並將其對映到容器檔案位置的容器的方法。
$ 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 訪問主機檔案的檔案許可權
使用繫結掛載時,確保 Docker 擁有訪問主機目錄的必要許可權至關重要。要授予讀/寫訪問許可權,可以在建立容器時使用 `:ro`(只讀)或 `:rw`(讀寫)標誌與 `-v` 或 `--mount` 標誌一起使用。例如,以下命令授予讀寫訪問許可權。
$ docker run -v HOST-DIRECTORY:/CONTAINER-DIRECTORY:rw nginx
只讀繫結掛載允許容器訪問主機上的掛載檔案進行讀取,但不能更改或刪除這些檔案。透過讀寫繫結掛載,容器可以修改或刪除掛載的檔案,這些更改或刪除也會反映在主機系統上。只讀繫結掛載可確保主機上的檔案不會被容器意外修改或刪除。
同步檔案共享
隨著你的程式碼庫越來越大,傳統的檔案共享方法(如繫結掛載)可能會變得效率低下或緩慢,尤其是在需要頻繁訪問檔案的開發環境中。同步檔案共享透過利用同步的檔案系統快取來提高繫結掛載的效能。這種最佳化確保了主機和虛擬機器(VM)之間的檔案訪問既快速又高效。
試一試
在本實踐指南中,你將練習如何建立和使用繫結掛載來在主機和容器之間共享檔案。
執行一個容器
下載並安裝 Docker Desktop。
使用以下命令啟動一個使用 httpd 映象的容器。
$ docker run -d -p 8080:80 --name my_site httpd:2.4
這將在後臺啟動 `httpd` 服務,並將網頁釋出到主機的 `8080` 埠。
開啟瀏覽器並訪問 https://:8080,或使用 curl 命令來驗證其是否正常工作。
$ curl localhost:8080
使用繫結掛載
透過使用繫結掛載,你可以將主機上的配置檔案對映到容器內的特定位置。在此示例中,你將看到如何透過使用繫結掛載來更改網頁的外觀和感覺。
使用 Docker Desktop Dashboard 刪除現有容器
在您的主機系統上建立一個名為 `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 Dashboard 中訪問檔案
您可以透過選擇容器的**檔案**選項卡,然後在 `/usr/local/apache2/htdocs/` 目錄內選擇一個檔案來檢視容器內掛載的檔案。然後,選擇**開啟檔案編輯器**。
在主機上刪除該檔案,並驗證該檔案在容器中也已被刪除。您會發現該檔案在 Docker Desktop Dashboard 的**檔案**下已不存在。
在主機系統上重新建立 HTML 檔案,可以看到該檔案在 Docker Desktop Dashboard 的**容器**下的**檔案**選項卡中重新出現。此時,您應該也能訪問該網站了。
停止你的容器
容器將繼續執行,直到您停止它。
轉到 Docker Desktop Dashboard 中的**容器**檢視。
找到您想要停止的容器。
在“操作”列中選擇**刪除**操作。


其他資源
以下資源將幫助您瞭解更多關於繫結掛載的資訊
後續步驟
現在您已經瞭解瞭如何與容器共享本地檔案,是時候學習多容器應用程式了。
多容器應用程式