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

Docker 容器 + Docker Compose单机部署理发店系统
之前使用dockerdocker的自定义桥接网络部署好了理发店系统。一、自定义网络和Compose区别dockerdocker自定义网络 和 dockerdocker compose这两种部署方式的核心区别在于手动拼积木 vs 按图纸一键组装。对于部署一个包含后端、数据库、缓存等多服务的理发店系统使用dockerdocker 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.8Docker 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