用 Docker Compose 在华为云 ECS 上部署 Nginx + Spring Boot 的实践记录

举报
yd_285311430 发表于 2026/10/27 11:44:21 2026/10/27
【摘要】 在华为云 ECS(Huawei Cloud EulerOS 2.0)上用 Docker Compose 编排 Nginx + Spring Boot,涵盖安全组配置、反向代理与 HTTPS、日志轮转、备份与平滑升级,并记录实践中踩过的坑。

一、背景

最近把一个内部管理系统迁移到华为云,单台 ECS 上跑 Nginx(反向代理)+ Spring Boot 应用 + MySQL(容器化),要求整套环境可以一键重建。本文记录从零到跑通的完整过程,以及过程中踩过的坑。

二、环境与选型

  • 规格:通用计算型 s6.large.2(2 vCPU / 4 GB),系统盘高 IO 40 GB
  • 镜像:Huawei Cloud EulerOS 2.0 标准版 64 位
  • 区域:华北-北京四
  • 容器运行时:Docker CE 24.x + Docker Compose v2 插件

选择 HCE 的原因是它和 CentOS 8 的包管理习惯接近,dnf 安装 Docker 很顺手,也不需要额外换源。

三、基础环境准备

3.1 安全组

入方向只放通 22、80、443;数据库 3306 不对外,仅同 VPC 内访问。这一点比在服务器上配置 iptables 更可靠,也更容易审计。

3.2 安装 Docker

sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
docker compose version

3.3 目录规划

mkdir -p /opt/app/{nginx/conf.d,certs,logs,www}

把配置、证书、日志、静态资源分开挂载,后面做备份只备份 /opt/app 就够了。

四、Compose 编排

docker-compose.yml 关键片段:

services:
  web:
    image: nginx:1.27-alpine
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./certs:/etc/nginx/certs:ro
      - ./www:/usr/share/nginx/html:ro
    depends_on: [app]
    restart: unless-stopped
  app:
    image: registry.cn-north-4.myhuaweicloud.com/demo/app:1.0.0
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - TZ=Asia/Shanghai
    expose: ["8080"]
    restart: unless-stopped

几个要点:

  1. app 只 expose,不映射宿主机端口,避免 8080 直接暴露到公网;
  2. nginx 配置用只读挂载,改完配置执行 nginx -s reload 即可生效;
  3. restart: unless-stopped 保证 ECS 重启后容器自动拉起。

五、Nginx 反向代理与 HTTPS

nginx/conf.d/app.conf:

server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate     /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    location / {
        proxy_pass http://app:8080;
        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_read_timeout 60s;
    }
}
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

证书通过华为云 SSL 证书管理签发后下载 Nginx 格式,放到 certs/ 目录,并把 privkey.pem 权限设为 600。

六、日志与排错

  1. 容器内时区不对:除环境变量 TZ 外,建议把 /etc/localtime 一并挂载进容器;
  2. nginx 返回 502:先看 docker compose logs app 确认应用是否真的启动,再检查 proxy_pass 是否写成了 compose 服务名;
  3. 磁盘被日志吃满:给 Docker 配置日志轮转,在 /etc/docker/daemon.json 中写入 {“log-driver”: “json-file”, “log-opts”: {“max-size”: “50m”, “max-file”: “3”}},然后重启 docker。

七、备份与升级

升级应用只需要改镜像 tag,然后执行 docker compose up -d app。滚动重启期间 nginx 会有短暂 502,生产环境建议先起第二个 app 服务,在 nginx 里用 upstream 做权重切换,验证通过后再下线旧版本。

八、小结

单机 Docker Compose 适合中小规模场景:环境可复制、迁移成本低、排错路径清晰;不足是缺少编排调度能力,业务增长后需要平滑迁移到 CCE。整个过程踩坑最多的两处是安全组放通和容器网络里的服务发现,先把这两点确认清楚,剩下的基本都是配置问题。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。