从手动部署到容器化的转变
以前在公司更新一个服务,得连上服务器,手动停进程、传文件、改配置、再启动。一旦出错,就得翻日志一点点查,经常卡在环境依赖上——开发说“我本地好好的”,运维却头疼“你这少了两个库”。
后来团队开始用 Docker 做容器化部署,变化很明显。把应用和依赖打包成镜像,开发测试用的和线上跑的一模一样。上线不再是“提心吊胆”的操作,而是几分钟内完成的流程。
镜像分层优化,构建不再耗时
Dockerfile 写得不合理,每次构建都从头来,网络拉包又慢,特别影响效率。我们调整了镜像结构,把不变的部分往前放。比如 Node.js 项目,先拷贝 package.json 安装依赖,再拷贝源码。
FROM node:16-alpine<br>WORKDIR /app<br>COPY package.json .<br>RUN npm install --production<br>COPY . .<br>CMD ["npm", "start"]这样只要 package.json 不变,npm install 这一层就能复用缓存,构建时间从 5 分钟降到 1 分钟出头。
多阶段构建瘦身镜像
前端项目打包时需要 webpack、TypeScript 等工具,但运行时只需要静态文件。如果把构建环境也塞进最终镜像,体积大,启动慢。
我们用了多阶段构建,前一阶段负责编译,后一阶段只复制产物。
FROM node:16 as builder<br>WORKDIR /app<br>COPY . .<br>RUN npm run build<br><br>FROM nginx:alpine<br>COPY --from=builder /app/dist /usr/share/nginx/html最终镜像从 900MB 缩到 20MB,推送和拉取速度快了不少。
利用本地 Registry 加速拉取
多个服务器部署时,每次都从公网拉镜像太慢。我们在内网搭了个私有 Registry,CI 构建完就推到本地仓库。
部署时从内网拉取,速度从每秒几十 KB 提升到几十 MB,尤其在批量发布时优势明显。就像小区超市送货,比等外地快递快多了。
合理配置资源限制,提升调度效率
一开始没设资源限制,一个服务占满 CPU,其他容器跟着卡。后来在 docker-compose.yml 或 Kubernetes 配置中明确 limits 和 requests。
deploy:<br> resources:<br> limits:<br> cpus: '0.5'<br> memory: 512M<br> reservations:<br> memory: 256M调度器能更高效安排容器位置,机器利用率上去了,整体响应也更稳定。
结合 CI/CD 实现一键发布
现在提交代码后,GitLab CI 自动跑测试、构建镜像、推送到 Registry,最后 SSH 到服务器拉新镜像重启容器。整个过程十分钟搞定,不用人工干预。
早上改完 bug,刷个牙的功夫,新版已经在线上跑着了。这种流畅感,是过去手动部署没法比的。