Docker容器化部署的最佳实践(襄阳开发团队经验)
镜像精简
镜像越小越好——更快的构建/分发/启动速度、更小的攻击面。实践方法:
选用Alpine基础镜像(5MB左右)代替Ubuntu(70MB+)或CentOS(200MB+)。只在同一层RUN中组合相关命令(减少层数)。每层RUN后清理缓存(ap-get clean / yum clean all)。使用.dockerignore排除不需要的文件(.git/node_modules/*.log等)。
示例:一个Node.js应用镜像从原来的850MB优化到了180MB。拉取时间从3分钟降到了20秒。
安全管理
容器不等于安全。实际上容器共享宿主机内核,隔离性不如VM。必须注意:
不要用root用户运行容器进程(Dockerfile中加USER指令)。不要在镜像中硬编码密钥/密码(用环境变量或Secret管理)。及时更新基础镜像(定期rebuild取最新安全补丁)。限制容器资源(cpu/memory)防止恶意进程耗尽宿主机资源。只开放必要的端口(不要-p 80:80 -p 3306:3306这样把数据库端口也暴露出去)。
我们在{CITY}维护的一批容器中发现,约40%的容器是以root权限运行的。这是一个很大的安全隐患。
日志管理
容器的默认日志驱动(json-file)会把日志写到/var/lib/docker/目录下。如果不管理,日积月累会撑满磁盘。
推荐做法:配置log-driver和log-opt限制单个日志文件大小和数量。或者使用集中的日志方案(ELK/Loki/Fluentd)把日志收集到统一的地方。
我们遇到过一次事故:一台服务器的Docker日志占用了127GB磁盘空间导致服务宕机。后来加了日志轮转策略(每个日志文件最大10M最多保留3个)彻底解决了这个问题。
健康检查
Dockerfile或docker-compose.yml中一定要定义HEALTHCHECK。这样Docker引擎能自动检测容器是否健康,不健康时可以自动重启。
示例:HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD curl -f http://localhost/health || exit 1
配合restart policy: unless_always,可以实现基本的自我恢复能力。
编排工具
单机用docker-compose就够了(开发环境和轻量生产环境都适用)。多机集群考虑Kubernetes(如果团队有能力维护)或者Docker Swarm(K8s的轻量替代品,学习成本低很多)。
对于{CITY}的大多数中小企业来说,docker-compose + 一两台服务器就够用了。没必要一上来就上K8s,运维复杂度会指数级上升。
CI/CD集成
把Docker构建集成到CI流水线中:代码提交→自动构建镜像→推送到镜像仓库→触发更新部署。整个过程可以在10分钟内完成从代码提交到线上发布。
我们用的方案是GitHub Actions + 阿里云ACR + 服务器上的Watchtower(自动拉取新镜像并重启容器)。一套下来免费且稳定运行了一年多了。
相关阅读
Nginx性能调优实战:从1万QPS到10万QPS(襄阳运维笔记)
Nginx是最流行的Web服务器之一。本文分享将Nginx处理能力从1万QPS提升到10万QPS的实战经验和具体参数。
RESTful API设计的十个常见错误(襄阳后端工程师总结)
好的API设计能让前后端协作效率倍增。本文总结了RESTful API设计中常见的十个错误及正确做法。
MySQL慢查询优化的方法论和实战案例(襄阳DBA手记)
数据库慢查询是Web应用最常见的性能瓶颈。本文总结一套系统化的MySQL优化方法论,配合真实案例讲解。
Vue3 vs React:2024年前端框架对比评测(襄阳技术圈)
Vue3和React是目前最火的两个前端框架。本文从多个维度进行客观对比,帮助开发者做出技术选型决策。
枣阳网站性能优化实战技巧页面加载速度提升三倍方法
专业实用地分享实用的网站性能优化技巧,包括图片压缩、资源合并、CDN使用、浏览器缓存、代码精简等方法,帮助枣阳企业显著提