Docker技术知识分享(一)

今天和大家聊聊Docker, 最近云原生技术火热,我们今天就来聊聊云原生技术栈中比较核心的docker技术。

一,容器技术产生的背景

首先,在二千年左右的研发类项目中,笔者的经验是找一台服务器,或者windows,或者是linux,安装上对应版本的jvm,然后tomcat,然后各种配置,一通操作后就是部署系统。整体过程非常繁琐,而且大概率在自己电脑开发好好的放在客户的系统中就是不行,插件,网络限制,不一而就,导致部署会出现各种问题。总之,部署的操作会让程序员各种抓狂,有一个问题后就会考虑修复代码替换原有的class文件的方式进行功能发布,整个过程没有比较好的发部与版本控制。那么面对这一系列的问题,是不是有一种更好的解决方法?

二,生活中是否也有类似的场景?

答案是有的,在大航动时代,对于人类生活带来了翻天覆地的变化,在中国可以买到全世界各种好吃,好玩的商品,但是一开始就是这样的吗?行业的发展是首先有船运,基本的运输没有问题。在物资的量大了之后就会有一个问题:有进口肉类,有玩具,有的能压,不能压的,有钢铁,有石油运输,保存条件不一样,要求不一样,如何才能做到最优的运输规划?都整一船肉,可能没有么多,放肉和玩具,能摞一起?肉放上面,还是玩具放上面,怎么放冰块。放在箱子里面不一样,怎么放到船上之类的问题都会存在。

最终,聪明的人类发明了集装箱,英文叫container,通过制式的标准集装箱统一的货运标准,不论是肉类还是玩具,都放在统一大小的集装箱里,则可以方便吊装和运输。

类比应用发布的难点,实际有类似的问题,参照集装箱的原理,是否能有一个标准的应用部署单位,减少对于底层机器,操作系统等的依赖,又能做的应用间的隔离,答案是可以的。这就是计算机里的容器化技术。

三,容器的知识体系

我们既然需要学习就从容器的知识体系中,从简单的案例来逐步的理解基础知识,后续笔者将带大家一起玩转容器,以及生产、基于云平台的应用案例。欢迎大家一起学习交流。


四,容器docker相关的一些基础概念

结合第三章说到的一个知识内容,我们来从几每个脑图的分支快速了解容器相关的知识点。

4.1 容器核心技术

4.1.1 容器规范

首先是容器规范,容器之于底层运行环境,就好比集装箱之于货船。假设我们是货运公司的老板,我们可以定义自己公司的货物都用a*b*c见方的集装箱,但是这个是只解决了运输的船运的环节,往前看是运输的车辆是否可以支持?可以继续和车辆运输的公司去谈一下,或者自已旗下的公司,其它的公司怎么办?车辆解决了,港口的吊装机器是不是也可以支持这个尺寸?有一些生鲜仓库储存是不是是不是也可以使用这个尺寸。模拟想象一翻之后,好像只有自己公司玩也不行,需要有一个联盟大家讨论下使用一样的标准,才能有预期的效果。

同样对于计算机技术的容器,也有一样的规范体系,那就是几家大佬公司:docker, coreos, google等成立的oci(open container initiaitve)组织,成立主要的目的就是制定开放容器的规范。这里需要澄清一个概念:容器不等于docker, docker是容器技术的一种实现,其它的如coreos的rkt等也是容器技术的实现方式。

oci发布了两个规范: runtime spec 和 image format spec。 理解起来也比较简单,即:runtime定义在各家平台运行容器的规范,image则定义如何烧制镜像。这个词笔者比较有印象,在2000年-2015年左右,软件标准产品售卖的方式还是比较常见,即使500w左右的软件系统,本质上也是卖光盘的生意(当然光盘上的内容差别很大,有单机版的一些游戏,办公系统wps等,前段时间小米发布会上雷布斯90年代站店卖光盘也在这个范畴。也会有sap, mes,plm这些巨无霸企业应用,一个光盘或者授权卖几百万,笔者之前工作过的一家企业就是寄光盘给客户,然后一封邮件发license,然后收几十到百万块钱不等。)只不过容器把这个光盘的内容标准化上传到镜像的仓库repository,然后再分发。

4.1.2 容器runtime

runtime是容器运行的地方,这个层次与操作系统的内核需要紧密协作,操作系统的kernel为容器提供运行环境。又来类比下大家熟悉的知识背景:好比jvm之于java, 一个helloworld java程序相当于容器,容器运行在runtime上,类似于helloworld程序运行在jvm上,jvm的跨平台兼容性让java运行在亿级终端设备上。而runtime则让容器能运行在不同的操作系统之上。目前有几家主流的runtime厂家与产品:

lxc是linux上的老牌容器的runtime,最早docker使用的就是这个runtime.

runc是docker自己开发的runtime,符合oci的规范,也是当前docker默认的runtime.

rkt是coreos开发的容器runtime,符合oci规范,因而也能运行docker的容器。

4.1.3 容器管理工具

容器光运行起来还需要配套的管理工具,使得用户运行命令能够进行管控,即提供相互的交互界面,类似于cli等。对于java则是除了jvm也需要命令来运行起停、配置。

lxd是lxc对应的管理工具

