Docker 容器 + Docker Compose单机部署理发店系统

之前使用docker+docker的自定义桥接网络部署好了理发店系统。

一、自定义网络和Compose区别

docker+docker自定义网络 和 docker+docker compose;这两种部署方式的核心区别在于:"手动拼积木" vs "按图纸一键组装"。对于部署一个包含后端、数据库、缓存等多服务的理发店系统,使用docker+docker network手动管理,和用docker-compose编排,体验和效率会有天壤之别。

我把它们的区别和好处整理成了一个表格,方便你对比查看:

对比维度纯 Docker 命令 (docker + docker network)Docker Compose (docker-compose)
工作方式命令式,手动逐条输入docker run ...指令。声明式,在docker-compose.yml文件中定义所有服务。
配置管理配置分散在命令行参数中,难以记录和复用。所有配置(镜像、端口、环境变量)集中在YAML文件,可纳入版本控制。
服务依赖需手动控制启动顺序,或编写脚本等待。通过depends_on自动管理服务启动顺序(例如先启动数据库,再启动应用)。
网络管理需要手动docker network create并让容器加入指定网络。自动创建网络,容器间可通过服务名直接通信(如应用连接db:3306)。
操作指令启动、停止、删除每个服务都需单独执行命令。一条命令docker-compose up -d启动所有服务;docker-compose down一键清理。
适用场景单容器测试、临时任务。多容器应用开发、测试及中小型生产环境

二、环境准备

本次直接把数据库、后端、前端都通过docker compose部署了。

规模中大的产品会把数据库单独部署,但是我是学习阶段,把数据库也部署到docker compose了。

所以准备阶段,一定先把后端、前端、docker-compose.yml、数据库执行脚本(创建表、创建初始值,生成初始库的脚本)放在同一个目录

结构如下:

/root/barbershop/ ├── docker-compose.yml ├── dump-lfd-202606080947.sql # ← 必须放在这里 ├── barbershop-backend/ │ ├── Dockerfile │ └── barbershop-backend-1.0.0.jar └── barbershop-frontend/ ├── Dockerfile ├── nginx.conf └── dist/

三、打开网桥

1、打开网桥,执行如下脚本

不然虚拟机无法到互联网下载东西

#!/bin/bash # 确保设置永久生效 echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-docker.conf # 立即应用所有 sysctl 设置 sysctl -p /etc/sysctl.d/99-docker.conf # 重启 Docker 服务,确保配置生效 systemctl restart docker

四、docker-compose.yml配置如下

