容器技术与虚拟化技术的区别
以往部署一个Application,需要硬件支持和操作系统的支持。这样就会导致:
- 部署非常慢
- 成本非常高
- 资源浪费
- 难于迁移和扩展
- 可能会被限定硬件厂商
虚拟化技术
虚拟化技术出现之后,一个物理机可以部署多个APP,每个APP运行在独立的VM里。优点在于:
- 资源池:一个物理机的资源分配到了不同的虚拟机里。
- 容器扩展:加物理机或者虚拟机。
- 容易云化:阿里云等
虚拟化技术的局限性:
- 每个虚拟机都是一个完整的操作系统,要给其分配资源,当虚拟机数量增多时,操作系统本身消耗的资源势必增多。
容器技术
容器解决了什么问题:
- 解决了开发和运维之间的矛盾:在开发和运维之间搭建了一个桥梁,是实现DevOps的最佳解决方案。
什么是容器?
- 对软件和其依赖的标准化打包。
- 应用之间的相互隔离。
- 共享同一个OS Kernel。
当然容器技术和虚拟化技术可以结合使用。
Docker架构
Docker提供了一个开发,打包,运行app的平台,它把app和底层infrastructure隔离开来,如下图所示。
Docker Engine是Docker里面的一个核心的概念,它包括:
- 后台进程(docker daemon)
- REST API Server
- CLI接口(docker)
其中REST API将docker命令与daemon联系起来,如下图所示:
Docker底层技术简介
- Namespaces:做隔离pid,net,ipc,mnt,uts。
- Control groups:做资源控制。
- Union file systems:Container和image的分层。
Docker容器本质上是宿主机上的进程。Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
容器化思维
从技术角度理解容器化思维,就是要意识到容器的本质是一个进程以及运行该进程所需要的各种依赖。比如,当理解了容器实际上是一个进程,我们就不需要去备份一个容器了,而是应该把需要备份的数据放在容器外挂的volume里或者数据库里。
下面举例“SSH服务器的替代方案”的问题,来举例说明如何用容器化的思维解决一些日常运维中的问题。
你会在一个进程中启动一个ssh服务器吗,显然不会。既然明白Docker容器其实是一个进程,所以,也不该使用ssh访问容器。
之前我们是怎么访问的呢?docker attach
或者docker exec
,并推荐使用后者。
具体可以看看文章Docker容器进入的4种方式。
谈到容器经常会谈到微服务,因为容器技术的轻量级特性降低里微服务的开销。微服务模式包含如下三大特性:
- 彼此独立
- 原子化
- 组合和重构
而与之相关的,可以涵盖在容器化思维内的理念还包括Devops、持续集成和持续交付(CICD)以及不可变基础设置等等。