从本地开发到云端上线:一次容器化改造的实战复盘

举报
yd_242888859 发表于 2026/10/01 08:38:40 2026/10/01
【摘要】 记录一个小型 Web 服务从裸机部署迁移到云上容器化的完整过程,包括镜像构建、弹性伸缩与成本控制的经验教训。

一、为什么要容器化

项目最初跑在一台自建服务器上:环境靠文档手动安装,一次系统升级导致依赖库版本错乱,服务中断了半天。这让我下定决心做容器化改造。目标很明确:

  1. 环境一致:开发、测试、生产用同一个镜像;

  2. 快速回滚:出问题能在一分钟内切回上一版本;

  3. 弹性伸缩:流量高峰自动扩容,闲时释放资源省成本。

二、改造过程

1. 编写 Dockerfile 的几个细节

  • 使用多阶段构建,最终镜像从 1.2GB 压到 180MB;

  • 把依赖安装层放在源码复制之前,充分利用构建缓存;

  • 用非 root 用户运行容器,减少安全风险。

DOCKERFILE

FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11 /usr/local/lib/python3.11
COPY . .
RUN useradd -m appuser
USER appuser
CMD ["gunicorn", "-w", "4", "app:app"]

2. 配置管理

敏感配置(数据库密码、API Key)绝不写进镜像。我们统一使用环境变量注入 + 云上密钥管理服务,镜像本身保持“一次构建、处处运行”。

3. 健康检查与优雅停机

在负载均衡层配置健康检查探针,同时给应用加上 SIGTERM 处理:收到终止信号后先停止接收新请求,等存量请求处理完再退出。这一步让滚动更新期间的用户报错降到了零。

三、上线后的效果


指标


改造前


改造后


部署耗时


40 分钟


3 分钟


回滚时间


1 小时+


<1 分钟


闲时成本


固定


降低约 60%

四、踩过的坑

  1. 时区问题:容器默认 UTC,日志时间对不上,需在镜像中显式设置 TZ;

  2. 日志丢失:容器销毁后本地日志没了,改为输出到 stdout 并接入云日志服务;

  3. 镜像仓库权限:CI 拉取私有镜像报 401,最终用镜像仓库的临时凭证解决。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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