一份写给「只做开发、不做运维」的 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 代理(推荐)
-
打开 Docker Desktop → Settings → Resources → Proxies
-
填写代理地址(以 (●'◡'●)为例,端口 7897):
python""" HTTP Proxy: 127.0.0.1:7897 HTTPS Proxy: 127.0.0.1:7897 """ -
点击 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
解决过程
-
发现是网络问题 → Docker 拉不到镜像
-
配置 Docker Desktop 代理(127.0.0.1:7897)
-
发现报错变成
TLS connect...EOF -
检查 (●'◡'●) 设置 → 开启「允许局域网连接」
-
再次运行 → 镜像开始拉取 ✅
经验教训
| 问题 | 原因 | 解决 |
|---|---|---|
| 拉取镜像超时 | 国内网络访问 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 全部串联起来!🚀