AI 工具全卡在 Docker 上?十分钟把地基焊死,后面一马平川

本文基于 Docker Desktop 4.3x(2026年7月最新版)编写。所有命令均经过验证,可直接复制运行。

Docker 是本地 AI 全家桶的地基——Dify、n8n、Open WebUI 全部跑在 Docker 容器里。Docker 装不好,后面的工具一个都跑不起来。

阅读提示:如果你的 Docker Desktop 已经装好且能正常 docker run hello-world,可以直接跳到第四节看数据卷和网络——前面三节是纯安装和配置。

你是不是也卡在这一步

想装 Dify,教程说 docker run——

  • 鲸鱼图标一直转,WSL2 报错看不懂?
  • docker 命令找不到,PATH 没生效?
  • 镜像拉了半小时进度条不动?
  • 好不容易装好了,第二天重启电脑全没了?
  • C 盘突然爆满,发现 Docker 镜像吃了 30GB?

这些问题 90% 的人都遇到过。这篇不讲 Docker 原理,不讲镜像怎么构建。只做一件事:把 Docker 装好、配好、跑通验证、排掉所有常见的坑。

没有 Docker 的世界                           有 Docker 的世界
┌──────────┐                               ┌──────────┐
│  想装 Dify  │                               │  想装 Dify  │
└────┬─────┘                               └────┬─────┘
     │                                          │
     ├─→ 装 Node.js                              ├─→ docker run dify
     ├─→ 装 Python                               │
     ├─→ 装 PostgreSQL                           │
     ├─→ 装 Redis                                │
     ├─→ 配数据库连接                            │
     ├─→ 装依赖包(npm install 失败)             │
     ├─→ 改配置文件                              │
     ├─→ 启动服务(端口冲突)                     │
     └─→ 报错了,不知道哪个组件挂了               │
                                          镜像自动拉取 → 容器自动启动
                                          总耗时:一条命令,等下载完就行

Docker vs 其他部署方式

对比维度Docker直接安装虚拟机Anaconda
安装难度双击 exe各工具不同装系统装 conda
环境隔离容器隔离混在一起完全隔离半隔离
资源占用低(共享内核)最低高(完整 OS)
多工具共存一个容器一个工具容易冲突可以但太重容易冲突
卸载干净度删容器就干净残留注册表删虚拟机残留环境
适合场景AI 全家桶单一工具完整测试环境Python 数据科学

一句话:Docker 在一键安装、环境隔离、多工具共存、卸载干净这几点上做得最省心。后面所有 AI 工具都依赖它。

一、安装——三平台通吃

Windows 安装(90% 的人走这条)

第 1 步:开虚拟化

任务管理器 → 性能 → CPU,看右下角「虚拟化」是否为「已启用」。

如果是「已禁用」,重启进 BIOS:找到 Intel VT-x 或 AMD-V 选项,改成 Enabled,保存重启。

这步不做,Docker 装完也启动不了,报错 WSL2 installation is incomplete

第 2 步:装 WSL2

PowerShell 管理员运行:

wsl --install

装完重启电脑。重启后确认:

wsl --status

看到 Default Version: 2 就对了。如果显示版本 1,执行:

wsl --set-default-version 2

WSL2 是 Docker Desktop 在 Windows 上的运行基础。它让 Docker 容器跑在一个轻量级 Linux 内核里,性能比旧版 Hyper-V 好得多。

第 3 步:装 Docker Desktop

docker.com 下载 Docker Desktop for Windows(约 500MB 的 exe),双击安装。

安装界面有两个勾选框:

  • Use WSL 2 instead of Hyper-V:勾上
  • Add shortcut to desktop:勾上

点 OK,等安装完成,重启电脑。

重启后 Docker Desktop 自动启动,任务栏出现鲸鱼图标。等它变绿(稳定运行),第一次启动可能要 1~2 分钟。

第 4 步:验证
# 查看版本
docker --version
# Docker version 27.x.x

# 运行测试容器
docker run hello-world

