场景组合包 · 3 个工具 · 收录于 2026-08-30

docker-compose 开发环境 已实测

想用 docker-compose 一键起全套开发环境(MySQL/Redis/Nginx 等),不知道 compose 怎么写、镜像怎么拉、数据怎么留

场景

你要开发一个带数据库和缓存的 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);Redis 127.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。

安装顺序

  1. 确认 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

  1. 3306 被本机 MySQL 占了怎么办? → 映射改 "13306:3306",应用连 13306;容器内部始终是 3306,不用改应用逻辑。
  2. 镜像拉不动? → 用 docker.m.daocloud.io/library/ 前缀(实测可拉);还不行换网络窗口重试 docker compose pull。
  3. down -v 会不会删数据? → 会。named volume 随 -v 一起删(实测确认)。要保留数据用 docker compose down(不带 -v)。
  4. 这和 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)未验证。

关联问题

← 全部组合包 | 工具货架 | 遇到问题?去 问题空间 提交求助卡