與容器共享本地檔案

說明

每個容器都擁有其執行所需的一切,無需依賴主機上的任何預安裝依賴項。由於容器在隔離環境中執行,它們對主機和其他容器的影響最小。這種隔離具有一個主要優點:容器最大程度地減少了與主機系統和其他容器的衝突。但是,這種隔離還意味著容器預設情況下無法直接訪問主機上的資料。

假設您有一個 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) 之間的檔案訪問快速高效。

試一試

在本動手指南中,您將練習如何建立和使用繫結掛載,以在主機和容器之間共享檔案。

執行容器

  1. 下載並安裝 Docker Desktop。

  2. 使用 httpd 映象啟動容器,使用以下命令

    $ docker run -d -p 8080:80 --name my_site httpd:2.4
    

    這將在後臺啟動 httpd 服務,並將網頁釋出到主機上的埠 8080

  3. 開啟瀏覽器並訪問 https://:8080 或使用 curl 命令驗證它是否正常工作。

    $ curl localhost:8080
    

使用繫結掛載

使用繫結掛載,您可以將主機計算機上的配置檔案對映到容器內的特定位置。在本示例中,您將瞭解如何使用繫結掛載更改網頁的外觀和風格

  1. 使用 Docker 儀表盤刪除現有容器

    A screenshot of Docker dashboard showing how to delete the httpd container
  2. 在您的主機系統上建立一個名為 public_html 的新目錄。

    $ mkdir public_html
    
  3. 更改到 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>
  4. 現在該執行容器了。--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 儀表盤訪問檔案

  1. 您可以透過選擇容器的“檔案”選項卡,然後選擇 /usr/local/apache2/htdocs/ 目錄中的檔案來檢視容器中的掛載檔案。然後,選擇“開啟檔案編輯器”。

    A screenshot of Docker dashboard showing the mounted files inside the a container
  2. 刪除主機上的檔案,並驗證該檔案是否也從容器中刪除。您會發現該檔案不再存在於 Docker 儀表盤的“容器”下的“檔案”中。

    A screenshot of Docker dashboard showing the deleted files inside the a container
  3. 在主機系統上重新建立 HTML 檔案,您會看到該檔案重新出現在 Docker 儀表盤的“容器”下的“檔案”選項卡中。現在,您也可以訪問該網站。

停止您的容器

容器將一直執行,直到您停止它。

  1. 轉到 Docker 儀表盤的“容器”檢視。

  2. 找到您要停止的容器。

  3. 在“操作”列中選擇“刪除”操作。

A screenshot of Docker dashboard showing how to delete the container

其他資源

以下資源將幫助您詳細瞭解繫結掛載

下一步

現在您已經瞭解瞭如何與容器共享本地檔案,是時候學習多容器應用程式了。