
一、文档概述本文档基于docker-compose.yml样板逐段解析 Compose 语法、MySQL8、Java 后端、Nginx 前端反向代理整套微服务容器部署逻辑包含版本、网络、容器资源限制、健康检查、数据持久化、依赖启动、静态资源挂载、端口映射等完整说明可作为项目部署标准模板。二、完整原文件yamlversion: 3.8 services: mysql: image: mysql:8.0 container_name: house-mysql deploy: resources: limits: memory: 1G cpus: 1 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 30s timeout: 10s retries: 3 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: housesalesystem MYSQL_USER: user MYSQL_PASSWORD: root TZ: Asia/Shanghai command: --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf - ./mysql/init:/docker-entrypoint-initdb.d ports: - 3306:3306 restart: unless-stopped networks: - house-network house-backend: build: context: . dockerfile: Dockerfile-backend container_name: house-backend depends_on: mysql: condition: service_healthy environment: TZ: Asia/Shanghai FILE_UPLOAD_DIR: /home/house/uploadImage volumes: - ./house/backend/logs:/home/house/logs - ./house/uploadImage:/home/house/uploadImage ports: - 8080:8080 restart: unless-stopped networks: - house-network nginx: image: nginx:1.21-alpine container_name: house-nginx depends_on: - house-backend volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx - ./house/frontend/dist:/usr/share/nginx/html - ./house/uploadImage:/home/house/uploadImage ports: - 80:80 - 443:443 restart: unless-stopped networks: - house-network networks: house-network: driver: bridge三、顶层配置逐行详解1.version: 3.8作用指定 docker-compose 文件语法版本3.8 兼容 Docker 20.10 主流版本支持healthcheck、deploy资源限制、condition健康依赖等高阶特性。注意版本过低会不支持健康等待启动、资源限制等配置。2.services:核心节点所有容器服务均定义在此下本项目包含 3 个服务mysql数据库服务house-backendJava 后端业务服务nginx静态前端 反向代理网关服务3.networks:自定义桥接网络实现容器间互通隔离外部网络。四、mysql 数据库服务详细解析yamlmysql: image: mysql:8.0 container_name: house-mysql deploy: resources: limits: memory: 1G cpus: 1 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 30s timeout: 10s retries: 3 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: housesalesystem MYSQL_USER: user MYSQL_PASSWORD: root TZ: Asia/Shanghai command: --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf - ./mysql/init:/docker-entrypoint-initdb.d ports: - 3306:3306 restart: unless-stopped networks: - house-networkimage: mysql:8.0使用官方 MySQL8 镜像稳定适配 SpringBoot 后端。container_name: house-mysql自定义容器名称方便docker logs / docker exec操作避免随机容器名。deploy.resources.limits资源限制memory:1G容器最大内存 1GB防止 MySQL 占用宿主机全部内存cpus: 1限制 CPU 核心数 1 核控制服务器负载healthcheck健康检测关键test执行mysqladmin ping判断数据库是否正常就绪interval:30s每 30 秒检测一次timeout:10s单次检测超时 10 秒判定失败retries:3连续失败 3 次标记容器不健康 配合后端depends_on.condition: service_healthy实现等数据库完全启动再启动后端解决后端启动早于数据库导致连接失败问题。environment环境变量初始化数据库MYSQL_ROOT_PASSWORDroot 超级管理员密码MYSQL_DATABASE容器启动自动创建业务库housesalesystemMYSQL_USER / MYSQL_PASSWORD自动创建业务普通用户业务代码使用该账号连接不直接用 rootTZ: Asia/Shanghai统一容器时区为东八区避免时间差、创建时间错乱command启动参数覆盖默认配置mysql_native_passwordMySQL8 默认 caching_sha2_password 会导致 Navicat、旧驱动连接失败改为传统密码认证插件utf8mb4完整 utf8支持 emoji 表情utf8mb4_unicode_ci通用排序规则volumes数据持久化挂载宿主机 ↔ 容器映射./mysql/data:/var/lib/mysql数据库数据文件持久化删除容器数据不丢失./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf自定义 MySQL 配置连接数、慢查询、缓冲池等./mysql/init:/docker-entrypoint-initdb.d启动自动执行目录下.sql初始化脚本建表、导入基础数据ports: 3306:3306端口映射宿主机 3306 → 容器 3306本地 Navicat 可直接连接数据库restart: unless-stopped容器退出自动重启手动执行docker-compose down停止则不重启兼顾故障自愈与手动停机需求。networks: house-network加入自定义网桥后端、nginx 可通过容器名mysql直接访问数据库无需 IP。五、house-backend 后端服务解析yamlhouse-backend: build: context: . dockerfile: Dockerfile-backend container_name: house-backend depends_on: mysql: condition: service_healthy environment: TZ: Asia/Shanghai FILE_UPLOAD_DIR: /home/house/uploadImage volumes: - ./house/backend/logs:/home/house/logs - ./house/uploadImage:/home/house/uploadImage ports: - 8080:8080 restart: unless-stopped networks: - house-networkbuild本地构建镜像context: .构建上下文为当前 yml 所在目录dockerfile: Dockerfile-backend使用项目根目录下后端专属 Dockerfile 打包 Jar 镜像无需提前推送镜像仓库。depends_on依赖启动控制 普通depends_on仅保证容器启动顺序不等待服务就绪condition: service_healthy会等待 mysql 健康检测通过后才启动后端完美解决数据库未就绪连接报错。环境变量TZ统一时区FILE_UPLOAD_DIR注入上传文件存储路径后端代码读取该变量保存图片挂载目录日志目录挂载后端输出日志持久化到宿主机方便查看线上日志上传图片目录共享挂载和 Nginx 共用同一文件目录前端可直接访问上传图片端口映射8080:8080后端服务端口对外暴露开发调试可直接访问生产环境可关闭外网端口仅 Nginx 内网调用。网络加入网桥后端可通过mysql容器名连接数据库地址jdbc:mysql://mysql:3306/housesalesystem六、nginx 网关 / 前端服务解析yamlnginx: image: nginx:1.21-alpine container_name: house-nginx depends_on: - house-backend volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/logs:/var/log/nginx - ./house/frontend/dist:/usr/share/nginx/html - ./house/uploadImage:/home/house/uploadImage ports: - 80:80 - 443:443 restart: unless-stopped networks: - house-networknginx:1.21-alpinealpine 轻量版 Nginx镜像体积小占用资源低。depends_on: house-backend先启动后端容器再启动 Nginx防止 Nginx 反向代理时后端不存在。四层挂载目录作用./nginx/conf:/etc/nginx/conf.d宿主机存放自定义 nginx.conf包含前端静态资源、/api 反向代理转发到后端 8080、SSL 证书配置./nginx/logs:/var/log/nginxNginx 访问日志、错误日志持久化前端 dist 打包产物挂载Vue 打包后的静态页面直接放入 Nginx 网页目录访问域名打开前端页面上传图片共享目录和后端共用图片存储目录Nginx 直接静态托管图片不走后端接口端口映射80 端口HTTP 标准网页端口443 端口HTTPS 加密访问端口用于配置 SSL 证书网络互通Nginx 可通过容器名house-backend:8080反向代理转发接口请求。七、networks 自定义网桥解析yamlnetworks: house-network: driver: bridgedriver: bridge桥接网络Compose 默认网络模式。作用三个容器全部加入同一网桥容器之间使用容器名称作为域名互相访问无需填写宿主机 IP网络隔离容器内部互通不与宿主机其他容器互通环境干净无需手动创建网络docker-compose up自动创建停止时可选择删除。八、配套目录结构规范与 yml 挂载路径对应plaintext项目根目录 ├── docker-compose.yml ├── Dockerfile-backend ├── mysql/ │ ├── data/ # mysql数据持久化 │ ├── conf/ │ │ └── my.cnf # mysql自定义配置 │ └── init/ # 初始化sql脚本 ├── nginx/ │ ├── conf/ # nginx站点配置 │ └── logs/ # nginx访问日志 └── house/ ├── backend/ │ └── logs/ # 后端日志 ├── frontend/ │ └── dist/ # Vue打包产物 └── uploadImage/ # 业务上传图片共享目录九、常用操作命令配套说明启动整套服务后台运行bash运行docker-compose up -d查看容器运行状态、健康状态bash运行docker-compose ps查看实时日志所有服务bash运行docker-compose logs -f重启指定服务如修改 nginx 配置后bash运行docker-compose restart nginx停止并删除容器保留数据卷bash运行docker-compose down停止并删除容器 网络清空数据需手动删除 mysql/data 文件夹bash运行docker-compose down十、模板优势总结完整前后端数据库一体化部署MySQL Java 后端 Nginx 前端网关一套文件搞定数据持久化数据库、日志、上传文件全部挂载宿主机容器销毁数据不丢失健康启动机制避免后端早于数据库启动报错资源管控限制 MySQL 内存 CPU防止服务器资源耗尽统一时区全部容器 Asia/Shanghai解决时间错乱共享文件目录上传图片后端写入、Nginx 直接读取性能更高轻量 Nginxalpine 镜像节省服务器存储网络隔离自定义网桥容器内部通过容器名互通配置简单。