# 本地文件上传到 WSL、远程服务器、远程服务器上的 Docker 容器

发布时间:2026/11/2 6:08:40
# 本地文件上传到 WSL、远程服务器、远程服务器上的 Docker 容器

本文介绍如何在 Windows、WSL、远程 Linux 服务器和 Docker 容器之间传输文件,主要分为两种情况:

1. **小文件的上传与下载**:例如 `.py`、`.txt`、`.csv` 等文件。
2. **大文件夹的上传与下载**:例如包含大量计算结果、图片、VTU 文件的文件夹。

## 一、Windows 与 WSL 之间的文件传输

Windows 的 C 盘在 WSL 中对应 `/mnt/c/`,因此可以直接通过 `cp` 命令复制文件。

### 1. 上传小文件:Windows → WSL

```bash
cp /mnt/c/Users/Bear/Desktop/Floder/filename ~/Lshape_cvtopt/
```

**解释:**

- `Bear`:Windows 用户名。
- `Floder`:Windows 桌面上的文件夹名称。
- `filename`:需要上传的文件名称。
- `~/Lshape_cvtopt/`:WSL 主目录下的目标文件夹。

**作用:** 将 Windows 用户 `Bear` 桌面上 `Floder` 文件夹中的 `filename` 文件复制到 WSL 主目录下的 `Lshape_cvtopt` 文件夹。

如果文件需要作为程序执行,可以添加执行权限:

```bash
chmod +x ~/Lshape_cvtopt/filename
```

注意:普通 Python 脚本通过 `python filename.py` 运行时,一般不需要执行 `chmod +x`。

### 2. 下载小文件:WSL → Windows

```bash
cp ~/Lshape_cvtopt/filename /mnt/c/Users/Bear/Desktop/
```

**作用:** 将 WSL 中的 `filename` 文件复制到 Windows 桌面。

### 3. 上传大文件夹:Windows → WSL

```bash
cp -r /mnt/c/Users/Bear/Desktop/Floder ~/Lshape_cvtopt/
```

**作用:** 将 Windows 桌面上的整个 `Floder` 文件夹复制到 WSL 的 `Lshape_cvtopt` 目录中。

其中 `-r` 表示递归复制,包括文件夹中的所有文件及子文件夹。

### 4. 下载大文件夹:WSL → Windows

```bash
cp -r ~/Lshape_cvtopt /mnt/c/Users/Bear/Desktop/
```

**作用:** 将 WSL 中的整个 `Lshape_cvtopt` 文件夹复制到 Windows 桌面。

> **注意:** 上述命令均在 WSL 终端中执行。目标目录需要事先存在。

---

## 二、本地电脑与远程服务器之间的文件传输

本地电脑与远程服务器之间通常使用 `scp` 命令。

基本格式:

```bash
scp 本地路径 用户名@服务器IP:服务器路径
```

如果服务器路径写在前面、本地路径写在后面,就是下载。

### 1. 上传小文件:本地 → 服务器

将当前目录下的 `pytorch_1.py` 上传到服务器主目录:

```bash
scp pytorch_1.py name@xxx.xxx.xxx.xxx:~/
```

将文件上传到服务器指定目录:

```bash
scp pytorch_1.py name@xxx.xxx.xxx.xxx:/path/to/your/directory/
```

其中:

- `pytorch_1.py`:需要上传的本地文件。
- `name`:服务器用户名。
- `xxx.xxx.xxx.xxx`:服务器 IP 地址。
- `~/`:服务器用户的主目录。

### 2. 下载小文件:服务器 → 本地

下载服务器主目录中的文件到本地当前目录:

```bash
scp name@xxx.xxx.xxx.xxx:~/pytorch_1.py ./
```

下载服务器指定目录中的文件:

```bash
scp name@xxx.xxx.xxx.xxx:/path/to/your/filename ./
```

这里 `./` 表示执行命令时所在的本地目录。

如果在 Windows PowerShell 中执行,希望下载到 Windows 桌面:

```powershell
scp name@xxx.xxx.xxx.xxx:~/pytorch_1.py C:\Users\Bear\Desktop\
```

### 3. 上传大文件夹:本地 → 服务器

使用 `scp -r`:

```bash
scp -r Lshape_cvtopt name@xxx.xxx.xxx.xxx:~/
```

**作用:** 将本地整个 `Lshape_cvtopt` 文件夹上传到服务器主目录。

如果文件夹很大,或者有大量文件,更推荐使用 `rsync`:

```bash
rsync -avh --progress Lshape_cvtopt/ name@xxx.xxx.xxx.xxx:~/Lshape_cvtopt/
```

其中:

- `-a`:保留目录结构、文件时间等信息。
- `-v`:显示传输过程。
- `-h`:以易读形式显示文件大小。
- `--progress`:显示文件传输进度。

`rsync` 的优势是再次运行时,通常只需要传输发生变化的文件,不必每次都重新复制整个文件夹。

### 4. 下载大文件夹:服务器 → 本地

使用 `scp -r`:

```bash
scp -r name@xxx.xxx.xxx.xxx:~/Lshape_cvtopt ./
```

**作用:** 将服务器上的整个 `Lshape_cvtopt` 文件夹下载到本地当前目录。

对于大型结果文件夹,更推荐:

```bash
rsync -avh --progress name@xxx.xxx.xxx.xxx:~/results/ ./results/
```

**作用:** 将服务器 `~/results/` 内的文件同步到本地 `./results/` 文件夹。

如果下载中断,可以重新执行相同命令,避免重复传输大部分未改变的文件。

> **注意:** `scp` 和 `rsync` 命令应该在本地终端执行,而不是先 SSH 登录服务器后再执行。这里的本地可以是 Windows PowerShell,也可以是 WSL,但路径写法不同。
>
> 如果服务器 SSH 使用非默认端口,例如 `2222`,`scp` 使用 `-P 2222`,而 `rsync` 可以使用 `-e "ssh -p 2222"`。
>
> 在使用 `rsync` 前,需要确保对应环境已安装 `rsync`。

---

## 三、远程服务器与 Docker 容器之间的文件传输

假设已经通过 SSH 登录远程服务器,并且服务器中有一个名为 `my-container-name` 的 Docker 容器。

可以通过 `docker cp` 命令在服务器和容器之间复制文件。

### 1. 上传小文件:服务器 → 容器

```bash
docker cp pytorch_1.py my-container-name:/workspace/
```

**作用:** 将服务器当前目录下的 `pytorch_1.py` 文件复制到 Docker 容器的 `/workspace/` 目录。

如果文件不在当前目录:

```bash
docker cp ~/Lshape_cvtopt/pytorch_1.py my-container-name:/workspace/
```

### 2. 下载小文件:容器 → 服务器

```bash
docker cp my-container-name:/workspace/pytorch_1.py ~/
```

**作用:** 将容器 `/workspace/` 中的 `pytorch_1.py` 文件复制到远程服务器主目录。

### 3. 上传大文件夹:服务器 → 容器

```bash
docker cp ~/Lshape_cvtopt my-container-name:/workspace/
```

**作用:** 将服务器上的整个 `Lshape_cvtopt` 文件夹复制到容器 `/workspace/` 下。

与 `scp` 不同,`docker cp` 复制文件夹时不需要添加 `-r`。

### 4. 下载大文件夹:容器 → 服务器

```bash
docker cp my-container-name:/workspace/results ~/results
```

**作用:** 将容器中的整个 `/workspace/results` 文件夹复制到服务器主目录,保存为 `~/results`。

也可以下载整个 `/workspace`:

```bash
docker cp my-container-name:/workspace ~/
```

**作用:** 将容器中的 `/workspace` 文件夹复制到远程服务器的主目录。

> **注意:** 以上命令一般在远程服务器终端中执行,而不是容器内部。需要服务器用户具备相应的 Docker 操作权限。

---

