检索增强生成RAG项目tools_01:Docker 极简实战

一份写给「只做开发、不做运维」的 AI 工程师的 Docker 学习笔记!

一、为什么大模型工程师需要 Docker?

1.1 痛点场景

python 复制代码
"""
传统方式:
- 新同事入职:花 1 天装 Milvus + Redis + MySQL
- 换电脑:重新装所有软件,各种版本冲突
- 跑别人的项目:Python 版本不对、依赖冲突、数据库连不上

用 Docker 后:
- 一行命令:docker compose up -d
- 5 分钟环境就绪,换电脑拷个文件夹就行
- 环境隔离,互不影响
"""

总之就是一个字:好!!!

1.2 大模型开发常用 Docker 场景

场景 不用 Docker 用 Docker
本地跑 RAG 手动装 Milvus、Redis、MySQL docker compose up -d
测试不同版本 卸载重装,容易出问题 改一行镜像版本号,重启
部署到服务器 在服务器上重复安装过程 拷文件夹,一行命令
团队协作 "我电脑上能跑啊" 环境一致,不存在"本地能跑"

二、可能遇到的 Docker 网络问题及解决方案

2.1 问题现象

python 复制代码
"""
docker compose up -d
# 报错:failed to resolve reference "docker.io/library/mysql:8.0"
# 原因:dial tcp 96.44.137.28:443: connectex: A connection attempt failed
"""

2.2 问题原因

Docker 拉取镜像时需要访问 Docker Hub(registry-1.docker.io),但国内网络访问不稳定,即使(●'◡'●)上网了,Docker Desktop 也不会自动使用系统代理。

2.3 解决方案(按推荐顺序)

方案一:配置 Docker Desktop 代理(推荐)
  1. 打开 Docker Desktop → Settings → Resources → Proxies

  2. 填写代理地址(以 (●'◡'●)为例,端口 7897):

    python 复制代码
    """
    HTTP Proxy:  127.0.0.1:7897
    HTTPS Proxy: 127.0.0.1:7897
    """
  3. 点击 Apply & Restart

方案二:配置镜像加速器

Docker Desktop → Settings → Docker Engine,添加:

python 复制代码
"""
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}
"""
方案三:终端临时设置
python 复制代码
"""
$env:HTTP_PROXY="http://127.0.0.1:7897"
$env:HTTPS_PROXY="http://127.0.0.1:7897"
docker compose up -d
"""

总结一下:条条大路通ROMA,总有一条适合你,黑猫白猫,抓住耗子就是好猫!!!

2.4 关键:(●'◡'●) 需要开启「允许局域网连接」

在 (●'◡'●) 设置中,必须打开 「局域网连接」 开关,否则 WSL2/Docker 无法通过代理。


三、大模型工程师必会的 Docker 命令(共 8 个)

3.1 容器操作(4 个)

python 复制代码
"""
# 1. 查看运行中的容器
docker ps

# 2. 查看所有容器(含停止的)
docker ps -a

# 3. 查看容器日志(排错神器)
docker logs -f 容器名           # 实时查看
docker logs --tail 100 容器名   # 查看最近100行

# 4. 进入容器内部(调试用)
docker exec -it 容器名 bash
# 退出:exit
"""

3.2 Docker Compose(4 个)

python 复制代码
"""
# 1. 启动所有服务(最常用)
docker compose up -d

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

# 3. 重启单个服务
docker compose restart 服务名

# 4. 查看 compose 项目状态
docker compose ps
"""

3.3 磁盘管理(2 个)

python 复制代码
"""
# 查看磁盘占用
docker system df

# 清理无用资源(每月做一次)
docker system prune -a
"""

3.4 命令速查卡

python 复制代码
"""
# === 日常操作 ===
docker compose up -d              # 启动
docker compose down               # 停止(不删数据)
docker compose restart mysql      # 重启单个
docker compose ps                 # 看状态
docker compose logs -f            # 看所有日志

docker compose logs -f --tail 100
# 效果:mysql 显示100行,app 显示100行,redis 显示100行...
# 每个服务各自100行,不是总共100行

# 只看 milvus-mysql 这个服务的最后100行
docker compose logs -f --tail 100 milvus-mysql


# === 调试 ===
docker ps                         # 看运行中的容器
docker logs -f milvus-standalone  # 看 Milvus 日志
docker exec -it milvus-redis bash # 进 Redis 容器

# === 清理 ===
docker system prune -a            # 清理无用资源
docker system df                  # 看磁盘占用
"""