看到 Hello from Docker! 就装好了。

# 查看 Docker 系统信息
docker info
# 关注几行:
#  Operating System: Docker Desktop  (运行环境)
#  Total Memory: 15.6 GB             (可用内存)
#  Server Version: 27.x.x            (引擎版本)

macOS 安装

docker.com 下载 Docker Desktop for Mac。

  • Apple Silicon(M1/M2/M3/M4):下 ARM 版本(Apple Silicon)
  • Intel 芯片:下 Intel 版本(Intel Chip)

下载 .dmg 文件,双击打开,把 Docker 拖进 Applications。首次打开输入管理员密码,等 Docker Engine 启动完成。

docker --version
docker run hello-world

macOS 不需要 WSL2,装完直接能用。Apple Silicon 跑 ARM 镜像性能很好,跑 x86 镜像会走 Rosetta 翻译,稍慢但兼容。

Linux 安装

Ubuntu/Debian 一条命令:

curl -fsSL https://get.docker.com | sh

脚本自动检测发行版,装 Docker Engine + Docker CLI + docker compose,注册 systemd 服务。

# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker

# 让当前用户免 sudo 调用 docker
sudo usermod -aG docker $USER
# 重新登录后生效

# 验证
docker --version
docker run hello-world

Linux 不需要 Docker Desktop,直接装 Docker Engine 就行,更轻量、更省内存。

二、装完必须做的 5 件事

1. 配国内镜像加速(不配等于不能用)

Docker 默认从 Docker Hub 拉镜像,国内速度感人——一个 1GB 镜像能拉半小时。配完加速后速度飙到几十 MB/s。

打开 Docker Desktop → Settings → Docker Engine,改成:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ],
  "experimental": false,
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB"
    }
  }
}

点 Apply & Restart。

验证加速是否生效:

docker info | grep -A 5 "Registry Mirrors"
# 输出里能看到你配的加速地址就对了

国内镜像加速地址会变动,如果上面的失效了,搜索「Docker 国内镜像加速 2026」找最新的。

2. 限制 WSL2 内存(防止吃光内存)

Docker Desktop 用 WSL2 跑容器,默认占一半内存。如果你 16G 内存同时跑 Ollama + Docker,Docker 可能吃 8G,Ollama 直接被挤死。

C:\Users\<用户名>\ 下创建文件 .wslconfig

[wsl2]
memory=8GB
swap=2GB
processors=4
参数作用建议值
memoryWSL2 最大可用内存物理内存的 50%
swap交换空间大小2GB
processors分配 CPU 核心数物理核心的 50%

重启 WSL 让配置生效:

wsl --shutdown

再启动 Docker Desktop。内存被限在 8G,不会把 Ollama 挤死。

3. 改 Docker 数据存储位置(防止 C 盘爆满)

Docker 默认把镜像、容器、卷存在 C 盘。装几个 AI 工具后轻松吃 20~50GB。

# 查看 Docker 数据存储位置和磁盘占用
docker system df
# 输出示例:
# TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
# Images          12      8       15.2GB    3.1GB (20%)
# Containers      5       3       1.2GB     0B
# Local Volumes   8       5       2.8GB     1.2GB (42%)

方法一:Docker Desktop 界面修改(推荐)

Settings → Resources → Advanced → Disk image location → 改成 D:\DockerData

点 Apply & Restart,Docker 自动迁移数据。

方法二:mklink 软链接(Docker Desktop 不支持迁移时用)

# 1. 关闭 Docker Desktop
# 2. 找到 Docker 数据目录(WSL2 模式下在 vhdx 虚拟磁盘里)
# 3. 迁移 vhdx 到 D 盘
wsl --shutdown
wsl --export docker-desktop-data D:\docker-data.tar
wsl --unregister docker-desktop-data
wsl --import docker-desktop-data D:\DockerData D:\docker-data.tar

4. 开机自启

Docker Desktop → Settings → General → 勾选 Start Docker Desktop when you log in

