从本地开发到云端上线:一次容器化改造的实战复盘
【摘要】 记录一个小型 Web 服务从裸机部署迁移到云上容器化的完整过程,包括镜像构建、弹性伸缩与成本控制的经验教训。
一、为什么要容器化
项目最初跑在一台自建服务器上:环境靠文档手动安装,一次系统升级导致依赖库版本错乱,服务中断了半天。这让我下定决心做容器化改造。目标很明确:
-
环境一致:开发、测试、生产用同一个镜像;
-
快速回滚:出问题能在一分钟内切回上一版本;
-
弹性伸缩:流量高峰自动扩容,闲时释放资源省成本。
二、改造过程
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% |
四、踩过的坑
-
时区问题:容器默认 UTC,日志时间对不上,需在镜像中显式设置 TZ;
-
日志丢失:容器销毁后本地日志没了,改为输出到 stdout 并接入云日志服务;
-
镜像仓库权限:CI 拉取私有镜像报 401,最终用镜像仓库的临时凭证解决。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)