用 Docker Compose 在华为云 ECS 上部署 Nginx + Spring Boot 的实践记录
一、背景
最近把一个内部管理系统迁移到华为云,单台 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
几个要点:
- app 只 expose,不映射宿主机端口,避免 8080 直接暴露到公网;
- nginx 配置用只读挂载,改完配置执行 nginx -s reload 即可生效;
- 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。
六、日志与排错
- 容器内时区不对:除环境变量 TZ 外,建议把 /etc/localtime 一并挂载进容器;
- nginx 返回 502:先看 docker compose logs app 确认应用是否真的启动,再检查 proxy_pass 是否写成了 compose 服务名;
- 磁盘被日志吃满:给 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。整个过程踩坑最多的两处是安全组放通和容器网络里的服务发现,先把这两点确认清楚,剩下的基本都是配置问题。
- 点赞
- 收藏
- 关注作者
评论(0)