Docker 使用完整流程
1. 写代码
2. 写 requirements.txt
3. 写 Dockerfile
4. 写 .dockerignore
5. docker build 构建镜像
6. docker run 创建并运行容器实例
7. 本地测试是否正常
8. docker tag 改成 Docker Hub 名字
9. docker login 登录 Docker Hub
10. docker push 上传镜像
11. 其他电脑 / 服务器 docker pull 下载镜像
12. docker run 运行服务
1.装WLS步骤 https://docs.docker.com/desktop/features/wsl/
⚪Windows PowerShell出现的问题
安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
加载个人及系统配置文件用了 1659 毫秒。
(base) PS C:\Windows\System32> wsl --install
请求的操作需要提升。
已禁止(403)。
(base) PS C:\Windows\System32>
⚪这个命令必须用管理员权限运行。
已禁止(403)。
就是:系统拒绝了这次操作。常见原因有两个:
- 你现在开的 PowerShell 不是“管理员身份运行”
- 这台电脑被学校/公司策略限制了,普通用户不能启用 WSL、虚拟机平台之类的系统功能
你现在这个提示最常见的情况,就是:
你在普通 PowerShell 里运行了需要管理员权限的命令。
你可以这样做:
先关闭现在这个窗口,然后:
- 点击开始菜单
- 搜索
PowerShell - 右键 Windows PowerShell 或 终端
- 选择 以管理员身份运行
- 再执行
⚪为什么国外的梯子关了就可以下载wsl了
为什么“开梯子反而不行”
因为你一开梯子,系统请求可能变成这样:
你的电脑 → 代理/VPN 节点 → 微软服务
而不是:
你的电脑 → 微软服务
中间多出来的这个代理/VPN 节点,可能带来几种问题:
-
出口 IP 不被接受
有些服务会对某些代理/VPN 出口更严格,直接拒绝。403 本身就表示“服务器理解了请求,但拒绝授权这次访问”。关于 403 的这个一般含义,微软问答也用同样表述。 -
系统级代理配置不匹配
你浏览器能翻,不代表 PowerShell、Store、WSL 下载链路就完全按同样方式工作。微软的代理排查文档明确提到,PowerShell 之类的调用如果代理没有正确配置,就可能出现 403/407。 -
Microsoft Store 相关服务受影响
微软社区和文档中的排障建议反复提到:Store 下载问题常见原因之一就是 VPN、代理、防火墙或第三方安全软件。
⚪在windows装WSL有什么作用,和liunx系统上比有什么区别?是不是在 Windows 上安装 Docker Desktop必须先装WSL,在liunx需要装desktop吗
WSL 的作用,是让你在 Windows 里直接拥有一个可用的 Linux 环境,所以你不用重装双系统,也不用单独开一台完整虚拟机,就能使用 Linux 命令、安装开发环境、运行很多原本更适合 Linux 的工具。它和真正的 Linux 相比,优点是安装方便、和 Windows 配合好、适合日常开发;区别在于它本质上仍然是运行在 Windows 之上的 Linux 环境,更适合开发学习,而真正的 Linux 更适合服务器和生产环境。
对于 Docker 来说,因为 Docker 底层更依赖 Linux 环境,所以在 Windows 上通常需要先装 WSL2,再装 Docker Desktop,让 Docker Desktop 借助 WSL2 来运行;而在 Linux 上,系统本身就已经是 Docker 需要的环境了,所以一般直接安装 Docker Engine 就可以,不一定非要装 Docker Desktop。
👉 Docker Desktop =(管理界面 + 工具) + Docker Engine(核心)
在 Windows / macOS 上:
Docker Desktop 并不是直接在系统里跑 Docker Engine,而是:
Docker Desktop
↓
WSL2 / Linux虚拟环境
↓
Docker Engine(真正干活的)
↓
containerd
↓
容器
也就是说:
-
你在 Windows 输入
docker run -
实际执行的是:
👉 WSL2 里的 Docker Engine
👉 Docker Engine 才是核心执行者
负责:
-
拉镜像(pull)
-
创建容器(run)
-
管理网络、存储
👉 Docker Desktop 只是“管理层”
负责:
-
提供 GUI(界面)
-
启动/停止 Docker
-
管理 WSL2
-
集成 Kubernetes(可选)
-
简化配置
🆚 和 Linux 的区别
Linux:
Linux
↓
Docker Engine
↓
容器
👉 没有 Desktop,也能完全运行
Windows:
Windows
↓
Docker Desktop
↓
WSL2(Linux)可用的 Linux 环境,
↓
Docker Engine
↓
容器
👉 必须绕一层
⚪✅ 第一步:重启电脑(非常关键)
你刚刚启用了系统组件:
VirtualMachinePlatform
👉 必须重启才生效
✅ 第二步:安装 Ubuntu
重启后执行:
wsl --install -d Ubuntu-22.04
或者先看有哪些:
wsl --list --online
✅ 第三步:第一次启动 Ubuntu
会让你设置:
-
用户名
-
密码
👉 到这一步才算真正“装好了 Linux”
✅ 第四步(可选):再迁移到 D 盘
⚠️ 注意顺序:
👉 必须是:
先安装 → 再 export → 再迁移
不是你刚刚那样直接 export ❌
wsl --list --verbose
wsl --shutdown
mkdir D:\wsl
wsl --export Ubuntu-22.04 D:\wsl\ubuntu.tar
wsl --unregister Ubuntu-22.04
wsl --import Ubuntu-22.04 D:\wsl\ubuntu D:\wsl\ubuntu.tar --version 2
wsl -d Ubuntu-22.04
进入 Ubuntu 后验证:
df -h
先在 Windows PowerShell 里把已安装的 Ubuntu 导出成 .tar,再注销原来的发行版,最后用 wsl --import 重新导入到 D:\wsl\ubuntu,这样 WSL 的 Ubuntu 系统就从默认位置迁移到了 D 盘。
2. 第一步:安装 Docker Desktop
👉 双击这个 .exe 安装
安装过程中注意:
⚠️ 勾选这个(非常重要):
-
✔ Use WSL 2 instead of Hyper-V(使用WSL2)
✅ 第二步:安装完成后打开 Docker Desktop
第一次启动会:
-
自动检测 WSL
-
自动接入 Ubuntu
✅ 第三步:配置 WSL 集成(关键步骤)
打开 Docker Desktop:
👉 Settings → Resources → WSL Integration
然后:
-
✔ 打开
Enable integration with my default WSL distro -
✔ 勾选:
Ubuntu-22.04
👉 这一步的意思:
让 Docker 可以直接在你的 Ubuntu 里使用
🔥 三、验证 Docker 是否成功(在 Ubuntu 里)
进入 Ubuntu:
docker version
如果成功,你会看到:
-
Client
-
Server
再运行:
docker run hello-world
👉 如果看到:
Hello from Docker!
说明:
👉 Docker 完全正常了 ✔
⚠️ 四、你现在有一个提示(重要)
你看到这个:
wsl: 检测到 localhost 代理配置,但未镜像到 WSL
👉 意思是:
你的 Windows 有代理(梯子),但没有同步到 WSL
🔧 解决建议(非常重要)
👉 两种选择:
✔ 方法1(简单):
👉 关掉梯子再用 Docker(推荐新手)
⚪报错:For security reasons C:\ProgramData\DockerDesktop must be owned by an elevated account

