1. 创建统一目录(确保路径存在)
# 创建 /opt/stack 及子目录,匹配 Compose 文件中的挂载路径
mkdir -p /opt/stack/{mysql,minio/data,redis/data}
2. 保存 Compose 文件
# 直接写入文件(避免手动编辑出错)
cat > /opt/stack/docker-compose.yml <<'EOF'
# Docker Compose 版本(3.8 兼容主流 Docker 版本,适配 19.03+)
version: "3.8"
# 自定义网络:隔离三个服务,避免与其他容器网络冲突
networks:
stack-network:
driver: bridge
# 服务定义
services:
# ===================== MySQL 服务 =====================
mysql:
# 镜像版本:与原 docker run 一致(8.0.39)
image: mysql:8.0.39
# 容器名称:与原 docker run 一致(vm_mysql01)
container_name: vm_mysql01
# 重启策略:与原 docker run 一致(always,容器退出始终自动重启)
restart: always
# 端口映射:与原 docker run 一致(宿主机3306映射容器3306)
ports:
- "3306:3306"
# 环境变量:与原 docker run 一致(root密码123456)
environment:
- MYSQL_ROOT_PASSWORD=123456
# 数据卷挂载:将原命名卷 mysql-data 改为绑定 /opt/stack/mysql 目录
# 统一存储到 /opt/stack/ 下,替代 Docker 自动管理的命名卷
volumes:
- /opt/stack/mysql:/var/lib/mysql
# 归属自定义网络
networks:
- stack-network
# 兼容原 MySQL 8.0 客户端认证方式(避免旧客户端连接失败)
command: ["--default-authentication-plugin=mysql_native_password"]
# ===================== MinIO 服务 =====================
minio:
# 镜像版本:与原 docker run 一致(RELEASE.2025-04-22T22-12-26Z)
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
# 容器名称:与原 docker run 一致(vm_minio01)
container_name: vm_minio01
# 重启策略:与原 docker run 隐含的 always 对齐(异常自动重启)
restart: always
# 端口映射:与原 docker run 一致(9000=API端口,9001=控制台端口)
ports:
- "9000:9000"
- "9001:9001"
# 环境变量:与原 docker run 一致(账号admin,密码admin123456)
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=admin123456
# 数据卷挂载:将原 /opt/minio/data 改为 /opt/stack/minio/data
# 统一存储到 /opt/stack/ 下,保持路径逻辑一致
volumes:
- /opt/stack/minio/data:/data
# 归属自定义网络
networks:
- stack-network
# 启动命令:与原 docker run 一致(指定存储目录和控制台端口)
command: server /data --console-address ":9001"
# ===================== Redis 服务 =====================
redis:
# 镜像版本:与原 docker run 一致(6.2.6)
image: redis:6.2.6
# 容器名称:与原 docker run 一致(vm_redis)
container_name: vm_redis
# 重启策略:与原 docker run 一致(always)
restart: always
# 端口映射:与原 docker run 一致(宿主机6379映射容器6379)
ports:
- "6379:6379"
# 内存限制:与原 docker run 的 -m 256m 一致
mem_limit: 256m
# 数据卷挂载:将原 /opt/redis/data 改为 /opt/stack/redis/data
# 统一存储到 /opt/stack/ 下
volumes:
- /opt/stack/redis/data:/data
# 归属自定义网络
networks:
- stack-network
# 启动命令:与原 docker run 完全一致(开启AOF、内存限制、淘汰策略)
command:
- redis-server
- --appendonly yes # 开启AOF持久化(与原命令一致)
- --maxmemory 200mb # 最大内存限制200MB(与原命令一致)
- --maxmemory-policy allkeys-lru # 内存满时淘汰最少使用的key(与原命令一致)
EOF
3. 启动所有服务
# 进入 /opt/stack 目录
cd /opt/stack
# 后台启动所有服务(自动拉取镜像、创建容器、挂载数据卷)
docker compose up -d
4. 验证服务是否启动成功
# 查看容器状态(所有服务应为 Up 状态)
docker compose ps
# 验证 MySQL 连接
mysql -h127.0.0.1 -uroot -p123456 -e "select 1;"
# 验证 MinIO 健康状态
curl -s http://127.0.0.1:9000/minio/health/live
# 验证 Redis 连接
docker exec -it vm_redis redis-cli ping
日常运维命令
# 进入 /opt/stack 目录执行以下命令
cd /opt/stack
# 停止所有服务(保留数据)
docker compose stop
# 启动所有服务
docker compose start
# 重启所有服务
docker compose restart
# 查看某个服务的日志(如 MySQL)
docker compose logs -f mysql
# 升级服务(拉取最新镜像并重启)
docker compose pull && docker compose up -d
# 彻底删除容器(保留 /opt/stack 下的数据)
docker compose down
注意事项
- 首次启动时,Docker 会自动拉取对应版本的镜像,若网络较慢可耐心等待;
/opt/stack/目录下的所有数据会持久化存储,删除容器不会丢失数据;- 若需修改密码 / 端口 / 参数,直接编辑
docker-compose.yml后执行docker-compose up -d即可热更新; - 生产环境建议将
restart: always改为restart: unless-stopped(手动停止后不会自动重启,更安全)。