主機和Docker容器之間的檔案互傳方法

枫叶流华發表於2024-11-15

Docker漸漸成為前端的一個工具,它像一個通用包裝,可以把各種環境包裹其中,從而實現跨裝置的相容。使用的過程中,往往會需要將本地的檔案和docker容器內部的檔案互傳:將主機的檔案傳遞給容器內,讓裡面的工具讀寫;將容器內的檔案複製出來,修改了再傳入...

一、主機到 Docker 容器/映象的檔案傳輸

將檔案從主機傳輸到容器或映象中,可以在容器啟動前容器執行時進行。

1. 使用 COPYADD 指令(構建映象時)

當你在建立Docker 映象時,Dockerfile 提供了兩條指令 COPYADD,它們用於將主機上的檔案複製到映象中。

  • COPY 指令:將主機的檔案或目錄複製到映象的指定路徑。
  • ADD 指令:除了 COPY 的功能外,還支援複製遠端檔案(如 URL)並自動解壓壓縮檔案(如 .tar)。
示例
# 從主機的工作目錄將檔案複製到映象的 /app 目錄 # 或者使用 ADD 指令(可以解壓 .tar 檔案) ADD ./myarchive.tar.gz /app

這種方式適用於在構建映象時預先將主機檔案打包進映象內。它的優點是映象內的檔案是靜態的,適合分發和部署。

需要注意的是,複製檔案不能跨越上下文,比如你構建的映象在 /a/b/c目錄,無法將/a目錄下的檔案複製到映象內,或是COPY ../xxx 的也不行***

2. 使用 docker run-v 選項(容器啟動時掛載卷)

當容器啟動時,可以透過 -v--mount 選項將主機目錄掛載到容器中。這種方法不會將檔案打包進映象,而是在容器執行時實時訪問主機上的檔案。

示例
docker run -v /path/on/host:/path/in/container my-container

在此示例中,主機的 /path/on/host 目錄會掛載到容器的 /path/in/container 目錄中。容器中的應用可以實時訪問和修改主機上的檔案,這種方式非常適合開發時同步檔案。

3. 使用 docker cp 命令(執行時複製)

docker cp 命令允許在容器執行時將檔案從主機複製到容器中。

示例:
docker cp /path/on/host my-container:/path/in/container

這種方式適合偶爾的檔案傳輸,不需要重啟容器。你可以在容器執行時向容器內新增或更新檔案。

二、Docker 容器/映象到主機的檔案傳輸

Docker 同樣提供多種方法將檔案從容器或映象傳輸到主機中。

1. 使用 docker cp 命令

最直接的方法是使用 docker cp 命令,它允許從正在執行的容器或已經停止的容器中將檔案複製到主機。docker cp 是一個非常靈活的工具,它既支援檔案也支援目錄的傳輸。

示例:
docker cp my-container:/path/in/container /path/on/host

即使容器已經停止,docker cp 仍然可以工作,因為 Docker 會保留容器的檔案系統狀態,直到容器被刪除。

2. 在容器啟動時掛載卷(雙向傳輸)

如前所述,使用 docker run -v--mount 選項可以實現主機與容器之間的檔案共享。由於這是雙向傳輸,因此容器對掛載卷中資料的修改會同步到主機上。

示例:
docker run -v /path/on/host:/path/in/container my-container

容器內的任何檔案更改都會反映在主機的 /path/on/host 目錄中。這種方式對於需要實時同步資料的情況非常有效,例如開發時頻繁修改的檔案。

3. 延伸之複製映象檔案到本地

此時就需要用docker run使用映象啟動容器,然後再利用docker cp複製到本地

三、適合場景的選擇

  • 使用 COPY/ADD 指令:適合在構建映象時靜態地將檔案打包進映象,適合用於映象的分發和部署。

  • 使用 docker run -v 掛載卷:適合開發環境或需要實時同步檔案的場景,避免了每次修改檔案都需要重啟容器。

  • 使用 docker cp:適合容器執行時或容器停止後從容器中提取檔案,適用於需要從容器中臨時獲取或更新檔案的情況。

四、注意事項

  1. 許可權問題:在掛載主機目錄到容器時,容器內的使用者許可權可能會與主機使用者不一致,導致檔案無法訪問或修改。可以透過設定正確的許可權或使用者來解決這個問題。

  2. 容器掛掉後的檔案傳輸:即使容器已經停止,docker cp 仍然可以從停止的容器中提取檔案。容器刪除前,檔案系統狀態會被保留。

  3. 效能影響:在使用 -v 掛載卷時,主機與容器間的檔案互動效能可能會受到一定影響,特別是在處理大量檔案時,需要測試效能是否滿足要求。

相信看到這裡,記得動手操練下。相信你就能夠熟練掌握docker和主機之間的檔案互轉了,其實docker就是一個檔案系統的描述,一層層的累起來,映象是抽象的定義類似Class,容器類似例項化的物件,透過多種方法實現容器和主機的檔案互轉就可以,甚至可透過http哦

相關文章