前言
你是不是也遇到过这样的场景:

  • 照着教程一步步配置环境,结果报错 CUDA version mismatch
  • 换一台电脑后,同样的代码就跑不起来了?
  • 想尝试新模型,又怕把现有环境搞乱?

这些痛点,Docker 都能解决。无论你是AI新手还是老手,掌握Docker都能让你事半功倍。本文将从“为什么AI学习需要Docker”讲起,手把手带你快速上手,提供常用命令速查表、常见问题解决方案,并附三个必练实战项目(Nginx、MySQL、自打包应用),让你一次性掌握Docker核心技能。


📌 目录

  1. 为什么AI学习者必须了解Docker?
  2. Docker核心概念(极简版)
  3. Docker快速上手(含GPU支持)
  4. Docker常用命令速查(收藏用)
  5. 常见问题及解决办法
  6. 实战项目:三个必练的Docker上手项目
  7. 总结

1. 为什么AI学习者必须了解Docker?

🔹 环境一致,告别“我这能跑啊”

AI项目依赖大量库:PyTorch、TensorFlow、CUDA、cuDNN……版本稍有不同就可能报错。Docker把整个环境(包括操作系统、驱动、代码)打包成一个镜像,在任何机器上运行结果都一样。

🔹 隔离依赖,多项目不打架

你想同时学习两个课程:一个用PyTorch 1.10,另一个用2.0。直接装在本机很容易冲突。Docker为每个项目创建独立容器,切换只需停止/启动容器。

🔹 简化GPU配置

配置NVIDIA驱动、CUDA、cuDNN对新手很不友好。Docker官方提供了nvidia/cuda基础镜像,已预装正确版本,你只需在此基础上安装PyTorch即可。

🔹 可复现研究

保存代码不够,环境变了结果就不同。Docker把环境+代码一起打包,任何时候运行都能复现。

🔹 方便分享与部署

训练好的模型,别人想测试?给他一个Docker镜像,他只需一条docker run命令就能运行,无需安装任何依赖。


2. Docker核心概念(极简版)

概念解释类比
镜像(Image)只读模板,包含运行应用所需的一切类(Class)
容器(Container)镜像的运行实例对象(Object)
Dockerfile描述如何构建镜像的文本文件配方
仓库(Registry)存放镜像的地方(如Docker Hub)GitHub

一句话:写 Dockerfile → 构建镜像 → 运行容器。


3. Docker快速上手(含GPU支持)

3.1 安装Docker

  • Windows / Mac:下载 Docker Desktop 并安装。
  • Linux (Ubuntu)
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo usermod -aG docker $USER   # 免sudo运行
    

3.2 安装NVIDIA Container Toolkit(如需GPU)

# Ubuntu
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

3.3 运行第一个AI容器

# 拉取PyTorch官方镜像(带CUDA)
docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

# 运行容器,映射当前目录到/workspace,并使用GPU
docker run -it --gpus all -v $(pwd):/workspace pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime bash

进入容器后,输入python,试试import torch; torch.cuda.is_available(),应该返回True

3.4 写一个简单的Dockerfile

创建一个文件Dockerfile,内容如下:

FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "train.py"]

然后构建镜像:

docker build -t my-ai-app .

4. Docker常用命令速查(收藏用)

📦 镜像操作

命令说明
docker pull <镜像名>下载镜像
docker images列出本地镜像
docker rmi <镜像ID>删除镜像
docker build -t <名称> .构建镜像(注意最后的点)

🚀 容器操作

命令说明
docker run -it <镜像> <命令>创建并启动容器(交互式)
docker run -d --name <容器名> <镜像>后台运行
docker ps查看运行中的容器
docker ps -a查看所有容器(包括已停止)
docker stop <容器ID>停止容器
docker start <容器ID>启动已存在的容器
docker rm <容器ID>删除容器(需先停止)
docker exec -it <容器ID> bash进入运行中的容器

🔧 资源与GPU

命令说明
--gpus alldocker run 参数,分配所有GPU
--gpus '"device=0,1"'指定使用0号和1号GPU
-v 宿主机路径:容器路径挂载目录(数据持久化)
-p 宿主机端口:容器端口端口映射
docker logs <容器ID>查看容器输出日志

🧹 清理

命令说明
docker system prune删除所有停止的容器、未使用的网络、悬空镜像
docker system prune -a更彻底清理(包括所有未使用的镜像)

5. 常见问题及解决办法

🔹 安装类问题

1. Windows 上 Docker Desktop 启动失败,提示 “Hardware assisted virtualization and data execution protection must be enabled”
  • 原因:未开启虚拟化或 Hyper-V 未启用。
  • 解决
    • 进入 BIOS 开启 Intel VT-x 或 AMD-V。
    • 以管理员运行 PowerShell,执行:
      Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
      
    • 重启电脑。
