PREFACE
随着虚拟化云和容器技术的大力发展,将云和容器技术作为企业基础设施变得越来普遍。企业利用虚拟化技术实现规模的业务架构,不再关注物理硬件、硬件配置、CPU,内存和磁盘是不是够快是不是够大等诸如此列的问题,一切按照配置自动生成,自动横向扩展和收缩。随着应用程序开发的微服务的流行,应用程序变得越来越复杂,通过服务接口相互通信,应用容器化成了必然选择。尤其构建基于容器的开发测试演示环境成了必然选择。
1
容器概述
什么是容器
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
容器由两部分组成:
1、应用程序本身
2、依赖:比如应用程序需要的库或其他软件
如图1.1所示,容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。传统的虚拟化技术,比如VMWare, KVM, Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十GB)。
为什么需要容器
容器使软件具备了超强的可移植能力。今天开发人员通常使用多种服务(比如 MQ,Cache,DB)构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器,私有云和公有云,如图1.2所示。
一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题:
如何让每种服务能够在所有的部署环境中顺利运行?于是我们得到了下面这个矩阵,如图1.3所示:
各种服务和环境通过排列组合产生了一个大矩阵。开发人员在编写代码时需要考虑不同的运行环境,运维人员则需要为不同的服务和平台配置环境。对他们双方来说,这都是一项困难而艰巨的任务。
如何解决这个问题呢?聪明的技术人员从传统的运输行业找到了答案。几十年前,运输业面临着类似的问题。
如图1.4所示,每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装、卸货上,而且搬上搬下还容易损坏货物。
这同样也是一个NxM的矩阵,如图1.5所示。
幸运的是,集装箱的发明解决这个难题,如图1.6所示。
任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明。其实,“集装箱”和“容器”对应的英文单词都是“Container”。
容器是国内约定俗成的叫法,可能是因为容器比集装箱更抽象,更适合软件领域的原故吧,如图1.7。
容器的标准化
目前,Docker几乎是容器的代名词,很多人以为Docker就是容器。其实,这是错误的认识,除了Docker 还有CoreOS。所以,容器世界里并不是只有Docker一家。既然不是一家就很容易出现分歧。任何技术出现都需要一个标准来规范它,不然各搞各的很容易导致技术实现的碎片化,出现大量的冲突和冗余。因此,在2015年,由Google,Docker、CoreOS、IBM、微软、红帽等厂商联合发起的OCI(Open Container Initiative)组织成立了,并于2016年4月推出了第一个开放容器标准。标准主要包括runtime spec标准和image format spec标准。标准的推出,有助于替成长中市场带来稳定性,让企业能放心采用容器技术,用户在打包、部署应用程序后,可以自由选择不同的容器runtime;同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范来做。
runtime是容器真正运行的地方,runtime需要跟操作系统kernel紧密协作,为容器提供运行环境。目前主流的三种容器runitme有:lxc、runc、rkt。
Lxc是Linux上的老牌runtime。Docker最初也是使用lxc作为runtime。
Runc是Dockerr自己开发的容器runtime,符合OCI规范,也是现在Docker的默认runtime
rkt是CoreOS开发的容器runtime,符合OCI规范,因而能够运行Docker的容器。
2
Docker概述
什么是Docker
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使用户能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,用户可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的快速交付,测试和部署代码的方法,用户可以大大减少编写代码和在生产环境中运行代码之间的延迟。
开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux 和Windows Server应用发布新功能。
如图1.8所示,Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于 dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache 2.0授权协议开源,Docker是用Go编写,主要项目代码在GitHub上进行维护。
Docker的优势
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。
具体说来,Docker在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快,容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker架构结构
如图1.9所示,Docker使用了C/S体系架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过UNIX套接字或网络接口进行通信。
Docker核心组件包括五种:
1、Docker客户端:最常用的Docker客户端是docker命令。通过docker我们可以方便地在宿主机上构建和运行容器。除了docker命令行工具,用户也可以通过REST API与服务器通信。
2、Docker服务器:Docker daemon是服务器组件,以Linux后台服务的方式运行。Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。默认Docker daemon只能响应来自本地host的客户端请求。
3、Docker镜像:可以将Docker镜像看成只读模板,通过它可以创建Docker容器。
4、Docker容器:Docker容器就是Docker镜像的运行实例。用户可以通过CLI(docker)或是API启动、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
5、Registry:Registry是存放Docker镜像的仓库,Registry分私有和公有两种。
公有仓库:最大的公有仓库是官方提供的Docker Hub,其中存放着数量庞大的镜像供用户下载。国内如:腾讯云、阿里云也提供了仓库的本地源,可以提供稳定的国内访问。
私有仓库:用户不希望公开分享镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
3
Docker部署
版本选择
Docker官方提供2个版本,一个是Docker企业版Docker-EE,另外一个则是社区版Docker-CE。Docker-CE由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。Docker-EE收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障。通常情况下,Docker-CE足以满足我们的需求。
安装环境
了解了容器与Docker之后,接下来安装Docker,并创建一个容器。容器需要管理工具,runtime和操作系统,我们接下来的实验环境选择如下:
1、管理工具:docker-ce-20.10.17。
2、runtime:使用docker默认支持的runc。
3、操作系统:Centos7,目前在国内Centos用的较多。
开始安装
1、关闭防火墙和selinux,然后reboot重启。
2、将Centos的yum源修改为阿里源(该centos系统能够连接外网)。
3、添加Docker源,开始安装Docker。
4、启动Docker,并查看Docker版本。
5、配置镜像加速器(加速器需要自己在阿里源官网申请一个账号,工作台-容器镜像服务-镜像工具-镜像加速器)。