【全栈部署实战】宝塔面板+Docker容器化部署前后端分离项目
1. 环境准备与依赖安装
在开始部署前后端分离项目之前,我们需要先搭建好基础环境。这里我推荐使用宝塔面板来管理服务器环境,它能极大简化Linux服务器的配置工作。就像装修房子前要先通水电一样,环境准备是整个部署过程的基石。
1.1 宝塔面板安装
首先登录你的云服务器,执行以下命令安装宝塔面板(以CentOS为例):
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
安装完成后,你会得到一个外网面板地址和初始账号密码。记得在安全组中放行8888端口,这是宝塔面板的默认端口。第一次登录时,建议在面板设置中修改默认端口和账号密码,这是基础的安全防护措施。
进入面板后,我通常会先做三件事:
- 在"软件商店"安装Nginx、MySQL等必要服务
- 在"安全"页面配置防火墙规则
- 在"面板设置"中开启基础防护
注意:生产环境强烈建议使用HTTPS访问宝塔面板,可以在"面板设置"中申请SSL证书
1.2 Docker环境配置
虽然宝塔面板提供了图形化的软件安装方式,但为了部署的灵活性和可移植性,我们后端服务还是选择Docker容器化部署。在宝塔的"终端"中执行:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl enable docker
systemctl start docker
安装完成后,可以执行docker version检查是否安装成功。为了提升镜像拉取速度,建议配置国内镜像源:
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
systemctl restart docker
2. 前端项目部署
前端项目我们使用宝塔面板+Nginx的方案,这种组合对静态资源部署特别友好。就像把精心制作的家具搬进新房一样,我们需要把打包好的前端代码放到合适的位置。
2.1 项目打包与上传
在前端项目根目录执行构建命令(以Vue项目为例):
npm run build
这会在项目目录下生成dist文件夹,里面就是我们要部署的静态资源。通过宝塔面板的"文件"功能,可以直接上传整个dist目录。我习惯把前端项目放在/www/wwwroot目录下,例如:
/www/wwwroot/frontend
├── dist
│ ├── index.html
│ └── static
2.2 Nginx配置
在宝塔面板中新建站点,填写你的域名或服务器IP。然后修改Nginx配置,主要关注这几个关键点:
server {
listen 80;
server_name yourdomain.com;
location / {
root /www/wwwroot/frontend/dist;
try_files $uri $uri/ /index.html;
index index.html;
}
location /api {
proxy_pass http://backend:8989/api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这个配置实现了两个核心功能:
- 将前端静态资源映射到/dist目录
- 把/api开头的请求反向代理到后端服务
实测中发现,Vue等SPA项目需要特别注意路由问题。如果直接访问子路由会出现404,try_files配置就是解决这个问题的关键。
3. 后端服务容器化
后端服务我们采用Docker容器化部署,就像把厨房设备打包成标准化模块,可以随时搬移到任何地方使用。
3.1 Dockerfile编写
在后端项目根目录创建Dockerfile文件,以Java项目为例:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这个Dockerfile做了以下几件事:
- 基于轻量级的Alpine Linux镜像
- 设置临时卷挂载点
- 复制打包好的Jar文件
- 定义容器启动命令
3.2 构建与运行
在Dockerfile所在目录执行构建命令:
docker build -t backend-service:1.0 .
构建完成后,运行容器:
docker run -d -p 8989:8989 \
--name backend \
--network mynetwork \
backend-service:1.0
这里我特意添加了--network参数,这是为了让前后端容器能够通过容器名互相访问。创建网络的命令是:
docker network create mynetwork
4. 数据库与中间件部署
现代Web应用离不开各种数据库和中间件的支持,使用Docker部署这些服务能极大简化配置过程。
4.1 MySQL部署
对于数据库服务,我推荐使用Docker部署但保留数据持久化:
docker run -d \
--name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-v /data/mysql:/var/lib/mysql \
--network mynetwork \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
关键参数说明:
-v参数实现了数据持久化--network让数据库加入前端使用的网络- 最后两个参数设置了字符集,避免中文乱码
4.2 Redis部署
缓存服务Redis的部署也很简单:
docker run -d \
--name redis \
-p 6379:6379 \
-v /data/redis:/data \
--network mynetwork \
redis \
--requirepass "yourpassword"
记得在应用配置中使用容器名而非localhost访问Redis,例如在Spring Boot中:
spring.redis.host=redis
spring.redis.password=yourpassword
5. 前后端联调与测试
当所有服务都部署完成后,我们需要确保前后端能够正常通信。这里分享几个我在联调时常用的技巧。
5.1 跨域问题解决
虽然我们在Nginx配置中已经处理了跨域,但开发阶段可能还需要其他方案。以Spring Boot为例,可以添加全局CORS配置:
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
5.2 接口测试技巧
使用Postman或curl测试接口时,我习惯先测试几个关键点:
- 基础健康检查接口(如/health)
- 数据库连接测试接口
- 需要认证的接口
- 文件上传等特殊接口
一个简单的测试脚本示例:
# 测试健康检查
curl http://yourdomain.com/api/health
# 测试数据库连接
curl -X POST http://yourdomain.com/api/test-db
# 测试认证接口
curl -X POST -H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}' \
http://yourdomain.com/api/auth/login
6. 部署优化与监控
项目上线后,我们还需要考虑性能和稳定性优化。这里分享几个实战中总结的经验。
6.1 Nginx性能调优
在宝塔面板的Nginx配置中,可以调整以下参数:
worker_processes auto; # 自动设置工作进程数
worker_connections 1024; # 每个进程连接数
keepalive_timeout 65; # 保持连接超时时间
gzip on; # 开启Gzip压缩
gzip_types text/plain application/xml application/json; # 压缩类型
6.2 容器资源限制
为防止某个容器占用过多资源,可以在运行容器时添加限制:
docker run -d \
--name backend \
--memory=1g \
--cpus=1 \
--network mynetwork \
backend-service:1.0
6.3 日志收集
宝塔面板自带了日志监控功能,但容器日志需要额外配置。我习惯把容器日志也挂载到主机:
docker run -d \
--name backend \
-v /logs/backend:/var/log \
backend-service:1.0
然后在宝塔的"计划任务"中设置日志轮转,避免日志文件过大。
7. 常见问题排查
在实际部署过程中,难免会遇到各种问题。这里整理了几个我踩过的坑和解决方案。
7.1 端口冲突问题
如果发现服务无法启动,首先检查端口占用情况:
netstat -tulnp | grep 8989
在宝塔面板的"安全"页面,也要确认防火墙是否放行了相关端口。
7.2 容器网络不通
当容器间无法通信时,可以按以下步骤排查:
- 检查容器是否在同一个网络:
docker network inspect mynetwork - 测试容器间连通性:
docker exec -it backend ping mysql - 检查应用配置中的服务地址是否正确
7.3 数据库连接失败
数据库连接问题通常有几个原因:
- 密码错误
- 权限不足
- 网络不通
- 字符集不匹配
可以通过以下命令进入MySQL容器检查:
docker exec -it mysql mysql -uroot -p
8. 自动化部署进阶
对于需要频繁更新的项目,可以考虑实现自动化部署流程。这里介绍一个简单的方案。
8.1 使用Git Webhooks
在宝塔面板的"网站"设置中,可以配置Git Webhook,实现代码推送后自动构建。具体步骤:
- 在代码仓库设置Webhook地址
- 在宝塔创建Hook脚本
- 脚本内容示例:
#!/bin/bash
git pull origin master
npm install
npm run build
rm -rf /www/wwwroot/frontend/dist/*
cp -r dist/* /www/wwwroot/frontend/dist/
8.2 Docker Compose编排
对于复杂的多容器应用,推荐使用Docker Compose管理。创建一个docker-compose.yml文件:
version: '3'
services:
backend:
build: .
ports:
- "8989:8989"
networks:
- mynetwork
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- /data/mysql:/var/lib/mysql
networks:
- mynetwork
redis:
image: redis
command: redis-server --requirepass yourpassword
volumes:
- /data/redis:/data
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
然后通过一条命令即可启动所有服务:
docker-compose up -d
这种方案特别适合需要部署多个关联服务的场景,比如微服务架构的应用。
更多推荐
所有评论(0)