- 01 引言
- 02 容器化由来
- 2.1 物理机时代
- 2.2 虚拟机时代
- 2.3 容器化时代
- 03 容器化发展
- 04 容器化技术
- 4.1 docker
- 4.2 docker-compose
- 4.3 docker-swarm
- 4.3 k8s
- 05 小结
在互联网行业,我们必然会接触到“容器技化技术”的,尤其是在 应用部署 这一块(一般会使用docker-swarm
或k8s
去管理),而这些工作都由相关的运维人员去操作。但是作为开发者,我认为还是很有必要去学习运维相关的知识的,尤其是 “容器化” 这一块,本文来简单的闲聊一下。
也许我们都会想,为啥会有容器化这个概念呢?我们来看看是怎么衍生这个概念的。
2.1 物理机时代以Windows
为代表的时代:很久以前,在物理机时代,如果我们要部署一个应用,在一开始,会在PC
物理机上搭建环境(如:java
的环境、maven
环境等),然后手动打包应用,再手动启动应用,这一系列的操作都是手动的,相当麻烦。
以VMWare
为代表的时代:为了节省时间,提高效率,聪明的项目经理就提出了一些需求,他们希望能做到如下的一款软件,需求如下:
- 这是一款虚拟机软件,搭载在物理机上的;
- 虚拟机软件的功能就是跟物理机的功能一模一样,包括环境;
- 跟物理机一样,可以在虚拟机上安装操作系统,然后在操作系统安装相应的应用部署环境,比如:安装
Windows
环境,然后在Windows
环境安装maven
、jdk
等; - 虚拟软件里面装的系统镜像可以随意的克隆,相当于复制一套环境了。
上述的描述,我们可以看到如果使用了虚拟机,我们可以快速复制虚拟机里面的镜像,直接在另外一套虚拟机软件就能使用了,确实提高了效率,但是!这是很耗资源的,因为这款虚拟机里安装的是一整套操作系统软件。
以Docker
为代表的时代:可以看出虚拟机是很“重”的,为了解决这个问题,聪明的攻城狮提出了容器化的概念,那么容器化要做到什么地步?
- 当然要比虚拟机做得更“轻”
- 也要比虚拟机做得更“快”
- 功能也要更强,比如:有标准化的迁移方式、统一的参数配置、自动化部署、应用集群监控、开发与运维之间的沟通桥梁等等。
下图是“虚拟化技术”与“容器化技术”的对比:
特性虚拟机容器隔离级别操作系统级进程级别隔离策略HypervisorCGroups系统资源5%~15%0%~5%启动时间分钟级秒级镜像存储GB-TBKB-MB集群规模上百上万高可用策略备份、容灾、迁移弹性、负载、动态对比图:
虚拟化技术容器化技术

说到容器化,必然会联系到云原生,他们的关系是彼此依赖的。
容器技术催生了云原生思潮,云原生生态推动了容器技术发展
云原生技术:
- 云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。
- 云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
借用百度图片的一张图来说明容器技术和云原生诞生的历史背景: 可以看到在2013年的
Docker
,到2014年Kubernetes
的项目发布,直接让容器技术逐步席卷天下,容器技术开始和编排系统起头并进。
有了容器化技术的技术支撑,2015年,由Google
,Redhat
、Microsoft
及一些大型云厂商共同创立了CNCF
,云原生浪潮启动。
到现在的202x年,可以看到容器服务商业化,容器引擎技术飞速发展,新技术不断涌现,不断的升级,Kata Containers
开始2.0架构,阿里云发布沙箱容器2.0....
大致可以分为如下几个历史阶段(借用百度图片):
说到容器化技术,最贴近我们日常开发运维的便是 “docker
”、“docker-compose
”、“docker-swarm
”、“Kubernetes(k8s)
”这几个概念,下面我们看看这几个技术的含义,以及他们之间的关系。
docker
是容器化的一个工具,它的思想是“集装箱”,何为集装箱?(下图是在百度图片搜的一张图) 在上图,我们可以看到在
Docker
守护进程即Docker daemon
里面,有一个Containers
容器,容器里面有很多个“集装箱”,我们只要把我们的Images
镜像放入“集装箱”里,然后在客户端Client
里运行docker
命令即可操作我们的镜像了,而这些镜像可以放到仓库Registry
,以供其他用户使用。
对于用户来说,可以看到Docker
有如下的功能:
- 更加关注容器能做什么,无需关心里面有什么;
- 有一套工具(如上图的
Client
) 来管理:打包 -> 运输 -> 运行; - 减少了部署单元的数量,从而减少了花销:多个工具(集装箱)聚集在一个“容器”内;
- 多个环境管理与隔离:以“容器”为单位进行部署和管理。
总结:可以说大部分容器技术都是以Docker
为基础,它是我们使用其他容器技术的核心。
既然有了docker
为基础,我们就可以使用容器了,但是现在很多的线上环境都不是单机的了,大多数会分布式或集群的,那么我们需要部署多个容器,比如docker中有成百上千的容器需要启动,如果我们一个一个容器的手动去启动,那该多耗时间。
因此,docker-compose
就出来了,它只要配置一个文件,在文件里声明好要启动的容器,docker
就会按照声明的配置去把所有的容器启动起来。
使用 docker-compose up
命令 即可以启动所有的容器!
总结:docker-compose
就是一个容器管家,负责帮你启动所有配置的容器。
docker-compose
有一个缺陷,就是只能管理当前主机上的docker
,而不能去启动其他主机上的docker
容器,那该怎么办呢?
这个时候docker-swarm
出现了,它可以管理多主机上的docker,而这些东西是docker-compose
做不到的。
docker-swam 可以启动容器、监听容器状态、保证容器的高可用,同时也保证服务间的负载均衡。
总结:docker-swarm
就是一个docker-compose
的升级版,支持多主机并增添和很多的多主机场景下的功能。
Kubernetes
简称k8s
,它的功能与docker-swarm
差不多,都是一个跨主机的容器管理平台,我们日常的运维开发,可以使用k8s
或者docker-swarm
。
他们之间的区别就是研发的公司不同。
docker-swarm
是docker
公司研发的k8s
是Google
公司根据自身的多年的运维经验研发的一款容器管理平台
总结:k8s
与docker-swarm
的功能差不多,主流比较推荐使用k8s
,毕竟是大公司研发的,但是使用docker-swarm
也是没问题的。
通过阅读本文,我们可以了解到:
- 容器化概念的产生经历了:物理机 -> 虚拟机 -> 容器化的发展;
- 容器化与云原生的关系:容器技术催生了云原生思潮,云原生生态推动了容器技术发展;
- 容器化技术的核心是
docker
,在docker
的基础上发展了容器管理平台 :单机版的docker-compose
-> 跨主机的docker-swarm
-> 跨主机的k8s
。
主要从一个浅层的角度去漫谈容器化技术的相关概念,从而让我们有一个感性的认知。接下来博主打算继续编写相关的实操文章,文章内容涉及docker
基础、docker-swarm
及k8s
的搭建与使用。
本文或许存在纰漏之处,欢迎大家留言指出并关注,本文完!