四、docker-compose.yml 核心配置解读

4.1 一个完整的大模型开发环境配置

python 复制代码
# Docker Compose 文件版本号,3.5 是较新且稳定的版本
version: '3.5'

# 定义所有要运行的服务(容器)
services:
  # ========== Milvus 依赖:etcd(分布式键值存储) ==========
  # Milvus 用 etcd 来存储元数据,比如集合的 schema 信息
  etcd:
    # 容器名称,方便用 docker ps 识别
    container_name: milvus-etcd
    # 使用的镜像:etcd v3.5.5,来自 quay.io 镜像仓库
    image: quay.io/coreos/etcd:v3.5.5
    # 环境变量,配置 etcd 的运行参数
    environment:
      # 压缩模式:按版本号压缩,防止数据无限增长
      - ETCD_AUTO_COMPACTION_MODE=revision
      # 保留最近 1000 个版本,旧数据会被压缩清理
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      # 后端存储的配额限制,4GB(超过会报错,防止磁盘爆满)
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      # 启用 v2 API 兼容性,Milvus 需要这个
      - ETCD_ENABLE_V2=true
    # 数据卷挂载:将容器内的数据目录映射到宿主机,实现数据持久化
    # 宿主机路径:./volumes/etcd,容器内路径:/etcd/data
    volumes:
      - ./volumes/etcd:/etcd/data
    # 启动命令:配置 etcd 的监听地址和数据目录
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd/data

  # ========== Milvus 依赖:MinIO(对象存储) ==========
  # Milvus 用 MinIO 来存储向量数据和日志文件
  minio:
    container_name: milvus-minio
    # MinIO 镜像,2023年3月20日的稳定版本
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    # 环境变量:MinIO 的访问密钥(相当于用户名和密码)
    environment:
      # 访问密钥 ID(用户名)
      MINIO_ACCESS_KEY: minioadmin
      # 秘密访问密钥(密码)
      MINIO_SECRET_KEY: minioadmin
    # 数据卷挂载:持久化 MinIO 存储的数据
    volumes:
      - ./volumes/minio:/minio/data
    # 启动命令:启动 MinIO 服务器,数据目录为 /minio/data
    command: minio server /minio/data
    # 健康检查:定期检查 MinIO 是否正常运行
    healthcheck:
      # 检查命令:用 curl 请求 MinIO 的健康检查接口
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      # 每 30 秒检查一次
      interval: 30s
      # 超时时间 20 秒
      timeout: 20s
      # 连续失败 3 次才判定为不健康
      retries: 3

  # ========== Milvus 主服务(向量数据库) ==========
  standalone:
    container_name: milvus-standalone
    # Milvus 官方镜像 v2.4.4(最新稳定版)
    image: milvusdb/milvus:v2.4.4
    # 启动命令:以 standalone(单机)模式运行 Milvus
    command: ["milvus", "run", "standalone"]
    # 环境变量:配置 Milvus 如何连接依赖服务
    environment:
      # etcd 的访问地址(服务名:端口,Docker 内部 DNS 会自动解析)
      - ETCD_ENDPOINTS=etcd:2379
      # MinIO 的访问地址
      - MINIO_ADDRESS=minio:9000
    # 数据卷挂载:持久化 Milvus 的数据(向量索引等)
    volumes:
      - ./volumes/milvus:/var/lib/milvus
    # 端口映射:将容器内的端口映射到宿主机
    ports:
      # 宿主机端口:容器内端口
      # gRPC 端口,Python 代码连接 Milvus 用的就是这个端口
      - "19530:19530"
      # RESTful API 端口,HTTP 方式调用 Milvus
      - "9091:9091"
    # 依赖关系:确保 etcd 和 minio 先启动
    depends_on:
      - "etcd"
      - "minio"

  # ========== Redis(键值缓存数据库) ==========
  # 你的 RAG 项目可能用 Redis 做缓存或会话存储
  redis:
    container_name: milvus-redis
    # Redis 最新稳定版镜像
    image: redis:latest
    # 自动重启:容器异常退出后自动重启
    restart: always
    # 端口映射:将 Redis 的 6379 端口暴露到宿主机
    ports:
      - "6379:6379"
    # 数据卷挂载:持久化 Redis 数据
    volumes:
      - ./volumes/redis:/data
    # 启动命令:设置 Redis 密码为 1234(你的 Python 代码连接时需要这个密码)
    command: redis-server --requirepass 1234

  # ========== MySQL(关系型数据库) ==========
  # 你的 RAG 项目可能用 MySQL 存储问答记录或业务数据
  mysql:
    container_name: milvus-mysql
    # MySQL 8.0 官方镜像
    image: mysql:8.0
    # 自动重启
    restart: always
    # 端口映射:宿主机 33060 → 容器内 3306
    # 用 33060 是因为你的 Windows 可能已经装了 MySQL 占用了 3306
    ports:
      - "33060:3306"
    # 环境变量:初始化 MySQL 的账户和数据库
    environment:
      # root 用户密码
      MYSQL_ROOT_PASSWORD: 123456
      # 自动创建的数据库名(你的代码可以连这个库)
      MYSQL_DATABASE: default_db
      # 额外创建一个普通用户(可选,安全考虑)
      MYSQL_USER: milvus_user
      # 普通用户的密码
      MYSQL_PASSWORD: milvus_pass
    # 数据卷挂载:持久化 MySQL 数据
    volumes:
      - ./volumes/mysql:/var/lib/mysql
    # MySQL 启动参数
    command:
      # 使用传统密码认证方式(兼容老版本客户端)
      - --default-authentication-plugin=mysql_native_password
      # 字符集设置为 utf8mb4(支持 emoji 和中文)
      - --character-set-server=utf8mb4
      # 排序规则
      - --collation-server=utf8mb4_unicode_ci

