场景
你要开发一个带数据库和缓存的 Web 应用,本地需要 MySQL + Redis 跑起来。手动装服务麻烦(版本冲突、卸载残留、换机器重来),教程各讲各的、镜像还拉不动。你想要的是一份能复用的 compose 文件:一条命令起全套、数据不丢、换机器照跑。
本组合包把这条路走通:docker compose 定义服务(MySQL + Redis),国内镜像前缀解决拉取问题,named volume 保数据。装完你会得到:一个 docker compose up -d 就能起来的本地开发栈,外加验证命令、日常操作和清理方法。与 combo-docker-wsl-env(排查"用不起来")和 combo-mirror-setup(配置各包镜像源)互补——这里管「用 compose 起整套环境」。
组合成员 (3)
docker compose(编排载体)
下载:Docker Desktop 自带(Windows);Linux 装 docker-compose-plugin(Docker 官方源或发行版源)
版本要求:v2+(实测 v5.4.0);依赖 Docker daemon 可用
docker compose version
MySQL 8.0 镜像
下载:`docker.m.daocloud.io/library/mysql:8.0`(官方镜像的国内镜像前缀;实测直连 docker hub 拉不动,daocloud 可拉)
版本要求:8.0(实测 2026-08-30 拉取成功,约 500MB)
Redis 7 镜像
下载:`docker.m.daocloud.io/library/redis:7-alpine`(轻量 alpine 版,实测秒级启动)
版本要求:7-alpine(实测 2026-08-30 拉取成功,约 100MB)
方案总览
| 组件 | 管什么 | 为什么是它 |
|---|---|---|
| docker compose(本体,非收录概念成员) | 用一份 YAML 定义多服务并编排启停 | 事实标准;Docker Desktop 自带(实测 v5.4.0) |
| MySQL 8.0 镜像(daocloud) | 数据库 | 开发环境最常见的库;镜像走国内前缀实测可拉 |
| Redis 7 镜像(daocloud) | 缓存/队列 | 轻量(alpine),起得快(实测秒级) |
为什么按这个顺序装:先确认 docker compose 可用 → 再写 compose 文件(服务定义)→ 起栈后先等 MySQL 就绪再冒烟(MySQL 首次启动要初始化数据目录,实测约 20s,Redis 秒起)。端口映射按本机占用调整(本机 3306 被占时用 13306,实测场景)。
快速开始
一键脚本由组合包文档自动生成(渲染后位于 pages/combos/combo-docker-compose-dev.sh)。先备份/确认前置,再执行:
bash pages/combos/combo-docker-compose-dev.sh
- 装完你会得到:MySQL + Redis 双服务开发栈,
docker compose up -d一条命令起、数据存在 named volume。 - 预计耗时:3-8 分钟。最大卡点 = 首次拉镜像(实测 mysql:8.0 + redis:7-alpine 合计约 600MB,走 daocloud 国内镜像)。
- 前置条件:Docker Desktop(WSL2 后端)或 Linux Docker;内存 ≥ 4GB;磁盘 ≥ 2GB 空闲;3306/6379 端口未被占用(占用则改映射)。
想弄明白每一步在干什么、装错了怎么恢复 → 看「逐步教学」。一键脚本出问题 → 逐条按逐步教学手动执行定位。
逐步教学
第 1 步:确认 docker compose 可用(为什么先确认:它是整套的载体)
Docker Desktop 自带 compose v2(docker compose 子命令)。确认版本:
docker compose version
预期输出: Docker Compose version v5.4.0(实测本环境 v5.4.0;v2 以上即可)
装好确认:
docker compose version有输出;docker info显示 Server 正常(daemon 可达)。
卡住怎么办:
- command not found → 装 Docker Desktop(Windows)或 docker-compose-plugin(Linux)。
- daemon 连不上 → 看 combo-docker-wsl-env 的 docker-daemon-connect 排查。
第 2 步:写 docker-compose.yml(为什么这一步是核心:一份文件定义全部服务)
compose 文件声明服务、端口、数据卷、健康检查。下面这份与实测一致:db 服务(MySQL 8.0,数据卷 d8data,健康检查 mysqladmin ping),cache 服务(Redis 7-alpine,数据卷 d8cache)。镜像带 docker.m.daocloud.io 国内前缀——这是国内拉得动的关键(实测直连 docker hub 不通)。
services:
db:
image: docker.m.daocloud.io/library/mysql:8.0
container_name: dev-db
environment:
MYSQL_ROOT_PASSWORD: yourpass
MYSQL_DATABASE: app_dev
ports:
- "13306:3306"
volumes:
- dbdata:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-pyourpass"]
interval: 5s
timeout: 3s
retries: 20
cache:
image: docker.m.daocloud.io/library/redis:7-alpine
container_name: dev-cache
ports:
- "16379:6379"
volumes:
- cachedata:/data
volumes:
dbdata:
cachedata:
预期输出: 文件写入成功(无输出)
装好确认:
docker compose config输出渲染后的配置且无报错(实测 PASS)。
卡住怎么办:
- YAML 报错 → 缩进必须一致(两个空格);冒号后必须有空格。
- 端口冲突 → 本机 3306 被占时映射改 13306(本组合包实测场景);先
ss -ltn | grep 3306查占用。
第 3 步:起栈并等待就绪(为什么等:MySQL 首次启动要初始化数据目录)
up -d 后台起全部服务。MySQL 首次启动初始化数据目录(实测约 20s 就绪,期间连接会被拒);Redis 秒级就绪。用健康检查轮询等 MySQL:
docker compose up -d
for i in $(seq 1 18); do
docker exec dev-db mysqladmin ping -h 127.0.0.1 -pyourpass >/dev/null 2>&1 && { echo "mysql ready ~$((i*5))s"; break; }
sleep 5
done
docker compose ps
预期输出: mysql ready ~20s;docker compose ps 两服务 Up(实测:cache Up,db Up (health: starting→healthy))
装好确认:
docker compose ps两个容器状态 Up;docker exec dev-db mysqladmin ping -h 127.0.0.1 -pyourpass输出mysqld is alive(实测 exit 0)。
卡住怎么办:
- 90 秒还没 ready →
docker compose logs db看初始化日志;多半是磁盘慢或配置错。 - 容器反复重启 →
docker compose logs定位;端口冲突常见(改了端口映射还冲突就换更大端口)。
第 4 步:冒烟验证(为什么验证:确认服务真的能读写,不只是进程活着)
进程 Up ≠ 能读写。实测用真实 DML 和 Redis 读写验证:
docker exec dev-db mysql -h 127.0.0.1 -uroot -pyourpass -e "USE app_dev; CREATE TABLE IF NOT EXISTS smoke (id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(32)); INSERT INTO smoke (v) VALUES ('ok'); SELECT COUNT(*) FROM smoke;"
docker exec dev-cache redis-cli ping
docker exec dev-cache redis-cli set probe ok
docker exec dev-cache redis-cli get probe
预期输出: MySQL 输出 COUNT(*) → 1(实测 rows_ok=1,exit 0);Redis 依次 PONG / OK / ok(实测全过)
装好确认:
- 三条命令 exit 全 0;MySQL 能建表插入查询,Redis 能写能读。
卡住怎么办:
- MySQL Access denied → 密码与 compose 里 MYSQL_ROOT_PASSWORD 不一致(改了密码要
down -v重建,数据卷会重初始化)。 - Redis 连不上 → 容器内 redis-cli 都失败说明服务问题,看 logs。
第 5 步:日常操作与数据卷(为什么要知道:数据卷是"数据不丢"的关键)
日常命令:docker compose ps(状态)、logs -f(看日志)、exec <服务> bash(进容器)、down(停并删容器,数据保留)、up -d(再起,数据还在)。
docker compose down # 停栈,named volume 保留
docker compose up -d # 再起,数据还在(实测)
docker compose down -v # 全删(含数据卷)——想重置环境才用
预期输出: down 显示 Stopped/Removed;up -d 后 docker exec dev-db mysql ... -e "SELECT COUNT(*) FROM smoke" 仍返回 1(数据保留,实测)
装好确认:
- 数据保留:down → up -d 后之前的表和数据还在;
- 零残留:
docker compose down -v后docker ps -a | grep dev-无结果(实测容器/卷/网络全清)。
卡住怎么办:
- 数据丢了 → 检查是否用了
down -v;named volume 没挂对(volumes: 段缺失)也会丢。
装完验收(一步到位)
作用:装完跑下面一条命令块,全绿 = 本组合包就绪;某条失败 → 回「逐步教学」对应步骤定位。
docker compose ps
docker exec dev-db mysql -uroot -pyourpass -e "SELECT 1"
docker exec dev-cache redis-cli ping
预期输出: db/cache 两服务 Up;MySQL 输出 1;Redis 输出 PONG(2026-08-30 实测:cache Up、db Up (health: starting→healthy)、PONG/OK/ok 全过)
注:密码按你的 compose 配置替换(示例 yourpass);冒烟后 docker compose down 即清理,数据在 named volume 保留。日常使用
- 起/停:
docker compose up -d/docker compose down(不带 -v 保数据)。 - 看日志:
docker compose logs -f db。 - 进容器:
docker exec -it dev-db bash。 - 应用连接:MySQL
127.0.0.1:13306(root/yourpass,库 app_dev);Redis127.0.0.1:16379。 - 换机器:复制 compose 文件 +
up -d即可(数据卷本机独立,不随文件迁移)。
卸载与清理
- 停栈:
docker compose down(保留数据卷,随时可再起)。 - 彻底清理:
docker compose down -v(删容器+网络+数据卷,实测零残留)。 - 镜像清理(可选):
docker image rm docker.m.daocloud.io/library/mysql:8.0 docker.m.daocloud.io/library/redis:7-alpine。
安装顺序
- 确认 docker compose(第 1 步)→ 2. 写 compose 文件(第 2 步)→ 3. 起栈等就绪(第 3 步)→ 4. 冒烟验证(第 4 步)。全装完跑通读写才算组合就绪。
依赖警告
- 冲突/端口:本机 3306 被占时映射改 13306(实测本环境即此场景);6379 同理改 16379;起栈前
ss -ltn | grep -E ":3306|:6379"先查。 - 版本:compose v2+(实测 v5.4.0);mysql:8.0;redis:7-alpine;与既有服务(站点 8123 / open-webui 3000 / ollama 11434)无端口交集(实测)。
- 环境:Docker Desktop(WSL2 后端)或 Linux Docker;内存 ≥ 4GB;磁盘 ≥ 2GB;MySQL 首次启动需 ~20s 初始化(实测),期间连接被拒属正常。
- 国内网络:镜像必须带
docker.m.daocloud.io前缀(实测直连 docker hub 拉不动;daocloud 拉取成功);compose pull可单独预拉。 - 数据:named volume 保留数据(down 不删);
down -v删除(实测确认)——想重置环境才用。
FAQ
- 3306 被本机 MySQL 占了怎么办? → 映射改
"13306:3306",应用连 13306;容器内部始终是 3306,不用改应用逻辑。 - 镜像拉不动? → 用
docker.m.daocloud.io/library/前缀(实测可拉);还不行换网络窗口重试docker compose pull。 down -v会不会删数据? → 会。named volume 随 -v 一起删(实测确认)。要保留数据用docker compose down(不带 -v)。- 这和 Docker Desktop 里其他集群冲突吗? → 不碰。独立 compose project 名 + 独立端口映射(实测容器/卷/网络零残留),与 hello-k8s-ai-dev 等集群互不干扰。
验证证据
每份组合包在隔离环境实测(冒烟 + 写面检查),未实测项在文中如实标注;实测日期见下方验证证据。
验证于 2026-08-30 · TTL 到期 2027-02-26(180 天)
- 组合包实测 2026-08-30(隔离目录 /tmp/d8-compose-test + 独立 project d8test):daocloud 拉取 mysql:8.0 + redis:7-alpine 成功 → compose config PASS → up -d 起栈 → MySQL ~20s 就绪(首次初始化)→ mysqladmin ping
mysqld is alive(exit 0)→ 建表/插入/查询rows_ok=1(exit 0)→ redis PONG + set/get ok(exit 0)→ 数据卷创建确认(d8test_d8data / d8test_d8cache)→ down -v 后容器/卷/网络零残留。 - 实测复现日志(2026-08-30)。
- 未实测(如实标注):compose 文件跨机器迁移(数据卷本机独立);非 daocloud 镜像源(如公司内网 registry)未验证。