Docker学习笔记(1)

Docker背景

应用部署技术发展简史

互联网企业生产环境的应用部署所经历的过程,大致可分三个阶段:

  • 物理机部署
  • 虚拟机部署
  • 容器化部署

一、物理机部署时代
  用纯粹的物理机部署应用,这是所有早期物联网公司必然经历的一个阶段。一台服务器,至少32核CPU、64G内存,如果只部署一个应用,那就太浪费了。于是,多个应用进程,DB,缓存进程等等都部署在同一个机器上。这样部署固然能高效的利用好昂贵的物理机,但是这种简单粗暴的方式有一个最大的痛点:进程间资源抢占。如果某个进程耗用了100%的CPU资源,其他的进程无法提供服务。或者如果一个进程因为突发异常很多,日志把磁盘打满了,所有的进程都要挂掉。进程间抢占资源导致其他进程无法提供服务所导致的血案数不胜数。既然因为资源共享导致的问题,那么解决方式就是:进程间硬件资源隔离。虚拟机技术的出现解决了这个棘手的问题。

Docker学习笔记(1)

二、 虚拟机部署时代

  虚拟机通过硬件虚拟化,即每台虚拟机事先从物理机分配好cpu核数,内存, 磁盘,每台虚拟机一般只部署一个应用。从而解决了进程间资源隔离的问题。不同的进程在不同的虚拟机上跑,大家相安无事,老死不相往来,自然没有资源冲突。一台物理机会部署多台虚拟机,物理机里的所有虚拟机则依靠虚拟机管理系统进行管理。
  虚拟机技术解决了物理机部署的痛点。但是虚拟机并不是完美的,他也有自己的缺点。大集群部署情况下,软件的版本容易混乱。
  大应用集群的虚拟机第一次安装时,由于操作系统镜像是一样的,所以刚开始,软件的版本和库依赖是统一的。随着时间的推移,开源的软件(tomcat, jdk, nginx)需要逐步升级,于是运维同学开始批量升级集群的软件版本,批量升级可能有遗漏或升级失败。同时有些开发同学会自己登陆机器修改软件的版本或者配置,以满足自己的需求。长此以往,一个应用的集群的虚拟机的软件版本和配置逐渐碎片化。当线上出现问题,需要排查到基础软件层面时,由于软件版本碎片化的问题,导致排查变得很棘手。
  为了解决虚拟机部署的痛点,容器技术应运而生。
Docker学习笔记(1)

三、 容器部署时代


  容器技术不仅限于docker,但是docker目前最为流行,我以docker为例讲容器。docker容器技术的核心之一在于镜像文件。

镜像文件,通俗的理解就是一个进程运行时依赖的软件文件的集装箱。

  应用集群部署时,每台机器首先会拉取指定版本的镜像文件。安装镜像后产生了docker容器。由于所有机器的镜像文件一样,容器的软件版本故而一样。即使开发或运维中途修改了容器的软件版本,但是容器销毁时,软件的改动会随容器的销毁一起湮灭。
  容器如果要升级软件版本,那就修改镜像文件。这样部署时集群内所有的机器重新拉取新的镜像,软件因此跟着一起升级。软件版本混乱的问题,到docker这里,也就得到了完美的解决。
Docker学习笔记(1)

什么是docker

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Docker学习笔记(1)

Docker学习笔记(1)