# ========== 网络配置 ==========
# 定义所有服务共享的网络,让它们可以通过服务名互相访问
networks:
  default:
    # 网络名称,方便识别
    name: milvus-network

4.2 关键配置解释

配置项 含义 开发环境建议
ports: "33060:3306" 宿主机端口:容器内端口 用 33060 避免docker与本地mysql冲突
volumes: ./volumes/xxx 数据持久化到本地文件夹 方便备份和查看
depends_on 依赖服务,按顺序启动 确保数据库先于应用启动
command: 覆盖容器默认启动命令 Redis 设置密码
environment: 设置容器内环境变量 MySQL 初始化密码

五、数据卷:开发环境 vs 生产环境

5.1 开发环境(你现在用的)

python 复制代码
volumes:
  - ./volumes/mysql:/var/lib/mysql   # 相对路径
  • 数据在项目目录下,一目了然

  • 删除项目时可选择保留或删除数据

  • 备份直接复制 ./volumes 文件夹

5.2 生产环境(服务器上用)

python 复制代码
volumes:
  - /data/docker/mysql/data:/var/lib/mysql   # 绝对路径
  • 数据在服务器指定目录

  • 配合云盘、RAID 等保障数据安全

  • 需要定期备份到异地

5.3 数据卷类型对比

类型 写法 数据位置 适用场景
Bind Mount ./volumes:/data 你指定的项目目录 开发环境 ✅
Named Volume mysql-data:/var/lib/mysql Docker 管理 生产环境
Anonymous Volume 不写 Docker 随机生成 临时数据

5.4 关键理解

volumes 是数据盘,不是程序盘

  • 删除 volumes → 数据丢失,但容器和镜像还在

  • 删除容器 → 程序没了,但 volumes 数据还在

  • docker compose down -v → 连数据一起删,慎用!


六、大模型工程师对 Docker 的熟练度要求

6.1 必须掌握(日常 90% 场景)

  • ✅ 能用 docker compose up -d 启动一套环境

  • ✅ 能用 docker compose ps 查看状态

  • ✅ 能用 docker compose logs 查看日志排错

  • ✅ 能用 docker exec -it 进入容器调试

  • ✅ 能看懂 docker-compose.yml 并修改端口、密码

6.2 需要了解(每月 1-2 次)

  • 📖 docker system prune -a 清理磁盘

  • 📖 docker compose down -v 知道会删数据

  • 📖 数据卷备份:直接复制 ./volumes 文件夹