runc则使用docker engine进行管理,包含后台的daemon和cli两个部分,我们通常意义上说的docker指的是docker engine。

rkt对应的管理工具是rkt cli。

4.1.4 容器定义工具

容器定义工具是允许用户定义容器的内容与配置属性,通过定义工具使得容器能够被保存、共享和重建。

docker image是docker的容器模版,runtime则是基于docker模版创建容器。

dockerfile是包含命令的配置文件,通过这些命令能创建出docker image.

aci(app container image)与docker image类似,它是由coreos开发的rkt容器image格式。

4.1.5 Registry

统一存放镜像的仓库即registry. 企业可以使用docker registry构建私有的registry,或者使用云平台提供的paas能力。

公共的资源能力有:docker hub( https:// hub.docker.com ) 里面有一些现成的镜像可以使用。或者quay.io (https://quay.io/)与docker hub类似,提供公网的镜像管理服务。

4.1.6 容器os

虽然主流的操作系统均能运行容器的runtime,例如,mac, linux或者windows等,运行效率更高的容器os也逐步问世。

容器os简而言之就是专门运行容器的操作系统,通常比通用操作系统体积更小,运行容器的效率更快。

目前比较主流的容器os有:coreos, atomic 和 ubuntu core等。

4.2 容器平台技术

容器的核心技术是解决容器在单个主机上运行,平台技术则允许容器在分布式的互不环境中运行。容器平台技术包括容器编排引擎、容器管控平台和基于容器paas等。

4.2.1 容器编排引擎

容器一般用于部署微服务应用,对于分布式的容器平台也是一样有多种用于管理容的组件,让应用层更好的与容器进行交互,提供统一的api服务供外部调用。此处我们定义的编排(orchestration),通常包含容器管理、调度、集群的定义和服务发现等。通过容器编排引擎,容器被整合成微服务系统、实现上层应用系统的需求。后续文章在介绍k8s等容器平台的时候,会具体介绍每一个组件的功能与作用。市场上主要使用的编排引擎:

docker swarm是docker开发的容器编排引擎

kubernetes是google主导开发的容器编排引擎,前期由google内部使用,后续开放给开源社区,目前已成本最广泛使用的容器编排引擎之一。可以同时支持docker和coreos容器。

mesos是一个通用的资源调度平台,mesos和marathon一起提供容器编排引擎功能。

4.2.2 容器管理理台

容器管理平台是架构在容器编排引擎之上的更为通用的平台。通常管理平台能够支持多种常用的编排引擎,抽象容器引擎的底层实现细节,为用户提供方便的功能,例如:application catalog和一键应用部署等能力。rancher和containership是市场上比较常用的容器管理平台;

4.2.3 基于容器的paas

基于容器的paas为微服务应用开发人员和团队提供了开发、部署和管理应用的平台,使用开发减少对于底层基础设施的关注而更加关注应用的开发。开源的典型代表有deis、flynn和dokku。

4.3 容器支持技术

4.3.1 容器网络

容器的应用使得网络拓扑变得更加动态和复杂,例如:传统应该部署都是具体的机器分配ip地址,在某一台机器上部署好后基础设施层大概率不会有太大的变化,容器则通过扩容、缩容、调度等操作始终处于动态变化的状态,相较于传统的基础设施会有更高频的变化。

常见的网络选型有:docker network 是docker原生的网络解决方案。还有其它三方常用的解决方案如:flannel、weave和calico。

4.3.2 服务发现

微服务应用的一大特点就是动态变化,容器的宿主机的变化,随着请求量的提升,由一个容器扩展为多个容器里,相应的ip地址,端口可能会发生相应的变化,这时候就需要服务发现的技术来管理: 容器提供的服务。服务发现需要保存容器集群中所有的微服务最新的信息,例如:ip地址和端口,对外提供的api提供查询功能等。

etcd、consul和zookeeper都是服务发现典型的解决方案。

4.3.3 监控

监控对于基础设施的稳定运行非常重要,特别是对于动态调整相对频次比较高的微服务应用会带来更多的挑战。在容器的环境中、涌现出很多比较好的监控工具。例如:docker ps/top/stats是docker原生的命令行监控工具。除了命令行,docker提供了stats api, 用户可以通过http请求获取容器的状态信息。

sysdig、cadvisor、heapster和weave scope是比较常见的开源监控方案。

4.4.4 数据管理

容器会在不同的主机之前进行调度,如何保持数据的持久化动态管理,则需要数据管理工具如: rex-ray提供的功能。

4.4.5 日志管理

日志管理作为问题排查和事件管理提供了重要依据,目前日志工具分为两磁:docker logs和logspout。

docker logs是docker的原生日志工具,而logspout则对日志提供了路由功能,可以收集不同容器的日志并转发给其它工具进行后处理。

4.4.6 安全性

对于年轻的容器技术,其安全性一直是企业应用比较关注的焦点。openscap能够对容器镜像进行扫描,发现潜在漏洞。当然主流云平台工具也会有相应的镜像扫描能力,在具体的内容章节再进一步展开说明。

五,运行第一个容器

mac上使用的示例, 进入下载页面:

https://www.docker.com/products/docker-desktop/

docker run -d -p 80:80 httpd

运行容器:


打开浏览器查看运行效果:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容