## 四、从远程 Docker 容器下载到本地电脑

实际计算中,经常需要将 Docker 容器生成的大量计算结果下载到 Windows 或 WSL。

最简单的方法是分两步操作。

### 1. 下载小文件

**第一步:容器 → 远程服务器**

登录远程服务器后执行:

```bash
docker cp my-container-name:/workspace/result.csv ~/result.csv
```

**第二步:远程服务器 → Windows**

在本地 Windows PowerShell 中执行:

```powershell
scp name@xxx.xxx.xxx.xxx:~/result.csv C:\Users\Bear\Desktop\
```

这样就将容器中的 `result.csv` 下载到了 Windows 桌面。

### 2. 下载大文件夹

假设容器 `/workspace/results/` 中保存了大量计算结果。

**第一步:容器 → 远程服务器**

在远程服务器中执行:

```bash
docker cp my-container-name:/workspace/results ~/results
```

**第二步:远程服务器 → 本地**

在本地 WSL 终端中执行:

```bash
rsync -avh --progress name@xxx.xxx.xxx.xxx:~/results/ /mnt/c/Users/Bear/Desktop/results/
```

**作用:** 将服务器 `~/results/` 中的所有内容下载到 Windows 桌面的 `results` 文件夹。

需要确保 Windows 桌面上的 `results` 目录已经存在;如果不存在,可以先在 WSL 中执行:

```bash
mkdir -p /mnt/c/Users/Bear/Desktop/results
```

如果不使用 `rsync`,也可以在 Windows PowerShell 中执行:

```powershell
scp -r name@xxx.xxx.xxx.xxx:~/results C:\Users\Bear\Desktop\
```

### 3. 上传大文件夹到远程容器

上传方向相反,也分为两步。

**第一步:本地 → 远程服务器**

在本地 WSL 中执行:

```bash
rsync -avh --progress ~/Lshape_cvtopt/ name@xxx.xxx.xxx.xxx:~/Lshape_cvtopt/
```

**第二步:远程服务器 → Docker 容器**

登录远程服务器后执行:

```bash
docker cp ~/Lshape_cvtopt my-container-name:/workspace/
```

---

## 五、常用命令和路径说明

| 命令或符号 | 作用 |
|---|---|
| `cp` | 在本机文件系统之间复制文件 |
| `cp -r` | 递归复制整个文件夹 |
| `scp` | 通过 SSH 在本地与远程服务器之间复制文件 |
| `scp -r` | 通过 SSH 复制整个文件夹 |
| `rsync -avh --progress` | 适合大型文件夹、重复同步及查看传输进度 |
| `docker cp` | 在 Docker 容器与宿主服务器之间复制文件或文件夹 |
| `~/` | 当前用户的主目录 |
| `./` | 当前工作目录 |
| `/mnt/c/` | WSL 中 Windows C 盘的挂载路径 |
| `name@IP:path` | 指定远程服务器上的路径 |

### 最常用的四种操作

**上传小文件到服务器:**

```bash
scp filename name@xxx.xxx.xxx.xxx:~/
```

**下载小文件到本地:**

```bash
scp name@xxx.xxx.xxx.xxx:~/filename ./
```

**上传大文件夹到服务器:**

```bash
rsync -avh --progress folder/ name@xxx.xxx.xxx.xxx:~/folder/
```

**下载大文件夹到本地:**

```bash
rsync -avh --progress name@xxx.xxx.xxx.xxx:~/folder/ ./folder/
```

> **补充说明:**
>
> - `scp -r` 更简单,适合一次性复制文件夹。
> - `rsync` 更适合大型文件夹以及需要反复同步的科研计算结果。
> - `rsync` 路径末尾的 `/` 很重要:`folder/` 表示复制文件夹内的内容,而 `folder` 表示复制文件夹本身。
> - 以上命令默认都是复制操作,不会自动删除源文件。
> - 如果 Docker 容器使用了目录挂载,计算结果可能直接保存在服务器目录中,此时不需要再使用 `docker cp`。