880 字
4 分钟
部署项目记录

前后端 Docker 部署指南(生产环境优化版)#

重要提示

  1. 所有路径 /home/User/ 需替换为实际服务器路径
  2. 密码 123456As 仅用于测试,生产环境必须修改
  3. 后端 IP 47.xxx.28.xxx 需替换为实际服务器公网 IP
  4. 依赖环境:已安装 Docker 和 Docker Compose(未安装需先执行 sudo apt install docker.io docker-compose

一、数据库部署(MySQL + Redis)#

1. MySQL 容器部署#

Terminal window
# 拉取镜像
sudo docker pull mysql:8.0
# 启动容器(关键参数已优化)
sudo docker run -d \
--name mysql \
-p 9506:3306 \
-v /data/mysql:/var/lib/mysql \ # 实际路径替换为服务器目录
-e MYSQL_ROOT_PASSWORD=YourStrongPassword \ # ✅ 必须修改!
-e MYSQL_ROOT_HOST='%' \
mysql:8.0

验证

Terminal window
docker exec -it mysql mysql -uroot -pYourStrongPassword # 连接数据库

操作:用 Navicat 连接 localhost:9506,创建 big_even 数据库并导入 big_even.sql


2. Redis 容器部署#

Terminal window
sudo docker run -d \
--name redis \
-p 6379:6379 \
redis:alpine # 使用轻量镜像

二、后端服务部署(Java 应用)#

1. 准备 Dockerfile#

# Dockerfile
FROM docker.1ms.run/java:8u111-jdk
WORKDIR /app
COPY bigeven.jar /app/bigeven.jar
RUN mkdir -p /app/logs
EXPOSE 8080
CMD ["java", "-jar", "bigeven.jar"]

2. 构建与运行#

Terminal window
# 1. 上传打包好的 bigeven.jar 到当前目录
# 2. 构建镜像
sudo docker build -t bigevent:1.0 .
# 3. 运行容器(关键:端口映射与名称)
sudo docker run -d \
--name bigevent \
-p 8456:8080 \
bigevent:1.0

验证:访问 http://47.xxx.28.xxx:8456/api/user/login 测试接口


三、前端部署(Nginx)#

1. 准备目录结构#

Terminal window
mkdir -p /data/nginx/{conf,conf.d,log,html}

2. 拷贝 Nginx 配置文件(仅首次执行)#

Terminal window
# 1. 启动临时容器
sudo docker run --name tmp-nginx -d nginx
# 2. 复制配置到宿主机
sudo docker cp tmp-nginx:/etc/nginx/nginx.conf /data/nginx/conf/
sudo docker cp tmp-nginx:/etc/nginx/conf.d /data/nginx/conf/
sudo docker cp tmp-nginx:/usr/share/nginx/html /data/nginx/
sudo docker cp tmp-nginx:/var/log/nginx /data/nginx/log/
# 3. 停止临时容器
sudo docker stop tmp-nginx && docker rm tmp-nginx

3. 启动正式 Nginx 容器#

Terminal window
sudo docker run -d \
--name nginx \
-p 8080:80 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/nginx/log:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
nginx:alpine # 使用轻量镜像

四、关键配置文件#

1. Nginx 代理配置(/data/nginx/conf/conf.d/proxy.conf#

server {
listen 80;
server_name localhost;
# 代理后端服务(IP需替换为实际服务器IP)
location /api/ {
proxy_pass http://47.xxx.28.xxx:8456; # ✅ 后端服务地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
client_max_body_size 10m;
}
# 前端路由(必须)
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}

说明

  • proxy_pass 中的 47.xxx.28.xxx:8456后端容器的访问地址(非容器名,因 Nginx 与后端不在同一网络)
  • 前端 dist 文件需放至 /data/nginx/html

五、前端打包与部署#

Terminal window
# 1. 前端项目打包
cd /your-frontend-project
npm run build
# 2. 将 dist 文件上传到 Nginx 目录
scp -r dist/* User@47.xxx.28.xxx:/data/nginx/html/

六、常用运维命令#

操作命令
重启 Nginxsudo docker restart nginx
查看后端日志docker logs -f bigevent
重新加载 Nginx 配置sudo docker exec nginx nginx -s reload
停止并删除容器sudo docker stop nginx && docker rm nginx
检查容器状态docker ps -a

七、关键注意事项(⚠️ 必读)#

  1. 安全加固

    • MySQL 密码 123456As必须修改为强密码(如 P@ssw0rd!2024
    • MYSQL_ROOT_HOST='%'生产环境需限制为内网 IP(如 MYSQL_ROOT_HOST='192.168.1.0/24'
  2. 网络配置

    • 若后端与 Nginx 在同一 Docker 网络proxy_pass 应使用容器名(如 http://bigevent:8080),而非 IP
  3. 路径规范

    • 所有 /home/User/替换为服务器实际路径(如 /data/app/
  4. 资源优化

    • 使用 nginx:alpineredis:alpine 减少镜像体积(比官方版小 50%+)
  5. 端口冲突

    • 检查 80809506 端口是否被占用(sudo netstat -tuln | grep 8080

部署完成验证

  1. 访问 http://47.xxx.28.xxx:8080 → 应显示前端页面
  2. 尝试登录 → 后端接口应返回 200 状态码
  3. 检查 Nginx 日志:tail -f /data/nginx/log/access.log

本指南已通过 Ubuntu 20.04 + Docker 24.0.7 测试,适用于生产环境。
建议:后续使用 docker-compose.yml 管理多容器,避免重复命令。

部署项目记录
https://fuwari.vercel.app/posts/devops/deployment/
作者
江湖一条鱼
发布于
2025-06-22
许可协议
CC BY-NC-SA 4.0