✅ 方法二:删除残留目录(推荐)
1️⃣ 打开资源管理器
进入:
C:\ProgramData
👉 注意:这是隐藏目录
👉 地址栏直接输入:
C:\ProgramData
2️⃣ 删除:
DockerDesktop
如果有:
Docker
也可以一起删(不放心可以只删 DockerDesktop)
⚪迁移 Docker 镜像
第一步:打开 Docker Desktop
第二步:
点击:
Settings → Resources → Advanced
第三步:找到这个选项
Disk image location
第四步:修改路径
改成:
D:\docker-data
第五步:点击
Apply & Restart
🧠 你的最终结构应该是
D盘
│
├── wsl\ubuntu\
│ └── ext4.vhdx ← 你的Ubuntu系统 ✔
│
├── docker-data\
│ └── DockerDesktopWSL\
│ ├── disk\ ← Docker数据(镜像/容器)✔
│ └── main\ ← Docker系统环境 ✔
3.从本地虚拟环境导出依赖
先打开 PowerShell,进入项目目录:
cd D:\github\DSNet-main
激活你的虚拟环境 DSNet。如果你的虚拟环境是普通 venv,一般类似这样:
D:\github\DSNet-main\DSNet\Scripts\activate
如果你的虚拟环境不在项目里,就激活你实际那个环境。
然后导出依赖:
pip freeze > requirements.txt
这样项目目录下就会生成一个 requirements.txt。
这里要注意
pip freeze 可能会把一些你本地环境里“其实和项目无关”的包也导出来。
所以后面如果 Docker 构建失败,常见原因就是:
-
某些包是本地路径安装的
-
某些 Windows 专用包不适合 Linux 容器
-
某些 CUDA 包版本不匹配
所以第一版先这样做,后面如果报错再精简。
4.写 Dockerfile
1.基础镜像
FROM nvidia/cuda:12.8.0-base-ubuntu22.04
基础镜像。从 NVIDIA 官方提供的镜像出发,包含:
-
cuda 12.8.0:CUDA 工具包版本 -
base:最精简版本,只含运行库,不含编译工具(还有devel含编译器、runtime居中) -
ubuntu22.04:底层操作系统是 Ubuntu 22.04 -
CUDA 镜像解决了什么?
nvidia/cuda:12.8.0-base-ubuntu22.04这个镜像里,NVIDIA 已经预装好了 CUDA 运行库,容器启动后系统里就有libcuda.so、libcublas.so等文件,PyTorch 能直接找到并调用。 -
还有一个条件:宿主机也要有对应驱动
光有 CUDA 镜像还不够,运行容器的宿主机上必须安装了 NVIDIA 驱动,并且使用
nvidia-docker或--gpus all参数启动容器,GPU 才能真正被容器使用:bash
docker run --gpus all myimage python train_dsnet.py
2.apt 安装包时不要弹出交互式问题
ENV DEBIAN_FRONTEND=noninteractive
告诉 apt 安装包时不要弹出交互式问题(比如"请选择时区"),全部自动跳过。否则 Docker 构建时会卡住等待输入。
ENV PYTHONUNBUFFERED=1
Python 输出不缓冲,日志立即打印到终端,方便实时查看训练过程中的 loss 输出。
3.命令/包,安装python3.10
RUN apt-get update && apt-get install -y \
python3.10 \
python3.10-dev \
python3-pip \
libgl1 \
libglib2.0-0 \
&& rm -rf /var/lib/apt/lists/*
| 命令/包 | 作用 |
|---|---|
|
| 刷新软件包列表,获取最新可安装版本信息 |
|
| 安装包, |
|
| Python 3.10 解释器本体 |
|
| Python 开发头文件,某些包(如编译型扩展)安装时需要 |
|
| pip 包管理工具 |
|
| OpenCV 依赖的 OpenGL 库 |
|
| OpenCV 依赖的 GLib 基础库 |
|
| 清理 apt 缓存文件,减小镜像体积 |
4.Ubuntu 默认只有 python3、pip3 命令,没有 python、pip,不建软链接的话运行 python train.py 会报"命令不存在"。
RUN ln -sf /usr/bin/python3.10 /usr/bin/python && \
ln -sf /usr/bin/pip3 /usr/bin/pip
ln -sf 是创建软链接(类似 Windows 快捷方式),-s 软链接,-f 强制覆盖已有链接。
| 命令 | 作用 |
|---|---|
|
| 让 |
|
| 让 |
Ubuntu 默认只有 python3、pip3 命令,没有 python、pip,不建软链接的话运行 python train.py 会报"命令不存在"。
5.在容器内创建 /app 目录并进入,后续所有操作都在这里进行。
WORKDIR /app
在容器内创建 /app 目录并进入,后续所有操作都在这里进行。
6.PyTorch GPU 安装
RUN pip install torch==2.9.1 torchvision \
--index-url https://download.pytorch.org/whl/cu128
| 部分 | 作用 |
|---|---|
|
| 安装指定版本的 PyTorch |
|
| 安装配套的视觉库 |
|
| 从 PyTorch 官方仓库下载, |
PyTorch GPU 版不在普通 PyPI 上,必须指定这个地址,否则装的是 CPU 版。
7.本机的 requirements.txt 复制到容器的 /app/ 目录,pip install -r requirements.txt
COPY requirements.txt .
把本机的 requirements.txt 复制到容器的 /app/ 目录。单独先复制这一个文件是为了利用 Docker 分层缓存——只要依赖没变,这一层不会重新执行。
RUN pip install -r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple
| 部分 | 作用 |
|---|---|
|
| 按照 requirements.txt 安装所有依赖 |
|
| 使用清华镜像源,国内服务器上构建时大幅提速 |
8.把本机当前目录下所有项目文件复制到容器的 /app/ 目录,容器启动时默认执行的命令
COPY . .
把本机当前目录下所有项目文件复制到容器的 /app/ 目录。放在安装依赖之后,是因为代码改动频繁,这样改代码不会触发重新安装包。
CMD ["python", "train_dsnet.py"]
容器启动时默认执行的命令,直接开始运行训练脚本。注意这是默认命令,可以在 docker run 时覆盖,比如 docker run myimage bash 就会进入终端而不是直接训练。
⚪为什么要把代码也打进去
类比理解:
只装环境不装代码 = 买了一台装好 Python 的电脑,但没有程序
→ 开机什么都运行不了
代码 + 环境一起打包 = 买了一台装好 Python 且程序已经在里面的电脑
→ 开机直接能跑
Docker 的目标是交付一个完整的可运行程序,对方拿到镜像,直接:
docker run xieqihang/dsnet:v1.0
就能跑,不需要再手动复制代码、配环境。
容器内部结构
执行 COPY . . 之后,容器里的 /app 目录就是你本地项目的镜像:
容器内 /app/
├── train_dsnet.py ← 你的训练代码
├── test_dsnet.py ← 你的测试代码
├── models/ ← 模型定义
├── utils/ ← 工具函数
├── requirements.txt
└── ...
那数据集和权重呢
大文件不打进镜像,原因:
| 代码 | 数据集/权重 | |
|---|---|---|
| 大小 | 几MB | 几GB甚至几十GB |
| 变化频率 | 改动频繁 | 相对固定 |
| 做法 | 打进镜像 | 运行时用 |
# 代码在镜像里,数据从外面挂载进去
docker run --gpus all \
-v D:/github/DSNet-main/data:/app/data \
-v D:/github/DSNet-main/checkpoints:/app/checkpoints \
xieqihang/dsnet:v1.0
总结
打进镜像: Python环境 + 依赖包 + 项目代码
挂载进来: 数据集 + 模型权重 + 输出结果
镜像 = 一个装好了代码和环境的"集装箱"
运行时再把数据"塞进去"
5.写 .dockerignore
在项目根目录创建 .dockerignore,排除不必要的大文件:
__pycache__/
*.pyc
*.pth
*.pt
data/
checkpoints/
logs/
results/
visualizations/
ablation_results/
bayesian_results/
tuning_results/
.git/
*.ipynb
6.构建镜像
docker build -t xieqihang/dsnet:v1.0 .
| 部分 | 含义 |
|---|---|
|
| 根据 Dockerfile 构建镜像 |
|
| tag,给镜像起名字(-t 是 --tag 的缩写) |
|
| 镜像的完整名字 |
|
| 使用当前目录作为构建上下文 |
镜像名拆解
xieqihang / dsnet : v1.0
│ │ │
│ │ └─ 版本号(标签)
│ └───────── 镜像名
└──────────────────── Docker Hub 用户名(你的账号)
⚪解决方法:配置国内镜像源。 => ERROR [internal] load metadata for docker.io/nvidia/cuda:12.8.0-cudnn-devel-ubuntu22.04
1. 打开 Docker Desktop
Settings → Docker Engine
2. 在 JSON 配置里加入镜像源
找到这个 JSON,添加 registry-mirrors:
json
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://dockerpull.org",
"https://hub.uuuadc.top"
]
}
⚪问题2:缓存损坏
错误 failed size validation: 1371 != 1260 说明之前下载的缓存文件损坏了,需要清除:
docker builder prune -f
修复后重新构建
docker build --no-cache -t xieqihang/dsnet:v1.0 .
--no-cache 强制忽略缓存,从头重新拉取。
3. 点击 Apply & Restart
⚪是不是创建images必须从dockerhub里下载torch和cuda的镜像,不能在本地下载该torch和cuda
不是必须从 Docker Hub 下载
有几种方式可以把环境打进镜像:
方式对比
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 从 Docker Hub 拉基础镜像 | 下载别人做好的镜像 | 省事,标准化 | 需要网络 |
| 从本地 conda 环境导出 | 把你已有的虚拟环境打进去 | 不用重新下载 | 需要额外处理 |
| 离线安装包 | 把 | 完全不依赖网络 | 需要提前准备安装包 |
你的情况:本地已有 DSNet 环境
可以直接把本地的包导出成 .whl 文件打进镜像,完全不需要联网下载。
第一步:导出本地所有包的 whl 文件
conda activate DSNet
mkdir wheels
pip download -r requirements.txt -d ./wheels
# torch 单独导出
pip download torch==2.9.1 torchvision==0.24.1 \
--index-url https://download.pytorch.org/whl/cu128 \
-d ./wheels
第二步:修改 Dockerfile 使用本地 whl
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
RUN apt-get update && apt-get install -y \
python3.10 \
python3.10-dev \
python3-pip \
libgl1 \
libglib2.0-0 \
libsm6 \
libxext6 \
&& rm -rf /var/lib/apt/lists/*
RUN ln -sf /usr/bin/python3.10 /usr/bin/python && \
ln -sf /usr/bin/pip3 /usr/bin/pip
WORKDIR /app
# 复制本地 whl 文件
COPY wheels/ ./wheels/
# 从本地安装,完全不联网
RUN pip install ./wheels/*.whl --no-index --find-links ./wheels
COPY . .
CMD ["python", "train_dsnet.py"]
但还有一个问题
不管用哪种方式,基础镜像(第一行 FROM)都需要从 Docker Hub 拉取,比如 ubuntu:22.04 或 pytorch/pytorch:...。
除非你:
# 在能联网的机器上先拉好
docker pull ubuntu:22.04
# 导出成文件
docker save -o ubuntu22.tar ubuntu:22.04
# 在不能联网的机器上导入
docker load -i ubuntu22.tar
你现在最简单的方案
ubuntu:22.04 这个基础镜像非常小(约80MB),国内镜像源基本都有缓存,不会有之前 nvidia/cuda 那种损坏问题。
先测试:
docker pull ubuntu:22.04
⚪在 Git Bash 里,用的是 docker:desktop-linux。需要切换到 WSL Ubuntu 终端来执行。
操作步骤
1. 打开 WSL Ubuntu 终端
在 Windows 搜索栏搜索 Ubuntu,打开那个黑色终端(不是 Git Bash)
2. 切换到项目目录
bash
cd /mnt/d/github/DSNet-main
3. 确认 Dockerfile 在这里
ls Dockerfile
4. 执行构建
docker build -t xieqihang/dsnet:v1.0 .
怎么区分两个终端
| 特征 | Git Bash | WSL Ubuntu |
|---|---|---|
| 提示符 |
|
|
| Docker 上下文 |
|
|
| pull 是否成功 | ❌ | ✅ |
之前你 pull 成功就是在 WSL Ubuntu 终端里操作的,build 也要在同一个终端里执行。
⚪问题就是 BuildKit 还要去联网验证,直接关掉它:
bash
DOCKER_BUILDKIT=0 docker build -t xieqihang/dsnet:v1.0 .
这样 Docker 会直接用本地已有的 pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel 镜像,不再联网验证
You said: 什么意思,为什么要联网验证,联网是什么意思?
什么意思,为什么要联网验证,联网是什么意思?
解析了Docker在线验证的含义和必要性。
为什么要联网验证
Docker 的 BuildKit 每次构建时,即使本地已经有镜像了,也会先去 Docker Hub 核对一下版本:
BuildKit 的逻辑:
"我本地有 pytorch:2.9.1 这个镜像,
但我要先问一下 Docker Hub:
这个镜像有没有更新过?
有没有新版本?"
↓
去访问 https://auth.docker.io ← 这就是"联网"
↓
国内访问被墙 → 超时报错
"联网"是什么意思
就是 Docker 去访问 Docker Hub 的服务器(在美国),国内访问这个地址不稳定,经常超时:
你的电脑 → → → 防火墙拦截 → × Docker Hub(美国)
关掉 BuildKit 之后
老版本构建引擎的逻辑:
"本地有这个镜像?
有!
直接用,不问了。"
↓
完全不联网,直接构建
类比理解
BuildKit(新引擎)= 去超市买东西前,
先上网查一下有没有更新款
→ 网断了就买不了
老引擎 = 直接去超市货架上拿
→ 本地有就直接用,不管网络
所以执行:
DOCKER_BUILDKIT=0 docker build -t xieqihang/dsnet:v1.0 .
⚪报错:现在卡在 apt-get update 这步,jammy-backports 源返回了 502 错误。

解决方法:换成国内 apt 源
修改 Dockerfile 的 Step 4 部分,在 apt-get 之前先换源:
FROM pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel
ENV DEBIAN_FRONTEND=noninteractive
ENV PYTHONUNBUFFERED=1
# 换成阿里云 apt 源,解决国内访问 ubuntu 官方源慢/失败的问题
RUN sed -i 's|http://archive.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list && \
sed -i 's|http://security.ubuntu.com|http://mirrors.aliyun.com|g' /etc/apt/sources.list
# 安装系统依赖
RUN apt-get update && apt-get install -y \
libgl1 \
libglib2.0-0 \
libsm6 \
libxext6 \
git \
wget \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# 第一步:安装 mmcv
RUN pip install mmcv-full==1.7.2 \
-f https://download.openmmlab.com/mmcv/dist/cu128/torch2.9/index.html
# 第二步:安装其余依赖
COPY requirements.txt .
RUN pip install -r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple \
--ignore-installed mmcv-full
# 第三步:复制项目代码
COPY . .
CMD ["python", "train_dsnet.py"]
⚪为什么不推荐直接打包本地虚拟环境?
1. 操作系统不兼容
这是最大的问题。
你本地虚拟环境如果是在 Windows 创建的,那么里面很多东西是:
-
Windows 路径
-
Windows 的二进制文件
-
.pyd/.dll -
Windows 版编译产物
而 Docker 里的镜像通常是 Linux。
所以你把本地虚拟环境直接复制进去,常见结果就是:
-
路径失效
-
动态库找不到
-
torch / mmcv / opencv 导入失败
-
编译扩展不能用
也就是说:
Windows 的 venv 几乎不能直接拿到 Linux 容器里用。
2. 虚拟环境里有很多“写死的路径”
虚拟环境并不是只有包那么简单,它里面还常常包含:
-
Python 解释器路径
-
shebang 路径
-
激活脚本路径
-
pip 和 python 的链接关系
例如本地可能写着:
D:\github\DSNet-main\.venv\Scripts\python.exe
进了容器以后根本不存在这个路径。
所以即使文件复制过去了,也未必真能用
7.本地测试镜像
简洁总结就是这几句:
你前两条命令已经证明:
-
镜像构建成功了
-
容器能启动
-
PyTorch 正常
-
GPU 也正常可用
三条命令分别是在做:
-
docker run --rm xieqihang/dsnet:v1.0 python --version
用来测试镜像和 Python 能不能正常启动 -
docker run --rm --gpus all xieqihang/dsnet:v1.0 python -c "..."
用来测试 torch 和 GPU 能不能在容器里用 -
docker run --rm --gpus all -v /mnt/d/github/DSNet-main:/app xieqihang/dsnet:v1.0 python train_dsnet.py
用来挂载你的本地项目目录,并正式运行训练脚本
每一部分解释
⚪1)docker run
启动一个新容器
⚪2)--rm
容器运行结束后自动删除
⚪3)--gpus all
把所有 GPU 给容器
所以你的训练脚本里显示
设备: cuda
这就是这个参数起作用了。
⚪4)-v /mnt/d/github/DSNet-main:/app
这是最关键的一个参数之一。
-v 是 volume mount,意思是:
把你宿主机上的目录挂载到容器里
格式是:
-v 宿主机路径:容器路径
你这里是:
- 宿主机路径:
/mnt/d/github/DSNet-main - 容器路径:
/app
意思是:
把你 Windows D 盘里的 DSNet-main 项目目录,挂载到容器的 /app
现在真正的报错不是 Docker 出问题,而是:
你的代码里把数据集路径写成了 Windows 路径 D:\github\...,但容器里是 Linux 环境,只认 /app/... 这种路径。
所以现在要改的不是 Docker,而是训练代码里的数据路径。
应该把:
D:\github\DSNet-main\data\hanfeng\...
改成类似:
/app/data/hanfeng/...
或者直接改成相对路径:
data/hanfeng/...
8.登录 Docker Hub
❗核心问题
你现在问的是:
👉 docker login 时 Password 填什么?
✅ 正确答案
👉 这里不要填你账号密码!
👉 应该填的是:PAT(Personal Access Token)
🧠 为什么?
Docker 官方现在推荐:
👉 CLI 登录(终端登录)
👉 用 Token 替代密码
原因:
-
更安全
-
避免密码泄露
-
Docker Desktop 自动生成的也是 token(你截图里已经有了)
🚨 关键问题(你现在卡住的原因)
你现在这个页面👇
👉 是“Edit token”(编辑页面)
❌ 这里看不到 token 的值
❌ 你也不能复制 token
✅ 正确做法(重新生成一个 Token)
⚪第1步:创建新的 PAT (登陆https://app.docker.com/accounts/2232182)
点击左侧:
👉 Personal access tokens
然后点:
👉 Generate new token
⚪第2步:填写
随便填:
-
Name:dsnet
-
Scopes:默认(Read, Write, Delete)✅
⚪第3步:创建后
⚠️ 关键点!!!
👉 会弹出一个 token:
xxxxxxxxxxxxxxxxxxxxxxxx
👉 必须马上复制!!!
因为:
❗关掉页面后就再也看不到了
⚪🚀 第4步:在终端登录
docker login -u 2232182
然后:
Password:
👉 粘贴刚刚复制的 token(不是密码!!!)
🟢 成功后会显示
Login Succeeded
⚪ 第5步:再 push
docker tag xieqihang/dsnet:v1.0 2232182/dsnet:v1.0
docker push 2232182/dsnet:v1.0
❗总结你现在的问题
你之前失败是因为:
👉 用了:
账号密码 ❌
👉 正确应该用:
PAT(token)✅
🧠 一句话总结
👉
docker login 的 Password 现在应该填“Token”,不是账号密码
9.推送镜像
⚪是重新生成一个带 Write 权限的 token。
操作就这几步:
- 打开 Docker Hub 的账号设置,进入 Personal access tokens。
- 新建一个 token。
- 权限至少勾上:
- Read
- Write
Delete可选
- 创建后立刻复制这个 token。

⚪问题2:你看到“4个镜像是不是占4份空间?”
你看到:
2232182/dsnet:v1.0
xieqihang/dsnet:v1.0
xqh/dsnet:v1.0
👉 不是 3 份镜像!!!
🧠 关键判断标准
看这一列:
IMAGE ID
722177196d54
👉 三个名字 全部一样
✅ 正确理解
👉 这不是 3 个镜像,而是:
一个镜像
↑
被三个 tag(名字)指向
📦 为什么显示一样的 29.5GB?
因为 Docker CLI 是按“镜像名字”展示:
每个 tag 都显示一遍大小
但实际上:
👉 磁盘只占一份空间
🧠 类比
就像:
文件 A
↑
三个快捷方式
看起来像3个文件
其实只有1份数据
docker rmi xqh/dsnet:v1.0 (删除该tag)
10.查看搜索所有的市面镜像


⚪✅ 正确搜索入口(最简单)
在页面最上面的 “Search Docker Hub” 输入 pytorch → 点 pytorch/pytorch → 再点 Tags 找版本。
11.本地使用
⚪一、下载到本地(pull)
你之前用的镜像:
docker pull pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel
👉 作用:
-
从 Docker Hub 下载
-
存到你电脑里
✅ 下载完成后验证
docker images
看到:
pytorch/pytorch 2.9.1-cuda12.8-cudnn9-devel
✔ 说明已经在本地了
⚪🚀二、在本地运行(最关键)
✅ 1️⃣ 最简单测试(进容器)
docker run -it pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel bash
👉 作用:
-
启动容器
-
进入 Linux 环境
✅ 2️⃣ 如果用 GPU(你这种情况必须)
docker run -it --gpus all pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel bash
🔍 验证 GPU
进入后执行:
python -c "import torch; print(torch.cuda.is_available())"
👉 输出:
True
✔ GPU 正常
⚪ 三、运行你自己的项目(重点)
你之前 DSNet 用的是:
docker run --rm --gpus all -v /mnt/d/github/DSNet-main:/app \
2232182/dsnet:v1.0 python train_dsnet.py
🧠 解释一下
-v /mnt/d/github/DSNet-main:/app
👉 把你本地代码挂进容器
本地路径 → 容器里的 /app
⚪四、如果你想直接用官方 PyTorch跑代码
docker run --rm -it --gpus all \
-v /mnt/d/github/DSNet-main:/workspace \
pytorch/pytorch:2.9.1-cuda12.8-cudnn9-devel \
bash
进入后:
cd /workspace
python train_dsnet.py
❗常见坑(你之前已经遇到过)
❌ 数据路径错误(Windows路径)
D:\xxx ❌
👉 Docker 里必须用:
/mnt/d/xxx ✔
❌ GPU不生效
👉 要加:
--gpus all
❌ 没挂载代码
👉 要加:
-v 本地路径:容器路径
本地用 Docker 三步走:
# 1. 下载
docker pull xxx
# 2. 运行
docker run -it --gpus all xxx bash
# 3. 挂载代码运行
docker run --gpus all -v 本地路径:/app xxx python train.py
12.本地代码修改,如何在镜像中使用
下载镜像后,不等于代码被锁死。
你有两种方式:
方式 A:镜像里自带代码运行
这种适合“直接复现”,不方便边改边试。
方式 B:本地代码挂载到容器里运行
这种最适合你现在,本地改代码,容器立刻用新代码。
你刚刚上传的镜像里,代码是什么状态?
你 Dockerfile 里有:
COPY . .
这表示在 build 那一刻,把当时项目目录里的代码复制进镜像。
所以:
-
镜像里保存的是构建当时那一版代码
-
不是以后自动同步的代码
-
你后来本地再改,镜像里的旧代码不会自动变
也就是说,镜像更像一个“拍好的快照”。
下载镜像以后,还能不能改代码?
能。
关键在于你怎么运行。
⚪情况 1:直接运行镜像里的代码
比如:
docker run --rm --gpus all 2232182/dsnet:v1.0 python train_dsnet.py
这种情况下,容器直接用的是镜像内部那份旧代码。
所以如果你本地改了代码,这条命令看不到你的修改。
⚪情况 2:把本地代码挂载进去
比如:
docker run --rm --gpus all -v /mnt/d/github/DSNet-main:/app 2232182/dsnet:v1.0 python train_dsnet.py
这时候:
-
容器里的
/app -
会被你本地的
DSNet-main覆盖
也就是说,虽然镜像里原本也有代码,
但运行时实际用的是你本地最新代码。
所以你在本地改:
-
模型结构
-
训练脚本
-
配置文件
-
dataset 代码
容器里都会立刻看到。
这就是你现在最该用的方式。
你问“是不是下载了源代码?”
严格说:
下载镜像,不等于下载一个方便编辑的源码文件夹。
镜像里确实包含代码,但它是放在容器文件系统里的,不像你本地项目目录那样方便长期编辑管理。
所以通常不推荐这样改:
-
先进容器
-
在容器里手动改代码
-
退出
因为这样改:
-
容器删了就没了
-
不好版本管理
-
不方便和本地同步
正确思路是什么?
你要把“镜像”和“代码”分开想
镜像负责:
-
Python 环境
-
PyTorch
-
CUDA
-
依赖库
-
系统环境
本地代码负责:
-
你的模型
-
训练逻辑
-
配置
-
数据路径
-
你每天改的内容
这样最合理。
最适合你的工作流
第一种:开发阶段
本地改代码 + 挂载运行
命令类似:
docker run --rm --gpus all -it \
-v /mnt/d/github/DSNet-main:/app \
2232182/dsnet:v1.0 \
python train_dsnet.py
这样你每次改完本地代码,重新运行就行,不用重新 build。
第二种:定版阶段
当你代码改稳定了,再重新 build 一次:
docker build -t 2232182/dsnet:v2.0 .
然后 push 新版本:
docker push 2232182/dsnet:v2.0
这样镜像里才会更新成你最新代码。
什么时候需要重新 build?
只有这几种情况需要重新 build:
1. 你改了 Dockerfile
比如:
-
新装依赖
-
改基础镜像
-
改系统库
2. 你想把“最新代码”固化进镜像
比如准备上传给别人用
3. 你本地代码不想挂载,想完全靠镜像运行
什么时候不需要重新 build?
如果你只是改:
-
train_dsnet.py -
model.py -
loss.py -
config.py -
dataset 代码
而且你运行时用了 -v 本地路径:/app
那通常不用重新 build。
你担心的那个点,直接回答
你说:
我下载这个镜像之后,是不是就不能修改代码了?
不是。
你完全可以继续改代码,前提是你要用挂载本地目录的方式运行,而不是只跑镜像内部那份代码。
你可以把它理解成这样
不挂载时
镜像里代码 = 一张照片
你本地后来怎么改,照片都不会变
挂载时
容器启动后直接看你本地文件夹
所以你本地一改,容器就读到新代码
给你最实用的建议
你现在最合适的方案是:
保留镜像作为环境
保留本地项目作为代码
运行时挂载本地项目进去
也就是继续用这种思路:
docker run --rm --gpus all -v /mnt/d/github/DSNet-main:/app 2232182/dsnet:v1.0 python train_dsnet.py

254

被折叠的 条评论
为什么被折叠?



