如果您需要從Docker 主機複製檔案到您的Docker 容器,這篇教程就是為您準備的。
在這篇教程中,您將學習使用不同的方法將檔案從 Docker 主機複製到 Docker 容器。
讓我們開始吧!
先決條件
如果您希望一步一步地跟隨,請確保您具備以下條件:
- A Linux host. This tutorial uses Ubuntu 18.04.5 LTS.
- 在 Linux 主機上安裝了 Docker。本教程使用的是 Docker v19.03.11 版本。您可以通過運行
docker version
來確認您的 Docker 版本。
- 下載並可用的任何 Docker 映像檔。本教程使用 Docker Hub 上最新的 NGINX Docker 映像檔。
使用docker cp
命令複製檔案
開始這篇教程,您將學習使用docker cp
命令將檔案從 Docker 主機複製到容器。docker cp
命令可以在容器和 Docker 主機的本地檔案系統之間互相複製檔案或資料夾。
讓我們透過一個例子來學習如何使用 Docker cp 命令。
1. 在您的本地機器上打開終端機。
2. 使用 touch
命令創建一個名為 myfile.txt 的文件。將會從 Docker 主機複製 myfile.txt 到容器中。
3. 執行 docker run
命令。下面的 docker run 將在後台創建一個新的容器。下面的命令包含以下三個參數:
d
flag that runs the container in the background and keeps it alive until deleted.p
flag publishes a container’s port80
to the host on port80
.nginx
將是用於運行容器的映像。

4. 使用 docker ps
命令驗證 Docker 容器是否成功創建。執行 docker ps
命令後,您應該會看到在屬性 CONTAINER ID (在下面的例子中為 ccae4670f030
) 下生成了一個新值,使用了 NGINX 映像,這證實了容器已成功創建。

在執行 Docker cp 命令之前,Docker cp 命令的語法為:
CONTAINER: SRC_PATH
指定容器的源路徑。DEST_PATH
是主機上的目的地路徑。CONTAINER: DEST_PATH
是容器上的目的地路徑。
此外,您還可以在命令中使用以下參數添加 options
:
- 使用`archive`或`a` – 复制文件和文件夹的用户和主要组权限。
- 使用`L` – 指定`L`选项将允许将源路径中的任何符号链接复制到目标路径。
5. 接下来,执行docker cp
命令。docker cp
命令将复制您之前创建的myfile.txt到容器的/usr/share目录。 ccae4670f030
是要将myfile.txt复制到的容器ID。
6. 最后,通过运行docker exec
命令与/bin/bash
一起,进入运行中的容器。`/bin/bash`用作Linux系统用户登录的默认 shell。
- `i`标志表示您希望打开与容器的交互式SSH会话。即使容器未附加,`i`标志也不会关闭SSH会话。
- `t`标志分配一个伪TTY,必须用于交互式运行命令。
sudo docker exec -it ccae4670f030 /bin/bash
当您运行docker exec
时,您将看到您现在已连接到容器的 shell。

7. 登入容器後,使用ls命令驗證myfile.txt是否已經複製到容器中。
ls
是一個列出Unix和類Unix操作系統中電腦文件的命令。grep
將在usr/share目錄中搜尋以字符串my
開頭的所有文件或文件夾。

使用DockerFile複製文件
在前一節中,您已經學會了如何通過運行Docker cp命令將文件複製到容器中。如果您需要一次複製多個文件,該怎麼辦?當然,運行多個命令會增加負擔!要解決運行多個cp命令的問題,為什麼不試試使用Dockerfile通過COPY
命令將文件或文件夾複製到容器中呢?
使用Dockerfile部署容器並複製文件/文件夾可以消除您在前一節中進行的手動複製步驟。Dockerfile是一個包含用戶可以在命令行上調用的所有命令的文本文檔,以組裝圖像。
讓我們創建一個Dockerfile,從中運行一個容器,並最終複製文件。
1. 創建一個名為~/host-to-container-copy-demo的文件夾,然後將工作目錄更改(cd
)為該文件夾。該文件夾將包含您在此演示中創建的所有文件。
2. 現在,創建兩個名為myfile1.txt和myfile2.txt的文本文件,將它們複製並粘貼到文件中,然後保存到~/host-to-container-copy-demo目錄中。
3. 建立另一個文件,將以下配置複製/粘貼,並將文件保存為Dockerfile,保存在 ~/host-to-container-copy-demo 目錄中。完成後,Docker 將使用此 DockerFile 執行所有必要的命令來在任何基礎映像之上構建新的 Docker 映像。
下面的DockerFile包含了建立新容器的各種步驟/指令:
4. 透過運行 tree
命令來驗證建立新映像所需的所有文件。您應該在~/host-to-container-copy-demo 目錄下看到 Dockerfile、myfile1.txt 和 myfile2.txt。

5. 接下來,通過運行 docker build
命令來構建映像。 t
標誌用於將映像標記為 latest
,.
允許 Docker 從當前工作目錄中選擇所有必要的文件。

docker build
command 6. 現在,通過運行 docker images
命令來驗證新建的映像 updated_ubuntu_image
。注意 REPOSITORY 屬性。此屬性是在前一步驟中使用 -t
標誌創建的標籤。

7. 最後,通過運行 docker run
命令來運行新建的映像的 Docker 容器。 -it
標誌指示 Docker 分配一個與容器的 stdin 連接的 虛擬終端。 bash
提供了 Linux 系統用戶登錄的默認 shell。
現在,您將會看到您已進入 Docker 容器的 Bash shell 中。

8. 接下來,通過運行 ls
命令來驗證文件是否成功複製到容器中的目錄 /tmp 和 /usr/share。

使用 Docker Volume
命令掛載存儲卷並訪問文件
到目前為止,您已經學會了使用兩種不同的方法將文件從主機複製到容器,一種是使用docker cp
命令,另一種是使用docker volume
命令輕鬆共享主機和容器之間的文件系統。
假設您仍然登錄在終端上:
1. 通過運行docker volume create
命令在Docker主機上創建一個卷。下面的命令將創建一個名為my-vol
的卷。 sudo docker volume create my-vol
2. 通過運行docker volume ls
命令來驗證卷是否已成功創建。docker volume ls命令列出了卷。運行docker volume ls
命令後,您將在VOLUME NAME屬性中看到my-vol
,這表明卷已成功創建。

3. 接下來,運行docker run
命令運行容器。
- 名為
volume_testing
的容器使用了nginx: latest
映像。 d
flag runs the container in the background and keeps it alive until deleted.v
flag mounts the volumemy-vol
created on Docker host to the container’s destination/app
directory.

4. 確認您之前創建的 my-vol 卷是否使用 docker inspect
命令正確地與容器掛載。 Docker inspect 命令 提供容器的相關信息。運行 docker inspect
命令後,將顯示指定容器(volume_testing
)的所有詳細信息,包括掛載詳情,如下所示。
下面的映像快照證實了您在主機上創建的卷(my-vol
)已成功與容器的 /app
目錄掛載。

結論
在本教程中,您學會了從 Docker 主機到容器中複製文件或文件夾的不同方法,例如使用 Docker cp 命令、Docker 卷命令和 Dockerfile。
那麼,在從主機複製數據到 Docker 容器時,您打算使用哪種方法?