容器化,是指使用容器技术(Docker/containerd等)运行应用程序(容器),并使用容器编排技术(例如 K8s)来管理这些容器。
我在之前的文章 《使用 Dockerfile 构建生产环境镜像》 提及普通的虚拟机部署存在的问题:
为什么有这篇文章,是因为我在真正做容器化改造的时候,发现公司生产环境存在大量的坑:
- 传统虚拟机部署,基本依赖克隆或者手工编译。由于人力原因,SRE 历来单传,编译出来的 PHP、扩展等二进制版本不一致;
- 项目开发人员痛苦不堪——他没办法模拟出接近于线上一致的环境(碰不到摸不着,各种扩展版本都要自己去编译);
- 新人入职都会灵魂拷问你一句——我怎么把线上的代码跑起来?
- ……
另外,传统的虚拟机部署,还存在成本浪费——虚拟机无法做到容器的资源隔离和扩缩容,资源利用率不高。
所以我们可以发现,有以下几点好处:
一、环境的高度一致性
- 容器需要制作镜像文件,描述环境的构建过程,也就意味着它可以保证环境的高度一致
- 无论本地环境或者生产环境,由于 Dockerfile 的存在,不同的操作系统也可以兼容
- 高度一致性带来了环境的统一,统一的环境有利于 CI/CD 流程,结合自动化技术提升效率
二、资源隔离
- 以往虚拟机容易因为混合部署,而某些应用耗费内存过大,导致程序 OOM 崩溃,而容器由于资源隔离,不会互相影响
- 合理分配每个容器的资源,有利于提高资源利用率,降低资源成本
- 通过 Linux Cgroups 技术(Linux Control Group)限制资源上限;通过 Linux NameSpace 机制修改进程看到的外部资源的 “视图”
三、轻量级
- 相比虚拟机,容器启动速度在秒级别
- 容器为进程,通过 Linux NameSpace 机制和 unionFS,使得进程本身看起来好像拥有一个隔离的环境和文件系统(实际上还是宿主机的一个进程)
容器化是未来的一大趋势!让我们拥抱云原生吧!