2. WSL2 安装后 Docker 无法启动
  • 原因:WSL2 内核未更新或版本过低。
  • 解决
    • 下载并安装 WSL2 Linux 内核更新包
    • 将 WSL2 设为默认版本:wsl --set-default-version 2
    • 在 Docker Desktop 设置中确保 “Use WSL 2 based engine” 已勾选。
3. Linux 下 docker: permission denied
  • 原因:当前用户不在 docker 用户组。
  • 解决
    sudo usermod -aG docker $USER
    newgrp docker   # 或退出重新登录
    
4. GPU 容器报错 docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
  • 原因:未安装 NVIDIA Container Toolkit。
  • 解决:参考上文 3.2 节安装 toolkit,并重启 docker 服务。

🔹 使用类问题

5. 拉取镜像太慢或超时
  • 原因:默认 Docker Hub 在国外,网络不稳定。
  • 解决:配置国内镜像加速器(阿里云、中科大等)。
    • Windows/Mac:Docker Desktop → Settings → Docker Engine,添加:
      {
        "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
      }
      
    • Linux:编辑 /etc/docker/daemon.json,同上,然后 sudo systemctl restart docker
6. 容器内无法访问宿主机文件
  • 原因:未挂载卷。
  • 解决:运行容器时添加 -v /宿主机路径:/容器路径,例如:
    docker run -v /home/user/data:/data ...
    
7. 容器内无法连接宿主机服务(如数据库)
  • 原因:容器网络隔离,localhost 指向容器自身。
  • 解决
    • Linux 下使用 --network="host" 共享宿主机网络。
    • 或使用特殊 DNS host.docker.internal(Windows/Mac 可用)。
8. 容器退出后数据丢失
  • 原因:容器本身不持久化数据。
  • 解决:使用 -v 挂载宿主机目录,或使用 Docker Volume:
    docker volume create mydata
    docker run -v mydata:/data ...
    
9. 如何进入已停止的容器查看文件?
  • 解决:先启动容器:docker start <容器ID>,再进入:docker exec -it <容器ID> bash。或者直接 docker run -it --rm <镜像> bash 临时启动。
10. 容器内执行 nvidia-smi 报错
  • 原因:未正确传递 GPU 或驱动不匹配。
  • 解决
    • 确保运行命令包含 --gpus all
    • 检查宿主机 nvidia-smi 正常。
    • 确保容器镜像基于 CUDA 基础镜像。

🔹 镜像构建问题

11. COPY failed: file not found
  • 原因:Dockerfile 中的路径相对于构建上下文(docker build 命令最后一个参数指定的路径)。
  • 解决:确保被复制的文件在构建上下文目录内,且路径正确。通常将 Dockerfile 放在项目根目录,用 COPY ./file /dest
12. 构建镜像时 pip install 非常慢
  • 解决:在 Dockerfile 中使用国内 pip 源:
    RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
    