不开的话,每次重启电脑 Dify、n8n、Open WebUI 全挂——因为它们跑在 Docker 容器里,Docker 不启动,容器就不启动。

5. 配置容器自动重启策略

每个 docker run 命令加上 --restart always,Docker 启动后容器自动拉起:

# always:Docker 启动后容器自动启动
# unless-stopped:除非手动 stop,否则自动启动
# on-failure:崩溃后自动重启,最多 5 次

docker run -d --name n8n --restart always ...
重启策略行为适合场景
alwaysDocker 启动 → 容器启动生产环境
unless-stopped手动 stop 后不再自动启动开发环境
on-failure:5崩溃后重启,最多 5 次有状态服务
no(默认)不自动重启临时容器

三、Docker 核心概念(5 分钟懂)

三个核心概念

概念是什么类比常用命令
镜像 (Image)只读模板,包含运行环境和程序安装包docker pull / docker images
容器 (Container)镜像运行起来的实例装好的 App 运行中docker run / docker ps / docker stop
卷 (Volume)持久化存储,容器删了数据还在App 的数据文件夹docker volume create / docker volume ls

你只需要记住一条:装工具时 -v 参数必须加,不加容器删了数据全丢。

镜像 vs 容器 vs 卷的生命周期

镜像 (Image)           容器 (Container)           卷 (Volume)
┌──────────┐          ┌──────────┐              ┌──────────┐
│ 只读模板  │  docker  │  运行中   │  docker rm   │ 持久数据  │
│ 不可变    │  run     │  可变    │  ──→ 容器删除 │  容器删了  │
│          │ ──→     │          │              │  数据还在  │
└──────────┘          └──────────┘              └──────────┘
     ↑                     ↑                        ↑
  docker pull          docker stop              docker volume rm
  下载镜像              停止不删除                手动才删除

四、Docker 常用命令速查

镜像管理

# 搜索镜像
docker search dify

# 拉取镜像
docker pull docker.1ms.run/langgenius/dify:latest

# 查看本地镜像
docker images
# REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
# dify          latest    a1b2c3d4e5f6    2 days ago    1.2GB

# 删除镜像(必须先删除依赖它的容器)
docker rmi dify:latest

# 清理无用镜像(悬空的中间层镜像)
docker image prune

# 查看镜像层细节
docker history dify:latest

容器管理

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 启动/停止/重启容器
docker start n8n
docker stop n8n
docker restart n8n

# 删除容器(先停止再删除)
docker rm n8n

# 强制删除运行中的容器
docker rm -f n8n

# 查看容器日志
docker logs n8n              # 全部日志
docker logs -f n8n           # 实时跟踪日志
docker logs --tail 50 n8n   # 最后 50 行

# 进入容器内部
docker exec -it n8n bash
docker exec -it n8n sh      # 没有 bash 的用 sh

# 查看容器资源占用
docker stats
# CONTAINER   CPU%   MEM USAGE / LIMIT   MEM%   NET I/O
# n8n         2.3%   256MiB / 8GiB       3.2%   12MB/8MB

卷管理

# 查看所有卷
docker volume ls

# 创建卷
docker volume create n8n_data

# 查看卷详情
docker volume inspect n8n_data
# Mountpoint: /var/lib/docker/volumes/n8n_data/_data

# 删除卷(容器在使用时不能删)
docker volume rm n8n_data

# 清理无用卷
docker volume prune

命令速查表

命令作用示例
docker pull拉取镜像docker pull n8n
docker images查看本地镜像docker images
docker rmi删除镜像docker rmi n8n:latest
docker run创建并启动容器docker run -d --name n8n n8n
docker ps查看运行中容器docker ps -a
docker start/stop/restart启停容器docker stop n8n
docker rm删除容器docker rm n8n
docker logs查看日志docker logs -f n8n
docker exec进入容器docker exec -it n8n bash
docker stats资源监控docker stats
docker volume ls查看卷docker volume ls
docker volume create创建卷docker volume create data
docker volume rm删除卷docker volume rm data
docker system df磁盘占用docker system df
docker system prune清理无用资源docker system prune -a

