当前位置: 首页 > news >正文

Docker 极简实战:大模型开发工程师的必备指南

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

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

1.1 痛点场景

""" 传统方式: - 新同事入职:花 1 天装 Milvus + Redis + MySQL - 换电脑:重新装所有软件,各种版本冲突 - 跑别人的项目:Python 版本不对、依赖冲突、数据库连不上 用 Docker 后: - 一行命令:docker compose up -d - 5 分钟环境就绪,换电脑拷个文件夹就行 - 环境隔离,互不影响 """

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

1.2 大模型开发常用 Docker 场景

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

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

2.1 问题现象

""" 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):

    """ HTTP Proxy: 127.0.0.1:7897 HTTPS Proxy: 127.0.0.1:7897 """
  3. 点击 Apply & Restart

方案二:配置镜像加速器

Docker Desktop → Settings → Docker Engine,添加:

""" { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } """
方案三:终端临时设置
""" $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 个)

""" # 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 个)

""" # 1. 启动所有服务(最常用) docker compose up -d # 2. 停止并删除容器(保留数据) docker compose down # 3. 重启单个服务 docker compose restart 服务名 # 4. 查看 compose 项目状态 docker compose ps """

3.3 磁盘管理(2 个)

""" # 查看磁盘占用 docker system df # 清理无用资源(每月做一次) docker system prune -a """

3.4 命令速查卡

""" # === 日常操作 === 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 一个完整的大模型开发环境配置

# 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 开发环境(你现在用的)

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

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

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

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

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

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

  • 需要定期备份到异地

5.3 数据卷类型对比

类型写法数据位置适用场景
Bind Mount./volumes:/data你指定的项目目录开发环境 ✅
Named Volumemysql-data:/var/lib/mysqlDocker 管理生产环境
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 updownlogspsexec这 5 个命令,就能应对 95% 的开发场景。


七、踩坑总结

问题回顾

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 错误代理软件没开局域网连接开启「允许局域网连接」

八、日常操作速查表

启动工作流

# 1. 进入项目目录 cd EDURag # 2. 启动所有服务 docker compose up -d # 3. 等待 10 秒,确认都起来了 docker compose ps # 4. 跑代码 python app.py # 5. 用完关掉 docker compose down

排错工作流

# 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

清理工作流

# 查看磁盘占用 docker system df # 清理(每月一次) docker system prune -a # 完全清理(连数据都删,慎用!) docker compose down -v

九、一句话箴言

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

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

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


附录:常用镜像及端口

服务镜像默认端口开发环境建议端口
Milvusmilvusdb/milvus:v2.4.41953019530
Redisredis:latest63796379
MySQLmysql:8.0330633060(避免冲突)
Etcdquay.io/coreos/etcd:v3.5.523792379
MinIOminio/minio:RELEASE.2023-03-2090009000

本文是实战笔记,记录了从零开始用 Docker 部署 RAG 环境的完整过程。
希望对其他大模型开发工程师有帮助!

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

http://www.cnnetsun.cn/news/1853541.html

相关文章:

  • LLM API工单打标:5大主流方式与核心争议
  • k3s 实战指南 - 利用 Traefik 实现高效微服务部署
  • 3步掌握猫抓资源嗅探:从网页视频到本地文件的完整下载方案
  • iPhone免电脑安装IPA?App-Installer让你随时随地安装第三方应用
  • 把 Agent 接入真实系统前必须做的 12 项风控:权限、审计、隔离、限流
  • openclaw平替之nanobot源码解析(七):Gateway与多渠道集成势
  • XGBoost调参新姿势:Bayesian优化实战指南(附完整代码)
  • 保姆级教程:用PyTorch从零搭建SegFormer语义分割模型(附B0主干网络数据流图解)
  • 【2026年最新600套毕设项目分享】微信小程序的电子竞技信息交流平台(30038)
  • 【紧急通告】大模型成本超支预警阈值失效!——基于27家AIGC企业的成本漂移曲线建模与动态熔断机制
  • Agent Client Protocol 全景解析忌
  • mysql如何选择合适的索引类型_mysql索引设计实战
  • CiteSpace 6.3.R1 从零到一:基于CNKI数据的科研图谱实战指南
  • Unity 2022 Profiler里那个‘Sempaphore.WaitForSignal’高亮是卡了吗?手把手教你排查主线程‘假死’
  • YOLO-Master 与 YOLO 开始己
  • Web Scraper插件实战:从乱序爬取到精准数据抓取的五大技巧
  • cv_unet_image-colorization跨平台部署:Windows与Linux性能对比
  • STK9自定义地面设施数据库实战:从零构建到批量插入
  • GoCodingInMyWay肆
  • ROS 2 Composition简明教程
  • 使用Alpine配置WSL ssh门户燎
  • 佳能最新清零软件ServiceTool_v6.200 ,TS3380,G1800,G2810,G3810,G4810,MG3680,IX6700,代码5B00,P07,E08,1700,5b04,有效
  • 跨越系统鸿沟:Nigate如何为Mac用户搭建NTFS数字桥梁
  • 猫抓Cat-Catch完整指南:免费浏览器扩展轻松捕获网页视频资源
  • 从数据到你手机:一张图看懂WiFi芯片是怎么‘跑完’整个通信流程的
  • 中国具身模型狂揽全球第一!机器人的人类数据时代来了
  • 为什么92%的AI平台租户隔离形同虚设?2026奇点大会首席架构师亲授内存级隔离内核原理
  • 保姆级教程:在ROG幻16 Air上从零部署Isaac Gym强化学习环境(Ubuntu 22.04 + CUDA 12.2)
  • 电容滤波在电源设计中的关键作用与优化策略
  • 给肿瘤学研一新生的SEER数据库‘生存指南’:从零申请账号到完成你的第一个趋势分析图表