6.3 不需要学(交给运维)

  • ❌ Dockerfile 语法(用官方镜像就够了)

  • ❌ K8s / Docker Swarm(大模型开发用不上)

  • ❌ 网络模式详解(compose 自动处理)

  • ❌ 镜像仓库搭建

6.4 一句话总结

会 docker compose up、down、logs、ps、exec 这 5 个命令,就能应对 95% 的开发场景。


七、踩坑总结

问题回顾

python 复制代码
docker compose up -d
# Error: failed to resolve reference... TLS connect to 127.0.0.1:7897: EOF

解决过程

  1. 发现是网络问题 → Docker 拉不到镜像

  2. 配置 Docker Desktop 代理(127.0.0.1:7897)

  3. 发现报错变成 TLS connect...EOF

  4. 检查 (●'◡'●) 设置 → 开启「允许局域网连接」

  5. 再次运行 → 镜像开始拉取 ✅

经验教训

问题 原因 解决
拉取镜像超时 国内网络访问 Docker Hub 慢 配置代理或镜像加速器
代理不生效 Docker 不走系统代理 Docker Desktop 里单独配置
TLS EOF 错误 代理软件没开局域网连接 开启「允许局域网连接」

八、日常操作速查表

启动工作流

python 复制代码
# 1. 进入项目目录
cd EDURag

# 2. 启动所有服务
docker compose up -d

# 3. 等待 10 秒,确认都起来了
docker compose ps

# 4. 跑代码
python app.py

# 5. 用完关掉
docker compose down

排错工作流

python 复制代码
# 1. 看容器状态
docker compose ps

# 2. 看日志 跟踪模式
docker compose logs -f

# 3. 看具体某个服务的日志
docker logs --tail 50 milvus-standalone

# 4. 进入容器手动测试
docker exec -it milvus-redis redis-cli -a 1234 PING

# 5. 如果还不行,重启试试
docker compose restart mysql

清理工作流

python 复制代码
# 查看磁盘占用
docker system df

# 清理(每月一次)
docker system prune -a

# 完全清理(连数据都删,慎用!)
docker compose down -v

九、一句话箴言

Docker 就是把复杂的环境配置,简化成一行 docker compose up -d

大模型工程师不需要成为 Docker 专家,只需要会用这 8 个命令,就能搞定 90% 的环境问题。

剩下的时间,留给模型、算法和业务逻辑。


附录:常用镜像及端口

服务 镜像 默认端口 开发环境建议端口
Milvus milvusdb/milvus:v2.4.4 19530 19530
Redis redis:latest 6379 6379
MySQL mysql:8.0 3306 33060(避免冲突)
Etcd quay.io/coreos/etcd:v3.5.5 2379 2379
MinIO minio/minio:RELEASE.2023-03-20 9000 9000

本文是实战笔记,记录了从零开始用 Docker 部署 RAG 环境的完整过程。

希望对其他大模型开发工程师有帮助!

你的下一步:跑通完整的 RAG 项目,把 Ollama + Redis + MySQL + Milvus 全部串联起来!🚀

相关推荐
七牛云行业应用1 天前
Hermes Agent总报错?别砸电脑,这10个天坑教你5分钟填平
agent
邦爷的AI架构笔记1 天前
踩坑3天后,我把公司的AI接口全换成了多模型路由——GPT-6和Claude Opus 4.7同时上线的这周
人工智能·后端
威迪斯特1 天前
项目解决方案:某连锁餐饮集团AI后厨与运营安全建设解决方案
人工智能·安全·项目解决方案·ai实时分析·智能餐饮管理·ai视频识别·智能视频分析硬件
zhangzeyuaaa1 天前
从Windows到Linux:Shell脚本“无法执行:找不到需要的文件”问题深度解析与根治方案
linux·运维·windows
大卡片1 天前
进程间通信
linux·运维·服务器
上海锝秉工控1 天前
总线编码器:工业自动化的“智慧神经”
大数据·人工智能·自动化
王同学的AI学习日记1 天前
替你筛完70个Skills!手把手教你调教Hermes Agent!
agent
海海不掉头发1 天前
小白入门大模型强化学习博客
人工智能
信创DevOps先锋1 天前
2025项目管理工具生态革命:AI重构协作边界与国产化崛起
人工智能·重构
张小姐的猫1 天前
【Linux】进程信号(上)—— 信号产生 | 保存信号
linux·运维·服务器