docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker nginx云端部署

Docker + Nginx 云端完整部署教程

作者:从此以后自律

要在一个云端环境中使用Docker和Nginx部署一个项目,可以参考下面教程,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

整体架构拆分

  1. Nginx:部署前端 Vue 静态资源,反向代理后端 Java 接口、处理 HTTPS、请求限流、静态缓存
  2. Docker:容器化打包 SpringBoot 后端 Jar,隔离运行环境,一键启停、迁移、回滚
  3. 云服务器:阿里云 / 腾讯云 ECS,开放 80/443 端口,防火墙放行端口,域名解析指向公网 IP
  4. 配套:MySQL、Redis、RocketMQ 可容器部署或独立云数据库

一、前置服务器环境准备(云服务器操作)

1. 安装 Docker & Docker Compose

# CentOS
yum install docker -y
systemctl start docker
systemctl enable docker
# 安装docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2. 防火墙 / 安全组放行端口

云服务器控制台安全组放行:80、443、3306、6379 服务器防火墙放行(firewalld):

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

3. 项目目录规划(统一存放部署文件)

/opt/project/machinery-ec/
├── front/                # 前端dist打包产物
│   ├── index.html
│   ├── js/ css/ img/
├── nginx/
│   ├── nginx.conf       # Nginx配置文件
│   ├── cert/            # SSL证书文件
├── backend/
│   ├── app.jar          # SpringBoot打包jar包
│   ├── Dockerfile       # 后端镜像构建脚本
│   ├── cert/            # 微信支付pem证书
├── docker-compose.yml   # 统一编排Nginx+后端容器

二、后端 SpringBoot Docker 容器部署细节

1. 编写后端 Dockerfile(/opt/project/machinery-ec/backend/Dockerfile)

# 基础JDK镜像 SpringBoot3 用jdk17
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制jar包到容器内
COPY app.jar /app/app.jar
# 复制支付证书到容器
COPY cert/ /app/cert/
# 暴露项目端口(后端服务端口8080)
EXPOSE 8080
# 启动命令,指定生产环境配置
ENTRYPOINT ["java","-jar","app.jar","--spring.profiles.active=prod"]

2. 构建后端镜像 & 手动启动测试

# 进入后端目录
cd /opt/project/machinery-ec/backend
# 构建镜像,命名ec-backend
docker build -t ec-backend:v1 .
# 本地运行测试容器
docker run -d --name ec-server -p 8080:8080 ec-backend:v1
# 查看日志验证启动
docker logs -f ec-server

3. 后端容器关键细节(避坑)

RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
ENTRYPOINT ["java","-Xms256m","-Xmx384m","-jar","app.jar"]

三、Nginx 部署前端 + 反向代理后端完整配置

1. Nginx 核心配置 nginx.conf

# 全局配置
worker_processes auto;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    # 负载均衡后端集群(单服务可省略)
    upstream ec_backend {
        server ec-server:8080; # docker容器互通,直接用容器名
    }
    # HTTP强制跳转HTTPS
    server {
        listen 80;
        server_name 82.157.103.50 www.xxx.com;
        return 301 https://$host$request_uri;
    }
    # HTTPS 443端口 正式访问
    server {
        listen 443 ssl;
        server_name 82.157.103.50 www.xxx.com;
        # SSL证书路径(宿主机挂载目录)
        ssl_certificate /etc/nginx/cert/xxx.pem;
        ssl_certificate_key /etc/nginx/cert/xxx.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        # 前端静态资源访问
        location / {
            root /usr/share/nginx/html;
            index index.html;
            # Vue路由history模式必配,刷新404解决
            try_files $uri $uri/ /index.html;
            # 静态资源缓存,减少请求
            expires 7d;
        }
        # 后端接口反向代理
        location /api/ {
            proxy_pass http://ec_backend/;
            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 X-Forwarded-Proto $scheme;
            # 超时时间
            proxy_connect_timeout 60s;
        }
        # 支付回调接口单独放行,不拦截登录校验
        location /api/pay/notify/ {
            proxy_pass http://ec_backend/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
        # 关闭Nginx版本号隐藏,防止漏洞扫描
        server_tokens off;
    }
}

2. Nginx Docker 挂载说明(关键)

启动 Nginx 容器时必须挂载 3 个目录,修改配置、替换前端、证书不用重建镜像:

  1. /opt/project/machinery-ec/front/usr/share/nginx/html:前端静态文件
  2. /opt/project/machinery-ec/nginx/nginx.conf/etc/nginx/nginx.conf:配置文件
  3. /opt/project/machinery-ec/nginx/cert/etc/nginx/cert:SSL 证书

