將檔案從主機複製到 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 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 volume
命令的優點之一是建立與多個容器共享的單個目錄。
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