Docker容器傳輸文件的實(shí)現(xiàn)方式
在 Docker 日常使用中,經(jīng)常需要在主機(jī)與容器之間傳輸文件(如配置文件、代碼包、日志等)。
以下是四種最常用的實(shí)現(xiàn)方式,覆蓋臨時(shí)傳輸、持久共享、構(gòu)建集成等不同場(chǎng)景。
1. 使用docker cp命令(最常用,臨時(shí)傳輸)
docker cp 是 Docker 官方提供的原生命令,專門用于主機(jī)與容器之間直接復(fù)制文件 / 目錄,無需額外配置,適合臨時(shí)傳輸場(chǎng)景。
核心語法
| 操作方向 | 命令格式 |
|---|---|
| 主機(jī) → 容器 | docker cp 主機(jī)源路徑 容器名/ID:容器目標(biāo)路徑 |
| 容器 → 主機(jī) | docker cp 容器名/ID:容器源路徑 主機(jī)目標(biāo)路徑 |
示例
主機(jī)文件復(fù)制到容器
將主機(jī)當(dāng)前目錄下的 app.js 文件,復(fù)制到名為 my-container 的容器內(nèi) /tmp 目錄:
docker cp ./app.js my-container:/tmp/
主機(jī)目錄復(fù)制到容器
將主機(jī) ./project 目錄,復(fù)制到容器 /usr/local/project 目錄(目錄會(huì)自動(dòng)創(chuàng)建):
docker cp ./project my-container:/usr/local/
容器文件復(fù)制到主機(jī)
將容器內(nèi) /var/log/app.log 日志文件,復(fù)制到主機(jī) ./logs 目錄:
docker cp my-container:/var/log/app.log ./logs/
2. 利用 Docker 卷(Volume)(持久化共享)
如果需要主機(jī)與容器長(zhǎng)期、實(shí)時(shí)共享文件(如數(shù)據(jù)庫(kù)數(shù)據(jù)、配置文件動(dòng)態(tài)更新),推薦使用 Docker 卷(Volume)。
卷是 Docker 管理的持久化存儲(chǔ),獨(dú)立于容器生命周期,數(shù)據(jù)安全性更高。
操作步驟
創(chuàng)建自定義卷
docker volume create my-volume # 創(chuàng)建名為 my-volume 的卷
運(yùn)行容器時(shí)掛載卷
將卷 my-volume 掛載到容器內(nèi)的 /container/data 路徑,主機(jī)與容器在此路徑下的文件會(huì)實(shí)時(shí)同步:
docker run -d \ --name my-container \ -v my-volume:/container/data # 卷掛載:卷名:容器內(nèi)路徑 my-image # 容器使用的鏡像
主機(jī)訪問卷數(shù)據(jù)
Docker 卷在主機(jī)上的默認(rèn)存儲(chǔ)路徑為 /var/lib/docker/volumes/[卷名]/_data,可直接在主機(jī)操作該目錄:
# 例如:向卷中添加文件,容器內(nèi) /container/data 會(huì)同步 cp ./config.ini /var/lib/docker/volumes/my-volume/_data/
3. 通過 Dockerfile 構(gòu)建時(shí)添加(鏡像集成)
如果需要容器創(chuàng)建時(shí)就內(nèi)置固定文件(如應(yīng)用代碼、默認(rèn)配置),可在 Dockerfile 中使用 COPY 或 ADD 指令,將文件打包到鏡像中,容器啟動(dòng)后直接可用。
核心指令對(duì)比
| 指令 | 功能說明 | 推薦場(chǎng)景 |
|---|---|---|
| COPY | 僅將主機(jī)本地文件 / 目錄復(fù)制到鏡像中,語法簡(jiǎn)單,功能明確。 | 絕大多數(shù)本地文件復(fù)制場(chǎng)景 |
| ADD | 除 COPY 功能外,還支持解壓壓縮包(如 .tar)、下載 URL 資源。 | 需要自動(dòng)解壓或遠(yuǎn)程獲取文件 |
示例 Dockerfile
dockerfile
# 基礎(chǔ)鏡像 FROM ubuntu:22.04 # 1. 使用 COPY 復(fù)制本地文件到鏡像 COPY ./app.conf /etc/app.conf # 主機(jī) app.conf → 鏡像 /etc/ 目錄 # 2. 使用 COPY 復(fù)制本地目錄到鏡像 COPY ./src /usr/local/app/src # 主機(jī) src 目錄 → 鏡像 /usr/local/app/src # 3. 使用 ADD 解壓本地壓縮包(自動(dòng)解壓到目標(biāo)路徑) ADD ./app.tar.gz /usr/local/app/ # 主機(jī) app.tar.gz → 鏡像內(nèi)自動(dòng)解壓到 /usr/local/app/ # 4. 使用 ADD 下載遠(yuǎn)程文件(不推薦,建議在主機(jī)下載后用 COPY,避免構(gòu)建緩存問題) # ADD https://example.com/config.ini /etc/config.ini
構(gòu)建鏡像并運(yùn)行
# 構(gòu)建鏡像(當(dāng)前目錄需包含 Dockerfile 和待復(fù)制的文件) docker build -t my-image:v1 . # 運(yùn)行容器(鏡像內(nèi)已包含上述文件) docker run -it --name my-container my-image:v1
4. 網(wǎng)絡(luò)傳輸工具(跨主機(jī) / 特殊場(chǎng)景)
如果容器內(nèi)已安裝網(wǎng)絡(luò)工具(如 wget、curl、ssh),可通過網(wǎng)絡(luò)實(shí)現(xiàn)文件傳輸,適合跨主機(jī)或無法直接訪問容器的場(chǎng)景。
常見場(chǎng)景示例
從主機(jī) HTTP 服務(wù)下載文件
先在主機(jī)啟動(dòng)臨時(shí) HTTP 服務(wù)(以 Python 為例):
# 主機(jī)當(dāng)前目錄啟動(dòng) HTTP 服務(wù)(端口 8000) python3 -m http.server 8000
然后在容器內(nèi)使用 wget 下載文件:
# 容器內(nèi)下載主機(jī)的 app.zip 文件(主機(jī) IP 需替換為實(shí)際地址) wget http://192.168.1.100:8000/app.zip -O /tmp/app.zip
通過 SSH 傳輸文件
若容器內(nèi)已配置 SSH 服務(wù),可使用 scp 從主機(jī)復(fù)制文件:
# 主機(jī) → 容器(容器需開放 SSH 端口,如 2222) scp -P 2222 ./config.ini root@容器IP:/etc/config.ini
5. 方法選擇建議
| 場(chǎng)景需求 | 推薦方法 | 優(yōu)點(diǎn) |
|---|---|---|
| 臨時(shí)、少量文件傳輸 | docker cp | 無需配置,操作簡(jiǎn)單 |
| 長(zhǎng)期、實(shí)時(shí)文件共享 | Docker 卷 | 數(shù)據(jù)持久化,性能穩(wěn)定 |
| 容器鏡像內(nèi)置固定文件 | Dockerfile COPY | 與鏡像綁定,部署便捷 |
| 跨主機(jī)或遠(yuǎn)程傳輸 | 網(wǎng)絡(luò)工具(wget) | 靈活性高,不受本地環(huán)境限制 |
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker學(xué)習(xí)筆記之Docker端口映射
本篇文章主要介紹了Docker學(xué)習(xí)筆記之Docker端口映射,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
如何解決Docker連接本地MySQL服務(wù)失敗的問題
這篇文章主要介紹了如何解決Docker連接本地MySQL服務(wù)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Docker動(dòng)態(tài)給容器Container暴露端口操作
這篇文章主要介紹了Docker動(dòng)態(tài)給容器Container暴露端口操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解基于Harbor搭建Docker私有鏡像倉(cāng)庫(kù)
這篇文章主要介紹了詳解基于Harbor搭建Docker私有鏡像倉(cāng)庫(kù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
解決registry私有倉(cāng)庫(kù)空間清理問題
Docker Registry因歷史鏡像堆積導(dǎo)致磁盤空間不足,需定期清理,通過執(zhí)行registry_garbage_collect.sh腳本及查看config.yml配置文件,可管理存儲(chǔ)策略,釋放占用空間2025-08-08
Docker下安裝部署Clickhouse及其遠(yuǎn)程訪問方式
文章介紹了如何遠(yuǎn)程拉取和安裝ClickHouse Docker鏡像,配置和部署ClickHouse容器,并通過DataGrip遠(yuǎn)程訪問ClickHouse2024-11-11
docker?build?-t?和?docker?build?-f?區(qū)別解析
docker build 是用于構(gòu)建Docker鏡像的命令,它允許你基于一個(gè)Dockerfile來創(chuàng)建一個(gè)鏡像,在 docker build 命令中,有兩個(gè)常用的選項(xiàng) -t 和 -f,它們有不同的作用,這篇文章主要介紹了docker?build?-t?和?docker?build?-f?區(qū)別,需要的朋友可以參考下2023-08-08