五、docker run 参数详解——AI 工具通用模板

后面每篇教程都会用 docker run,先把这个命令彻底搞懂:

docker run -d \
  --name dify \
  --restart always \
  -p 8015:8015 \
  -v dify_data:/app/data \
  -e DEBUG=false \
  --add-host=host.docker.internal:host-gateway \
  --gpus all \
  --memory=4g \
  --cpus=2 \
  dify:latest
参数作用说明
-d后台运行不加的话当前终端被占住
--name容器名方便后续 stop/logs/exec
--restart重启策略always = Docker 启动后自动启动
-p端口映射宿主机端口:容器端口
-v数据卷挂载必须加,容器删了数据还在
-e环境变量传配置参数给容器内程序
--add-host添加 hostsDocker 访问宿主机 Ollama 必须加
--gpusGPU 支持all = 使用所有 GPU
--memory内存限制防止容器吃光内存
--cpusCPU 限制限制容器可用核心数

端口映射详解

# 宿主机 8015 → 容器 8015(Dify 默认端口)
-p 8015:8015

# 宿主机 3000 → 容器 8080(Open WebUI)
-p 3000:8080

# 端口被占用?换一个
-p 3001:8080

# 只监听本机,不暴露到局域网
-p 127.0.0.1:8015:8015

# 查看端口占用
netstat -ano | findstr :8015

数据卷挂载详解

# 方式一:命名卷(推荐,Docker 管理)
-v dify_data:/app/data

# 方式二:绑定挂载(指定宿主机路径)
-v D:/dify_data:/app/data

# 方式三:只读挂载(配置文件)
-v D:/dify_config.yaml:/app/config.yaml:ro

# 查看卷数据位置
docker volume inspect dify_data

六、Docker Compose——多容器编排

Dify 这种工具需要多个容器配合(应用 + 数据库 + Redis)。一个个 docker run 管不过来,用 Docker Compose 一键管理。

安装 Docker Compose

Docker Desktop 自带 Compose,无需额外安装。验证:

docker compose version
# Docker Compose version v2.x.x

Linux 单独安装:

# Docker Compose V2 已内置到 Docker CLI
sudo apt install docker-compose-plugin

编写 docker-compose.yml

以 n8n 为例:

version: "3.8"

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    container_name: n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_SECURE_COOKIE=false
      - N8N_HOST=0.0.0.0
      - N8N_PORT=5678
      - WEBHOOK_URL=http://localhost:5678/
      - GENERIC_TIMEZONE=Asia/Shanghai
    volumes:
      - n8n_data:/home/node/.n8n
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  n8n_data:

Compose 常用命令

# 在 docker-compose.yml 所在目录执行

# 启动所有服务(后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f n8n

# 停止所有服务
docker compose stop

# 停止并删除容器(卷数据保留)
docker compose down

# 停止并删除容器和卷(数据全删)
docker compose down -v

# 重新构建并启动(修改了配置后)
docker compose up -d --build
命令作用
docker compose up -d启动所有服务
docker compose down停止并删除容器
docker compose down -v停止并删除容器和卷
docker compose logs -f实时查看日志
docker compose restart重启所有服务
docker compose ps查看服务状态
docker compose pull拉取最新镜像

用 Compose 管理多容器比手动 docker run 稳得多——配置写在 yml 里,版本可控,迁移时拷走一个文件就行。

七、GPU 配置——让容器里的 AI 用上显卡

如果你要在 Docker 容器里跑 GPU 推理(比如容器内跑 Ollama 或 vLLM),需要额外配置。

Windows + Docker Desktop

Docker Desktop 4.x+ 已内置 NVIDIA GPU 支持。验证:

# 在容器内测试 GPU 是否可用
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

如果输出显卡信息表格,说明 GPU 可用。如果报错,检查:

  1. 显卡驱动是否最新(去 NVIDIA 官网下载)
  2. Docker Desktop 版本是否 >= 4.4
  3. Docker Desktop → Settings → Resources → 确认 GPU 选项已勾选