四、docker-compose.yml 一键编排(统一启动 Nginx + 后端)

version: "3"
services:
  # 后端Java服务容器
  backend:
    image: ec-backend:v1
    container_name: ec-server
    restart: always # 服务器重启自动拉起
    volumes:
      # 挂载支付证书
      - ./backend/cert:/app/cert
      # 挂载日志持久化
      - ./logs:/app/logs
    networks:
      ec-net:
  # Nginx容器
  nginx:
    image: nginx:alpine
    container_name: ec-nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 挂载前端资源
      - ./front:/usr/share/nginx/html
      # 挂载配置文件
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      # 挂载SSL证书
      - ./nginx/cert:/etc/nginx/cert
    depends_on:
      - backend # 先启动后端再启动Nginx
    networks:
      ec-net:
# 自定义容器网络,容器之间通过名称互通
networks:
  ec-net:

Compose 启停命令

# 后台启动全部服务
docker-compose up -d
# 重启服务(修改nginx配置后执行)
docker-compose restart nginx
# 查看实时日志
docker-compose logs -f
# 停止所有容器
docker-compose down

五、部署全流程完整步骤

cd /opt/project/machinery-ec/backend
docker build -t ec-backend:v1 .

一键启动容器

cd /opt/project/machinery-ec
docker-compose up -d

验证部署

访问公网 IP / 域名:前端页面正常加载

调用 /api/pay/create 接口,后端无 500 报错

查看容器日志,无启动异常、数据库连接正常

六、生产环境核心细节 & 避坑

1. Nginx 专属业务细节

  1. Vue History 模式 404:必须配置 try_files $uri $uri/ /index.html;
  2. 支付回调安全:回调接口单独 location,不做 token 拦截,增加 IP 白名单限制
  3. 静态资源缓存:js/css/img 配置 expires 缓存,减轻后端压力
  4. 隐藏版本号server_tokens off 关闭 Nginx 版本泄露
  5. 跨域处理:前后端分离出现跨域可在 Nginx 统一配置 CORS,无需后端修改代码

2. Docker 容器化部署细节

  1. 自动重启:所有容器配置 restart: always,服务器断电重启自动恢复服务
  2. 数据挂载:日志、证书、配置全部宿主机挂载,容器删除数据不丢失
  3. 网络互通:使用自定义 compose 网络,Nginx 直接通过容器名访问后端,无需暴露 8080 到公网
  4. 版本迭代更新
    • 后端更新:上传新 jar → 重新 build 镜像 → docker-compose up -d 平滑更新
    • 前端更新:直接替换 front 目录文件 → docker-compose restart nginx 生效
  5. 资源隔离:低配置服务器限制 JVM 内存,避免容器占用全部内存导致服务器卡死

3. 支付模块部署重点(电商项目独有)

  1. 微信支付 pem 证书禁止打包进镜像,宿主机目录挂载,定期轮换证书无需重新构建镜像
  2. 生产配置 application-prod.yml 写入 Nacos 加密密钥,jar 包内不硬编码任何支付私钥
  3. 异步回调地址必须填写 https://域名/api/pay/notify,Nginx 强制 HTTPS,第三方平台只支持 HTTPS 回调
  4. 容器内时区统一 Asia/Shanghai,防止订单创建时间、支付时间时区偏差

4. 安全部署规范

  1. 后端 8080 端口不对外暴露,仅 Nginx 容器内网访问,公网只开放 80/443
  2. MySQL、Redis、RocketMQ 端口仅内网访问,安全组关闭公网放行
  3. 容器使用普通用户运行,禁止 root 权限启动服务
  4. 敏感配置文件 application-prod.yml 写入.gitignore,不提交代码仓库
  5. Nginx 限制单 IP 请求频率,防刷下单支付接口
  6. 定期清理 docker 无用镜像、容器,释放服务器磁盘空间
docker system prune -a

七、上线回滚方案(故障兜底)

  1. 后端回滚:保留旧版本镜像标签,故障时修改 compose 镜像版本,重启容器
  2. 前端回滚:备份上一版 dist 文件夹,直接覆盖 front 目录,重启 Nginx
  3. 容器快速关停:docker-compose down 一键停止所有服务,无残留进程

到此这篇关于项目 Docker + Nginx 云端完整部署细节的文章就介绍到这了,更多相关docker nginx云端部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文