與容器共享本地檔案
說明
每個容器都擁有其執行所需的一切,無需依賴主機上的任何預安裝依賴項。由於容器在隔離環境中執行,它們對主機和其他容器的影響最小。這種隔離具有一個主要優點:容器最大程度地減少了與主機系統和其他容器的衝突。但是,這種隔離還意味著容器預設情況下無法直接訪問主機上的資料。
假設您有一個 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 儀表盤刪除現有容器
在您的主機系統上建立一個名為
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 儀表盤訪問檔案
您可以透過選擇容器的“檔案”選項卡,然後選擇
/usr/local/apache2/htdocs/
目錄中的檔案來檢視容器中的掛載檔案。然後,選擇“開啟檔案編輯器”。刪除主機上的檔案,並驗證該檔案是否也從容器中刪除。您會發現該檔案不再存在於 Docker 儀表盤的“容器”下的“檔案”中。
在主機系統上重新建立 HTML 檔案,您會看到該檔案重新出現在 Docker 儀表盤的“容器”下的“檔案”選項卡中。現在,您也可以訪問該網站。
停止您的容器
容器將一直執行,直到您停止它。
轉到 Docker 儀表盤的“容器”檢視。
找到您要停止的容器。
在“操作”列中選擇“刪除”操作。


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