Linux GPU 配置

# 安装 NVIDIA Container Toolkit
distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt update
sudo apt install -y nvidia-container-toolkit

# 配置 Docker 使用 NVIDIA runtime
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

验证:

docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi

GPU 指定

# 使用所有 GPU
--gpus all

# 只用第一块 GPU
--gpus '"device=0"'

# 用两块指定 GPU
--gpus '"device=0,1"'

# 限制 GPU 显存(通过环境变量,部分镜像支持)
-e NVIDIA_VISIBLE_DEVICES=0

八、网络配置——容器访问宿主机和其他容器

容器访问宿主机(访问 Ollama)

容器内 localhost 指向容器自己,不是你的电脑。要访问宿主机的 Ollama:

# 必须加这个参数
--add-host=host.docker.internal:host-gateway

# 然后容器内用这个地址访问宿主机
http://host.docker.internal:11434
访问目标容器内地址说明
宿主机host.docker.internal需要 --add-host 参数
其他容器(同一网络)容器名http://dify:8015
外网直接用域名/IP默认可访问

创建 Docker 网络

多个容器互相访问时,创建一个网络:

# 创建网络
docker network create ai-network

# 容器加入网络
docker run -d --name dify --network ai-network dify:latest
docker run -d --name n8n --network ai-network n8n:latest

# 网络内容器互相访问
# n8n 访问 dify:http://dify:8015
# dify 访问 n8n:http://n8n:5678

网络管理命令

# 查看所有网络
docker network ls

# 查看网络详情(包含哪些容器)
docker network inspect ai-network

# 删除网络
docker network rm ai-network

# 清理无用网络
docker network prune

九、系统清理与维护

查看磁盘占用

# 查看 Docker 总磁盘占用
docker system df
# TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
# Images          12      8       15.2GB    3.1GB (20%)
# Containers      5       3       1.2GB     0B
# Local Volumes   8       5       2.8GB     1.2GB (42%)

# 查看每个镜像/容器/卷的详细大小
docker system df -v

清理命令

# 清理已停止的容器
docker container prune

# 清理悬空镜像(无标签的中间层)
docker image prune

# 清理无用卷
docker volume prune

# 清理无用网络
docker network prune

# 一键清理所有无用资源(停止的容器 + 悬空镜像 + 无用卷 + 无用网络)
docker system prune

# 彻底清理(包括未被引用的镜像)
docker system prune -a

docker system prune -a 会删除所有不在运行中容器使用的镜像。确认没用的镜像再清,不然下次启动又要重新拉。

定期维护建议

# 每月执行一次:查看占用
docker system df

# 占用超过 30GB 时执行:清理无用资源
docker system prune -a

# 清理构建缓存(占用可能很大)
docker builder prune -a

十、Dockerfile——构建自己的镜像

当你需要在基础镜像上加东西(比如给 Dify 加自定义插件),写 Dockerfile:

# 基于 n8n 官方镜像
FROM docker.n8n.io/n8nio/n8n:latest

# 切换到 root 用户
USER root

# 安装额外依赖
RUN apk add --no-cache python3 py3-pip

# 安装 Python 包
RUN pip3 install requests beautifulsoup4 --break-system-packages

# 切换回 node 用户
USER node

# 保持原有入口
ENTRYPOINT ["tini", "--"]
CMD ["n8n"]

构建并运行:

# 构建镜像(注意末尾的点表示当前目录)
docker build -t n8n-custom:latest .

# 运行自定义镜像
docker run -d --name n8n --restart always \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  n8n-custom:latest

Dockerfile 常用指令

指令作用示例
FROM基础镜像FROM python:3.12-slim
RUN构建时执行命令RUN pip install flask
COPY复制文件到镜像COPY app.py /app/
WORKDIR设置工作目录WORKDIR /app
ENV设置环境变量ENV PORT=8080
EXPOSE声明端口EXPOSE 8080
USER切换用户USER root
ENTRYPOINT启动命令ENTRYPOINT ["python"]
CMD默认参数CMD ["app.py"]

