將檔案從主機複製到 Docker 容器

Isaac Tony 2023年1月30日
  1. 使用 docker cp 將檔案從主機複製到 Docker 容器
  2. 使用 docker volume 將檔案從主機複製到 Docker 容器
將檔案從主機複製到 Docker 容器

本文將討論和演示我們可以用來將檔案從主機傳輸到 Docker 中正在執行的容器的方法。

使用 docker cp 將檔案從主機複製到 Docker 容器

docker cp 命令是我們可以用來將檔案和目錄從主機複製到 Docker 容器的最簡單方法之一。我們將使用 Ubuntu 20.4.5 和當時最新版本的 Docker,即 v 19.03。

語法:

docker cp {options} PATH_HOST CONTAINER:PATH_TO_CONTAINER 

其中,

  • PATH_HOST 指定我們要複製的檔案在主機上的源路徑。
  • PATH_TO_CONTAINER 是我們要在容器上儲存檔案的目標路徑。

例子:

我們將從建立目標容器開始。我們將在本文中使用官方 Nginx 映象,我們可以通過執行以下命令從 Docker 桌面或終端拉取該映象。

$ docker pull nginx

輸出:

Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

我們使用下面的命令來驗證我們是否成功地從登錄檔中拉取了映象。

$ docker images

輸出:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    c316d5a335a5   2 weeks ago   142MB

我們現在可以建立一個容器。使用 run 命令,我們將建立一個容器並以分離模式部署它,以監聽外部埠 8080 和內部埠 80。

下面的命令將使用 Nginx 基礎映象建立一個容器。

$ docker run -d -p 8080:80 nginx

我們可以通過執行 docker ps -a 命令來驗證我們是否已成功建立新容器。這將列出我們最近和過去製作的所有容器,以及它們的容器 ID 和各自的映象。

我們可以按照此處所示執行此操作。

docker ps -a

輸出:

CONTAINER ID   IMAGE   COMMAND                  CREATED              STATUS              PORTS                  NAMES
0c57de10362b   nginx   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   lucid_booth

在使用 docker cp 命令之前,我們需要建立一個檔案,我們將從主機複製到我們剛剛建立的容器。

我們將建立一個名為 new_file.txt 的檔案,並使用 touch 命令將其儲存在主目錄中。

這是執行此操作的命令。

$ touch new_file.txt

我們可以檢視目錄以確保我們已使用 ls 命令成功建立檔案,如下所示。

isaac@DESKTOP-HV44HT6:~$ ls
new_file.txt

當然,new_file.txt 是一個空檔案;但是,我們希望專注於使用 docker cp 命令將其從主機移動到我們之前建立的容器。

然後我們將此檔案複製到我們建立的容器中。

$ docker cp new_file.txt 0c57de10362b:/usr/share

就像這樣,我們將 new_file.txt 複製到資料夾/usr/share 下 ID 為 0c57de10362b 的容器中。

我們可以通過使用命令 docker exec-it 標誌以互動方式執行命令通過互動式 SSH 會話進入正在執行的容器來確定這一點。

$ docker exec -it 0c57de10362b /bin/bash

現在我們已經登入到容器中,我們要列出檔案以驗證我們是否已將此檔案複製到此容器中。我們可以再次使用 ls 命令,但指定我們要訪問的資料夾。

root@0c57de10362b:/# ls -lh /usr/share/

輸出:

檢視從主機複製到 docker 容器中的檔案

同樣,我們也可以通過簡單地更改要從目錄中讀取的檔案的位置來複制包含許多檔案的目錄,如下所示。

$ docker cp src/directory/. container-id:/target_location/directory

docker cp 命令雖然易於使用,但有一些限制。它的語法與 Unix cp 命令不同,只支援有限數量的標籤。

此外,這隻能用於將檔案從主機複製到容器,而不是容器之間。

使用 docker volume 將檔案從主機複製到 Docker 容器

在容器之間複製檔案的更好方法是通過 docker volume

我們可以在容器建立過程中使用 -v-mount 標誌中的任何一個將包含我們想要複製的檔案的卷附加到容器。

要在 Docker 中使用卷,我們首先使用 docker volume 命令建立一個,如下所示。

$ docker volume create volume_one

使用 docker volume ls,我們可以驗證我們是否已成功建立卷。這將列出現在和過去建立的卷的名稱以及驅動程式的名稱。

isaac@DESKTOP-HV44HT6:~$ docker volume ls
DRIVER    VOLUME NAME
local     volume_one

現在我們已經建立了一個卷,下一步涉及使用 run 命令建立一個新容器並附加我們使用 -v 標誌建立的卷。

-v 標誌允許我們將新卷附加到我們建立的容器。我們將使用最新版本的 Nginx 基礎映象製作這個容器。

$ docker run -d -v volume_one:/app nginx:latest
f2457d3eb8fe14645b9e3938017c02c46a657c9ad3323ff4c03924d2fddd7046

我們可以使用 Docker 檢查命令返回有關 Docker 物件的低階資訊。我們將調查我們的卷是否已成功附加到我們建立的容器。

由於我們沒有為這個容器分配任何名稱,我們將使用容器 ID 來檢查它。我們將使用最新的容器 ID 而不是較早的容器 ID。

$ docker ps -a

輸出:

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                  NAMES
f2457d3eb8fe   nginx:latest   "/docker-entrypoint.…"   4 minutes ago       Up 4 minutes       80/tcp                 brave_kirch
0c57de10362b   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8080->80/tcp   lucid_booth

我們現在可以使用這個容器 ID 來檢查容器。

$ docker inspect f2457d3eb8fe

輸出:

檢查 docker 容器中已安裝的卷

docker volume 命令的優點之一是建立與多個容器共享的單個目錄。

作者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

相關文章 - Docker Container