# ================================================================ # Docker Compose 配置文件 - 理发店管理系统 # ================================================================ # 文件格式版本: 3.8(Docker Compose v2.x 完全支持) # 使用说明: # 启动: docker-compose up -d # 停止: docker-compose down # 查看状态: docker-compose ps # 查看日志: docker-compose logs -f # 重启: docker-compose restart # ================================================================ version: '3.8' # ================================================================ # 服务定义(三个服务:数据库、后端、前端) # ================================================================ services: # -------------------------------------------------------------- # 1. MySQL 数据库服务 # -------------------------------------------------------------- mysql: # 服务名: 后端代码中用 "mysql" 连接数据库 # 例: jdbc:mysql://mysql:3306/LFD # 使用官方 MySQL 8.0 镜像 image: mysql:8.0 # 容器名(命令行操作时使用) # 例: docker logs barbershop-mysql container_name: barbershop-mysql # 环境变量(容器启动时自动执行) environment: # root 用户密码(必须设置,否则容器无法启动) MYSQL_ROOT_PASSWORD: 数据库root密码 # 自动创建数据库 LFD MYSQL_DATABASE: 数据库名LFD # 自动创建普通用户 LFD(应用程序使用) MYSQL_USER: 用户名LFD # 普通用户密码(必须和后端 application.yml 一致) MYSQL_PASSWORD: 用户名LFD密码 # 端口映射: 宿主机:容器 # 宿主机 3306 映射到容器 3306,方便 DBeaver 等工具连接 ports: - "3306:3306" # 数据持久化(容器删除数据不丢失) volumes: # 数据库文件: 宿主机 /data/barbershop/mysql → 容器 /var/lib/mysql # 注意: 此目录需要提前创建: mkdir -p /data/barbershop/mysql - /data/barbershop/mysql:/var/lib/mysql # 初始化脚本: 首次启动时自动导入备份数据 # 注意: dump-lfd-202606080947.sql 放在 docker-compose.yml 同级目录 - ./dump-lfd-202606080947.sql:/docker-entrypoint-initdb.d/init.sql # 网络: 加入 barbershop-net 网络,与其他容器通信 networks: - barbershop-net # 重启策略: 除非手动停止,否则总是自动重启 # 服务器重启、容器崩溃都会自动恢复 restart: unless-stopped # 健康检查: 检测 MySQL 是否真正启动完成 healthcheck: # 执行 mysqladmin ping 检测数据库是否可用 test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pJc19951221"] # 每 10 秒检测一次 interval: 10s # 单次检测超时 5 秒 timeout: 5s # 连续 5 次成功才标记为 healthy retries: 5 # 注意: 状态为 healthy 后,后端容器才会启动 # -------------------------------------------------------------- # 2. 后端 Spring Boot 服务 # -------------------------------------------------------------- lfd: # 服务名: 与 nginx.conf 中的 proxy_pass http://lfd:8081/api/ 一致 # 前端 Nginx 通过此名称访问后端 # 构建镜像: 使用 /home/lfd/houduan 目录下的 Dockerfile # Dockerfile 内容: 将 jar 包打包成可运行镜像 build: /home/lfd/houduan dns: - 8.8.8.8 - 114.114.114.114 # 容器名(命令行操作使用) container_name: barbershop-backend # 端口映射: 宿主机 8081 → 容器 8081 # 用户可通过 http://服务器IP:8081/api/ 直接访问后端 ports: - "8081:8081" # 数据持久化: 上传文件保存在宿主机 volumes: # 用户上传的图片/文件存放在宿主机 /data/barbershop/uploads # 容器内路径为 /app/uploads(与 Dockerfile 中一致) - /data/barbershop/uploads:/app/uploads # 网络: 加入 barbershop-net networks: - barbershop-net # 依赖关系: 等待 MySQL 健康后再启动 depends_on: mysql: condition: service_healthy # 等 MySQL 健康检查通过 # 重启策略: 除非手动停止,否则自动重启 restart: unless-stopped # -------------------------------------------------------------- # 3. 前端 Vue + Nginx 服务 # -------------------------------------------------------------- frontend: # 服务名: 用于 Docker Compose 内部标识 # 构建镜像: 使用 /home/lfd/qianduan 目录下的 Dockerfile # Dockerfile 内容: 将 dist 静态文件 + nginx.conf 打包 build: /home/lfd/qianduan dns: - 8.8.8.8 - 114.114.114.114 # 容器名(命令行操作使用) container_name: barbershop-frontend # 端口映射: 宿主机 80 → 容器 80 # 用户通过 http://服务器IP/LFD/login 访问 # 端口 80 是 HTTP 默认端口,访问时可省略 ports: - "80:80" # 网络: 加入 barbershop-net networks: - barbershop-net # 依赖关系: 依赖后端,但不等待健康检查 # 前端 Nginx 启动很快,不需要等后端 depends_on: - lfd # 重启策略: 除非手动停止,否则自动重启 restart: unless-stopped # ================================================================ # 网络配置 # ================================================================ networks: # 自定义桥接网络 # 作用: 让三个容器在同一个网络内,通过服务名互相访问 barbershop-net: # bridge: 默认网络模式,同一网络内容器互通 driver: bridge

五、完整启动流程

# 1. 进入项目目录 cd /home/lfd # 2. 创建数据目录 mkdir -p /data/barbershop/mysql mkdir -p /data/barbershop/uploads # 3. 设置 MySQL 数据目录权限(必须) chown -R 999:999 /data/barbershop/mysql # 4. 确认文件存在 ls -la docker-compose.yml dump-lfd-202606080947.sql ls -la houduan/Dockerfile houduan/*.jar ls -la qianduan/Dockerfile qianduan/dist/ # 5. 启动 docker-compose up -d # 6. 查看状态 docker-compose ps # 7. 查看日志 docker-compose logs -f

六、验证成功标志

# 1. 查看容器状态,都是 Up docker-compose ps # 2. 测试前端 curl http://localhost/LFD/login # 3. 测试后端 curl http://localhost:8081/api/你的接口 # 4. 查看 MySQL 健康状态 docker ps | grep mysql # 应该显示 (healthy)

七、其他常用命令

后台启动全部 docker compose up -d 后台启动指定服务 docker compose up -d frontend 停止全部 docker compose stop 停止指定服务 docker compose stop frontend 启动全部 docker compose start 启动指定服务 docker compose start frontend 重启全部 docker compose restart 重启指定服务 docker compose restart lfd 删除全部 docker compose down 删除全部+数据卷(⚠️) docker compose down -v 查看状态 docker compose ps 查看日志 docker compose logs -f 查看指定服务日志 docker compose logs -f lfd 进入容器 docker compose exec lfd sh 重新构建并启动 docker compose up -d --build 拉取镜像并启动 docker compose pull && docker compose up -d

八、替换前端代码

替换前端包,重新构建前端,启动前端即可

# 1. 进入项目目录 cd /home/lfd # 2. 重新构建前端镜像(--no-cache 确保不使用旧缓存) docker compose build --no-cache frontend # 3. 重新创建并启动前端容器 docker compose up -d frontend # 4. 查看前端日志 docker compose logs -f frontend