Docker 容器傳輸文件的常用方法
在 Docker 日常使用中,經常需要在主機與容器之間傳輸文件(如配置文件、代碼包、日志等)。以下是四種最常用的實現方式,覆蓋臨時傳輸、持久共享、構建集成等不同場景。
1. 使用 docker cp
命令(最常用,臨時傳輸)
docker cp
是 Docker 官方提供的原生命令,專門用于主機與容器之間直接復制文件 / 目錄,無需額外配置,適合臨時傳輸場景。
核心語法
操作方向 | 命令格式 |
---|---|
主機 → 容器 | docker cp 主機源路徑 容器名/ID:容器目標路徑 |
容器 → 主機 | docker cp 容器名/ID:容器源路徑 主機目標路徑 |
示例
-
主機文件復制到容器
將主機當前目錄下的app.js
文件,復制到名為my-container
的容器內/tmp
目錄:bash
docker cp ./app.js my-container:/tmp/
-
主機目錄復制到容器
將主機./project
目錄,復制到容器/usr/local/project
目錄(目錄會自動創建):bash
docker cp ./project my-container:/usr/local/
-
容器文件復制到主機
將容器內/var/log/app.log
日志文件,復制到主機./logs
目錄:bash
docker cp my-container:/var/log/app.log ./logs/
2. 利用 Docker 卷(Volume)(持久化共享)
如果需要主機與容器長期、實時共享文件(如數據庫數據、配置文件動態更新),推薦使用 Docker 卷(Volume)。卷是 Docker 管理的持久化存儲,獨立于容器生命周期,數據安全性更高。
操作步驟
-
創建自定義卷
bash
docker volume create my-volume # 創建名為 my-volume 的卷
-
運行容器時掛載卷
將卷my-volume
掛載到容器內的/container/data
路徑,主機與容器在此路徑下的文件會實時同步:bash
docker run -d \--name my-container \-v my-volume:/container/data # 卷掛載:卷名:容器內路徑my-image # 容器使用的鏡像
-
主機訪問卷數據
Docker 卷在主機上的默認存儲路徑為/var/lib/docker/volumes/[卷名]/_data
,可直接在主機操作該目錄:bash
# 例如:向卷中添加文件,容器內 /container/data 會同步 cp ./config.ini /var/lib/docker/volumes/my-volume/_data/
3. 通過 Dockerfile 構建時添加(鏡像集成)
如果需要容器創建時就內置固定文件(如應用代碼、默認配置),可在 Dockerfile 中使用 COPY
或 ADD
指令,將文件打包到鏡像中,容器啟動后直接可用。
核心指令對比
指令 | 功能說明 | 推薦場景 |
---|---|---|
COPY | 僅將主機本地文件 / 目錄復制到鏡像中,語法簡單,功能明確。 | 絕大多數本地文件復制場景 |
ADD | 除 COPY 功能外,還支持解壓壓縮包(如 .tar )、下載 URL 資源。 | 需要自動解壓或遠程獲取文件 |
示例 Dockerfile
dockerfile
# 基礎鏡像
FROM ubuntu:22.04# 1. 使用 COPY 復制本地文件到鏡像
COPY ./app.conf /etc/app.conf # 主機 app.conf → 鏡像 /etc/ 目錄# 2. 使用 COPY 復制本地目錄到鏡像
COPY ./src /usr/local/app/src # 主機 src 目錄 → 鏡像 /usr/local/app/src# 3. 使用 ADD 解壓本地壓縮包(自動解壓到目標路徑)
ADD ./app.tar.gz /usr/local/app/ # 主機 app.tar.gz → 鏡像內自動解壓到 /usr/local/app/# 4. 使用 ADD 下載遠程文件(不推薦,建議在主機下載后用 COPY,避免構建緩存問題)
# ADD https://example.com/config.ini /etc/config.ini
構建鏡像并運行
bash
# 構建鏡像(當前目錄需包含 Dockerfile 和待復制的文件)
docker build -t my-image:v1 .# 運行容器(鏡像內已包含上述文件)
docker run -it --name my-container my-image:v1
4. 網絡傳輸工具(跨主機 / 特殊場景)
如果容器內已安裝網絡工具(如 wget
、curl
、ssh
),可通過網絡實現文件傳輸,適合跨主機或無法直接訪問容器的場景。
常見場景示例
-
從主機 HTTP 服務下載文件
先在主機啟動臨時 HTTP 服務(以 Python 為例):bash
# 主機當前目錄啟動 HTTP 服務(端口 8000) python3 -m http.server 8000
然后在容器內使用
wget
下載文件:bash
# 容器內下載主機的 app.zip 文件(主機 IP 需替換為實際地址) wget http://192.168.1.100:8000/app.zip -O /tmp/app.zip
-
通過 SSH 傳輸文件
若容器內已配置 SSH 服務,可使用scp
從主機復制文件:bash
# 主機 → 容器(容器需開放 SSH 端口,如 2222) scp -P 2222 ./config.ini root@容器IP:/etc/config.ini
方法選擇建議
場景需求 | 推薦方法 | 優點 |
---|---|---|
臨時、少量文件傳輸 | docker cp | 無需配置,操作簡單 |
長期、實時文件共享 | Docker 卷 | 數據持久化,性能穩定 |
容器鏡像內置固定文件 | Dockerfile COPY | 與鏡像綁定,部署便捷 |
跨主機或遠程傳輸 | 網絡工具(wget) | 靈活性高,不受本地環境限制 |