13. 镜像体积太大
  • 解决
    • 使用多阶段构建(multi-stage build)。
    • 清理 apt 缓存:apt-get clean && rm -rf /var/lib/apt/lists/*
    • 使用更小的基础镜像,如 python:3.10-slim 代替 python:3.10

6. 实战项目:三个必练的Docker上手项目

理论学再多,不如动手练。以下三个项目覆盖了 Docker 最核心的使用场景:端口映射、数据持久化、镜像构建。跟着做一遍,你就能真正掌握 Docker。

📦 项目一:Nginx —— 跑一个静态网页,测试端口映射

目标:用 Nginx 容器托管一个自定义的 index.html,并通过端口映射在宿主机访问。

步骤
  1. 创建本地网页文件
    在任意目录下新建 html 文件夹,里面放一个 index.html

    mkdir -p ~/docker_test/nginx/html
    cd ~/docker_test/nginx/html
    echo '<h1>Hello from Docker Nginx!</h1><p>端口映射成功!</p>' > index.html
    
  2. 运行 Nginx 容器并挂载网页文件

    docker run -d --name my-nginx -p 8080:80 -v ~/docker_test/nginx/html:/usr/share/nginx/html nginx:latest
    
    • -d:后台运行
    • --name my-nginx:容器名称
    • -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口
    • -v:挂载本地的 html 目录到 Nginx 的默认站点目录
  3. 验证
    浏览器访问 http://localhost:8080,应该看到你写的网页。

  4. 常用调试命令

    docker ps                 # 查看容器是否运行
    docker logs my-nginx      # 查看日志
    docker exec -it my-nginx bash  # 进入容器内部
    

🗄️ 项目二:MySQL —— 跑数据库,测试数据持久化

目标:运行 MySQL 容器,将数据库文件挂载到宿主机,即使删除容器数据也不丢失。

步骤
  1. 创建本地数据目录

    mkdir -p ~/docker_test/mysql/data
    
  2. 运行 MySQL 容器

    docker run -d --name my-mysql \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -p 3306:3306 \
      -v ~/docker_test/mysql/data:/var/lib/mysql \
      mysql:8.0
    
    • -e MYSQL_ROOT_PASSWORD=123456:设置 root 密码
    • -p 3306:3306:映射端口(注意:如果宿主机已有 MySQL,需改端口,如 -p 3307:3306
    • -v ~/docker_test/mysql/data:/var/lib/mysql:挂载数据目录
  3. 测试数据持久化

    • 进入容器创建测试数据库:
      docker exec -it my-mysql mysql -uroot -p123456
      
      然后执行:
      CREATE DATABASE testdb;
      USE testdb;
      CREATE TABLE t (id INT);
      INSERT INTO t VALUES (1);
      EXIT;
      
    • 停止并删除容器:
      docker stop my-mysql
      docker rm my-mysql
      
    • 用同样的命令重新运行一个新容器(挂载同一个宿主机目录):
      docker run -d --name my-mysql-new \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -p 3306:3306 \
        -v ~/docker_test/mysql/data:/var/lib/mysql \
        mysql:8.0
      
    • 再次进入容器,查看数据库 testdb 和数据表是否还在。如果还在,说明数据持久化成功!
  4. 使用客户端连接
    使用 Navicat、DBeaver 或命令行连接 localhost:3306,用户名 root,密码 123456,验证远程访问。


🏗️ 项目三:自打包项目 —— 构建自己的镜像(Java jar / HTML / Python)

目标:将自己的小项目打包成 Docker 镜像,并运行起来。

选项 A:打包一个静态 HTML 站点(最简单)
  1. 准备文件

    mkdir ~/docker_test/my_site
    cd ~/docker_test/my_site
    echo '<h1>我的第一个 Docker 镜像!</h1>' > index.html
    
  2. 编写 Dockerfile
    创建 Dockerfile 文件,内容:

    FROM nginx:alpine
    COPY index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    
  3. 构建镜像

    docker build -t my-html-site .
    
  4. 运行容器

    docker run -d --name my-site -p 8888:80 my-html-site
    

    浏览器访问 http://localhost:8888,看到页面即成功。

选项 B:打包一个 Java Spring Boot jar 包

假设你有一个可运行的 app.jar

  1. 准备文件

    mkdir ~/docker_test/my_java_app
    cp /path/to/your/app.jar ~/docker_test/my_java_app/
    
  2. 编写 Dockerfile

    FROM openjdk:17-jdk-slim
    WORKDIR /app
    COPY app.jar app.jar
    EXPOSE 8080
    CMD ["java", "-jar", "app.jar"]
    
  3. 构建镜像

    cd ~/docker_test/my_java_app
    docker build -t my-java-app .
    
  4. 运行容器

    docker run -d --name java-app -p 8080:8080 my-java-app
    

    根据你的应用实际端口调整 -p 映射。

选项 C:打包一个 Python Flask 应用
  1. 准备文件
    app.py

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return "Hello from Dockerized Flask!"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    

    requirements.txt

    flask
    
  2. Dockerfile

    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
    COPY app.py .
    EXPOSE 5000
    CMD ["python", "app.py"]
    
  3. 构建并运行

    docker build -t my-flask-app .
    docker run -d --name flask-app -p 5000:5000 my-flask-app
    

    浏览器访问 http://localhost:5000


7. 总结

  • Docker不是可选项,而是AI工程化的必备技能
  • 它解决了环境一致、依赖隔离、GPU配置、可复现、便捷分享等核心痛点。
  • 学习成本不高:掌握核心概念 + 常用命令,就能极大提升开发效率。
  • 建议从官方PyTorch镜像开始,逐步尝试编写自己的Dockerfile。
  • 遇到问题时,先查本文第五部分的常见问题,通常能快速解决
  • 通过三个实战项目,你已经掌握了端口映射、数据持久化和镜像构建,可以独立用 Docker 跑起大多数应用。

📌 一句话:用Docker,让你的AI开发像搭积木一样简单、可靠。

如果你觉得本文有用,欢迎收藏、点赞、转发!后续还会分享更多AI工程化实战技巧。
如果你在学习过程中有遇到问题,欢迎关注私信交流,后续也会分享更多免费的AI学习资料。

更多推荐