十一、常见问题与排坑

问题原因解决
鲸鱼图标一直转圈WSL2 未装或版本不对wsl --install → 重启 → wsl --set-default-version 2
docker 命令找不到PATH 未生效关终端重开,或重启电脑
拉镜像超时/报错Docker Hub 国内被墙配国内镜像加速(见第二节)
port is already allocated端口被占用netstat -ano | findstr :端口,换端口 -p 3001:8080
磁盘空间不足镜像和容器吃满 C 盘改存储位置到 D 盘 + docker system prune -a
WSL2 占内存过大默认不限制.wslconfig 限制内存(见第二节)
容器启动后立刻退出程序报错docker logs 容器名 看报错日志
容器内访问不到 Ollamalocalhost 指向容器自身--add-host=host.docker.internal:host-gateway,地址改用 host.docker.internal
重启电脑后容器没启动没设重启策略docker run--restart always
容器内 GPU 不可用NVIDIA 驱动或 Toolkit 问题更新驱动 + 检查 --gpus all 参数
Docker Desktop 启动报错WSL2 版本太旧wsl --update 更新 WSL2
镜像拉到一半失败网络中断docker pull 会断点续传,重新执行即可

几个容易踩的坑:

  1. WSL2 没装就装 Docker——Docker Desktop 依赖 WSL2,不装会报错。wsl --install 装完重启再装 Docker。
  2. -v 参数忘了加——容器删了数据全丢。养成习惯:每个 docker run 都加 -v
  3. 端口冲突不知道——docker runport is already allocated,用 netstat -ano | findstr :端口 查谁占了,换一个端口。
  4. 镜像全存 C 盘——几个 AI 工具镜像加起来 20GB+。装完第一件事:改存储位置到 D 盘。
  5. 不配镜像加速——国内拉 Docker Hub 镜像极慢。必须配加速地址。

十二、落地场景

场景需要的容器建议配置
个人 AI 助手Ollama + Open WebUI16G 内存 + RTX 3060
知识库客服Ollama + Dify32G 内存 + RTX 4060
自动化工作流Ollama + n8n16G 内存,CPU 够用
完整 AI 工作站Ollama + Dify + n8n + Open WebUI + Cline32G 内存 + RTX 4070
低配尝鲜Ollama(Docker 模式)8G 内存,纯 CPU

什么情况不该用 Docker

  • 只是想跑一下 Ollama 聊天——直接 ollama run 就行,不需要 Docker。Docker 是给多组件应用(Dify、n8n、Open WebUI)准备的。
  • 电脑只有 8G 内存——Docker Desktop 本身吃 2G+,加上容器内的服务会很吃力。这种情况只跑 Ollama 本体更实际。
  • 生产环境部署——Docker Desktop 是开发工具,生产环境用 Docker CE/EE + Compose 或 Kubernetes。

核心知识点回顾

  1. 安装:Windows 装 WSL2 → 装 Docker Desktop → 验证 docker run hello-world
  2. 必做 5 件事:配镜像加速、限 WSL2 内存、改存储位置、开机自启、配容器重启策略
  3. 三个概念:镜像(安装包)→ 容器(运行中)→ 卷(持久数据),-v 参数必须加
  4. docker run 参数-d 后台、-p 端口、-v 数据卷、-e 环境变量、--restart 重启策略、--add-host 宿主机访问
  5. Docker Compose:多容器编排,配置写 yml,docker compose up -d 一键启动
  6. GPU 配置--gpus all 参数 + NVIDIA 驱动 + Container Toolkit
  7. 网络:容器访问宿主机用 host.docker.internal,多容器通信用 Docker 网络
  8. 清理维护docker system df 查占用,docker system prune -a 清无用资源

本文所有命令均经过验证,可直接复制执行。如有问题欢迎评论区交流。

觉得有用点个赞,下一篇讲 Ollama——Docker 装好之后,第一个该装的大模型运行框架。

更多推荐