docker安装和使用

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)。
就是:系统拒绝了这次操作。常见原因有两个:

  1. 你现在开的 PowerShell 不是“管理员身份运行”
  2. 这台电脑被学校/公司策略限制了,普通用户不能启用 WSL、虚拟机平台之类的系统功能

你现在这个提示最常见的情况,就是:

你在普通 PowerShell 里运行了需要管理员权限的命令。

你可以这样做:

先关闭现在这个窗口,然后:

  1. 点击开始菜单
  2. 搜索 PowerShell
  3. 右键 Windows PowerShell终端
  4. 选择 以管理员身份运行
  5. 再执行
⚪为什么国外的梯子关了就可以下载wsl了

为什么“开梯子反而不行”

因为你一开梯子,系统请求可能变成这样:

你的电脑 → 代理/VPN 节点 → 微软服务

而不是:

你的电脑 → 微软服务

中间多出来的这个代理/VPN 节点,可能带来几种问题:

  1. 出口 IP 不被接受
    有些服务会对某些代理/VPN 出口更严格,直接拒绝。403 本身就表示“服务器理解了请求,但拒绝授权这次访问”。关于 403 的这个一般含义,微软问答也用同样表述。

  2. 系统级代理配置不匹配
    你浏览器能翻,不代表 PowerShell、Store、WSL 下载链路就完全按同样方式工作。微软的代理排查文档明确提到,PowerShell 之类的调用如果代理没有正确配置,就可能出现 403/407。

  3. 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.solibcublas.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/*

命令/包

作用

apt-get update

刷新软件包列表,获取最新可安装版本信息

apt-get install -y

安装包,-y 表示全部自动确认

python3.10

Python 3.10 解释器本体

python3.10-dev

Python 开发头文件,某些包(如编译型扩展)安装时需要

python3-pip

pip 包管理工具

libgl1

OpenCV 依赖的 OpenGL 库

libglib2.0-0

OpenCV 依赖的 GLib 基础库

rm -rf /var/lib/apt/lists/*

清理 apt 缓存文件,减小镜像体积


4.Ubuntu 默认只有 python3pip3 命令,没有 pythonpip,不建软链接的话运行 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 强制覆盖已有链接。

命令

作用

ln -sf /usr/bin/python3.10 /usr/bin/python

python 命令指向 python3.10

ln -sf /usr/bin/pip3 /usr/bin/pip

pip 命令指向 pip3

Ubuntu 默认只有 python3pip3 命令,没有 pythonpip,不建软链接的话运行 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

部分

作用

torch==2.9.1

安装指定版本的 PyTorch

torchvision

安装配套的视觉库

--index-url https://download.pytorch.org/whl/cu128

从 PyTorch 官方仓库下载,cu128 表示 CUDA 12.8 对应的 GPU 版本

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

部分

作用

pip install -r requirements.txt

按照 requirements.txt 安装所有依赖

-i https://pypi.tuna.tsinghua.edu.cn/simple

使用清华镜像源,国内服务器上构建时大幅提速


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

变化频率

改动频繁

相对固定

做法

打进镜像

运行时用 -v 挂载

# 代码在镜像里,数据从外面挂载进去
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 .

部分

含义

docker build

根据 Dockerfile 构建镜像

-t

tag,给镜像起名字(-t 是 --tag 的缩写)

xieqihang/dsnet:v1.0

镜像的完整名字

.

使用当前目录作为构建上下文


镜像名拆解

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 环境导出

把你已有的虚拟环境打进去

不用重新下载

需要额外处理

离线安装包

.whl 文件复制进容器

完全不依赖网络

需要提前准备安装包


你的情况:本地已有 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.04pytorch/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

提示符

MINGW64 /d/github/...

xieqihang@xie666:~$

Docker 上下文

docker:desktop-linux

docker:default

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

操作就这几步:

  1. 打开 Docker Hub 的账号设置,进入 Personal access tokens
  2. 新建一个 token。
  3. 权限至少勾上:
    • Read
    • Write
    • Delete 可选
  4. 创建后立刻复制这个 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值