使用 Docker Compose 部署前后端项目,核心是通过一个 YAML 文件编排前端、后端、数据库及反向代理容器,适合需要环境一致性且服务依赖较多的场景。
先说结论:Docker Compose 是管理多容器应用的标准工具,能将复杂的环境搭建简化为一条命令,特别适合前后端分离架构的标准化交付。
- 适合:涉及 Nginx 反向代理、后端 API 服务及数据库协同工作的完整应用栈。
- 先准备:规划清晰的项目目录结构,编写各服务的 Dockerfile 及 Nginx 配置文件。
- 验收:确认容器间网络互通,检查数据卷挂载是否持久化,验证端口映射是否生效。
命令速用版
在项目根目录(包含 docker-compose.yml 的目录)执行以下命令即可启动服务:
docker-compose up -d查看运行状态:
docker-compose ps若需重新构建镜像(如代码变更):
docker-compose up -d `--build`为什么会这样
传统部署方式需要手动安装环境、配置依赖,容易因系统差异导致“在我机器上能跑”的问题。Docker Compose 通过声明式配置定义最终状态,每个服务运行在独立容器中,拥有自己的文件系统和网络空间。这不仅实现了环境隔离,还自动化了服务间的依赖管理,例如确保数据库先于应用启动,解决了因依赖服务未就绪导致的启动失败。
分步处理
1. 规划项目结构
建议在项目根目录下区分后端、前端及配置目录。典型结构包含后端代码目录、前端源码或构建产物目录、Nginx 配置目录以及 docker-compose.yml 文件。确保构建上下文清晰,避免将不必要的文件打入镜像。
2. 编写 Dockerfile
后端服务通常基于语言运行时镜像(如 Python、Node.js 或 Java),仅放入代码和依赖。前端可以选择在本地构建后拷贝产物,或在镜像内构建,后者镜像较大但便于验证。Nginx 容器通常基于官方镜像,拷贝前端静态文件和配置文件。
3. 配置 docker-compose.yml
定义所有服务,包括版本、服务名、构建路径、端口映射、环境变量及数据卷。利用 depends_on 字段声明服务依赖顺序。数据库服务需配置持久化卷,避免容器删除后数据丢失。
4. 配置 Nginx 反向代理
Nginx 承担静态文件托管和 API 请求转发。配置监听端口,将前端请求指向静态目录,将特定 API 路径反向代理到后端容器服务名及端口。注意设置正确的 Host 头和客户端真实 IP 传递。
怎么验证是否生效
1. 检查容器状态
使用docker-compose ps确认所有服务状态为 Up。若有退出状态,查看具体日志。
2. 查看日志
通过docker-compose logs [服务名]查看启动日志,确认无报错信息,特别是数据库连接和端口监听情况。
3. 网络连通性测试
在服务器上使用 curl 访问映射端口,确认前端页面可加载,API 接口能返回预期数据。检查 Nginx 日志确认请求是否成功转发至后端。
常见坑
1. 数据持久化遗漏
数据库未挂载卷会导致容器删除后数据清零。务必在 compose 文件中配置 volumes 将数据目录映射到宿主机。
2. 容器间网络通信
容器间通信应使用服务名而非 localhost。Nginx 代理后端时,地址应为后端服务名,且需确保在同一网络下。
3. 构建上下文错误
前端打包目录位置错误会导致构建失败。确保 Dockerfile 中的 COPY 路径与实际构建产物路径一致,必要时使用.dockerignore 排除无关文件。
4. 镜像拉取限速
国内环境拉取官方镜像可能受限,可配置国内镜像源加速拉取,或在 Dockerfile 中更换软件源地址。
参考来源
- 基于 Docker Compose 的前后端分离应用部署
- 新手入门|Docker 部署前后端项目全流程 (附命令 + 避坑)
- Docker Compose 实现一键部署前后端分离项目的完整指南
- Docker Compose 一键部署前后端分离项目 (Vue3 + SpringBoot3 + MySQL)
- Docker Compose 实战:5 分钟搞定前后端分离项目部署 (含常见报错解决方案)
- 《Docker Compose 部署前后端分离项目实战:Nginx + Spring Boot(含完整踩坑记录)》
- Docker Compose 实战:如何用 5 分钟搞定前后端分离项目的本地开发环境搭建
- 逃离 Docker Hub 限速!国内镜像 + 完整 Docker Compose 部署 Node 与 MySQL 服务