说docker必须要要说容器,所以我们需要首先来说一下容器的概念。
其实容器就是一工具,泛指可以容纳其他的物品工具,可以用来存储、运输物品;物品可以放在容器中的,而容器可以保护物品。
常见的容器:
瓶子
篮子
碗
集装箱
柜子
说容器,就必须对比容器和虚拟化技术,首先就说虚拟化技术。
我们实现虚拟化技术主要有两种
方式1:主机虚拟化
这里所虚拟化的是整个硬件平台,比如vmware、virtual box,他们所虚拟出来的是一个完整的裸机,我们可以再这个裸机上随意的安装os和软件。
主机虚拟化是分为两类的
l type-I(类型1的虚拟化)
l type-ii(类型2的虚拟化)
程序运行在虚拟机中,肯定比运行在物理机中性能差,那么为什么还要将其运行在虚拟机中?
复用:比如需要运行两个tomcat,让其工作在虚拟机中,就可以实现8080套接字不冲突了
隔离:一个进程在虚拟机中做任何操作,对于其他虚拟机中的进程和物理机中的进程都是没有影响的
那么我们怎么即实现隔离,又不影响性能呢?
一个主机在运行起来之后,分为内核空间和用户空间,在用户空间中就是运行用户空间进程。
默认所有的用户进程都是在同一个用户空间的,那么此时我们要想隔离多个进程的运行环境,就可以创建多个用户空间,而且多个用户空间是互相隔离的
这里一个一个性对独立的用户空间就是我们所谓的linux 容器。
使用容器,目的是为了创建一个隔离的环境,在这个隔离环境环境中,应该至少包括隔离如下几个层面
UTS:主机名和域名
Mount:工作目录,也称之为安装树
IPC:ipc是必须要进行隔离的,如果不隔离IPC,那么多个进程就可以互相通信,那么就不存在隔离了
PID:隔离PID也是必须的
user 和group:在容器中也要有独立的用户,比如都要有root ,但是这个root肯定不能都是真正的root,因为如果是真root用户的话,就有权限删除其他容器中的内容了。
network:隔离网络是最为重要的,因为一个容器作为一个独立的单元工作,那么就需要为每个容器准备一个网卡、接口、tcp/IP协议栈。
这里有个概念就是namespaces(名称空间)
linux的内核原生就支持了6种名称空间,在构建容器的时候,就是从这6个名称空间中抽取出来一部分构成一个容器。
各种名称空间与所支持的内核版本
从这里可以看到,如果想更好的使用容器技术,centos6就不适合了。
所谓的LXC,其实就是linux Container,这是一种基于模板的方式实现容器技术应用的解决方案 ,在LXC中包含了一组工具
lxc-create:快速创建容器的命令
其实docker就是lxc的二次封装发行版,他是用lxc作为容器引擎,同时使用镜像技术,将一个操作类型容器所需要的文件提取安装好,并打成一个包
当创建容器的时候,只需要将这个包复制N份并启动容器,这样就好了,速度很快。
当用docker创建容器的时候,其实就是用lxc create来创建一个容器。
docker极大的降低了容器的使用难度
用来存放镜像的服务器,我们称之为docker仓库,在这个仓库中有我们几乎能想到的全部的容器
docker使用了一种更为精巧的设计,那就是每个容器中仅仅运行一个进程。
比如在一个容器中仅仅运行nginx,如果要用apache,就需要下载另一个容器了,此时的nginx和apache就可会通过容器间的通信逻辑进行通信。
这里让每个进程运行在一个独立的容器中,而且我们也知道容器是一个隔离的环境,那么这样一来,一个进程出现了问题,对于其他的进程是不会受到影响的。
使用docker另个一好处:真正的实现的一次编写,到处运行了
现在我们的生成环境中,都是多版本并行的,如同时用着centos5 6 7,同时还用着windows、ubuntu等系统,如果这个时候要开发一个程序在所有的平台都能运行,这个时候往往是需要有好几个团队分别开发面向不同系统的版本。
而有了docker以后,就只需要开发一个版本,并将这个软件做到一个docker镜像中,这样只需要将这个镜像放到任意的平台上,只要这个平台有docker,那么就可以运行这个镜像,同时这个程序也就可以开始运行了,所以,软件开发的难度大大降低了。
再来说docker镜像的构建方式
docker镜像的构建方式是很特殊的,称之为:分层构建、联合挂载
以构建nginx镜像为例解释一下
先做一个最底层、纯净的系统,比如最小化的centos6系统
在这个centos系统的基础上安装一个nginx就构成了镜像
注意,构建的镜像只包含nginx本身,而不包含centos操作系统内容
这个镜像就包含了两层,这两层共同构成了运行在了linux上的centos
当启动容器的时候,需要将这两层都挂载上去就可以用了,这就是分层构建、联合挂载,
如果需要启动多个镜像,其中有nginx、tomcat、apache等,如都是基于centos的,所以在下载的时候,只需要下载一个centos,再分别下载需要层就可以了。
为何能实现多个上层应用公用底层系统?
是因为底层的centos和tomcat都是只读的。
当用户在所创建的容器中执行写操作的时候,底层是只读无法修改
所以,这个时候就会底层的资源复制一份上来,然后在复制的这层中进行修改,这种机制称之为:写时复制。
关于容器编排工具
比如我们有100个主机可以运行docker,当需要启动容器的时候,只需要编排工具发送指令,这个编排工具根据算法从后端的这几种找一个来启动docker
再比如,我们要运行amp的环境,这里三个程序就是三个容器,这三个容器的启动顺序是有关系的,所以就需要设置启动的顺序,这样编排工具还需要可以根据顺序依次启动。
编排有很多:
第一个:docker自己的编排工具:这里其实是三个工具的组合,machine+swarm+compose
第二个:ASF的,meos+marathon
第三个:google的,kubbernets,简称k8s,这是因为k和s间有8个字母
kvm:基于硬件虚拟化技术,是需要cpu支持的,是虚拟出来一个虚拟机,虚拟机管理器是需要占用额外的系统资源的,也就是即使不跑任何虚拟机,都需要占用6%左右的系统资源
docker:基于内核虚拟化技术,没有虚拟任何东西,但是是通过隔离技术实现的,所以不会对系统带来额外的开销。
真正的docker是不应该当做虚拟机用的(虽然可以)
整个架构分为了三个部分
l 1:客户端:cient
l 2:服务器端:docker_hosts
l 3:仓库端:registery
l 各个部分之间通信是基于http或者https进行通信的
docker_host部分
服务器端就是靠运行docker daemon来运行在守护进程模式的下的,此时的docker就会监听在一个套接字之上了,而且docker是支持三种套接字的
l ipv4套接字
l ipv6套接字
l unix socket套接字:也就是监听在一个本地文件上。
docker仓库
首先docker的registery中提供了docker镜像的存储功能,而且还提供了用户登录下载镜像时候的认证功能。
另外docker的registery中,还包括repository,一个repository就是一个目录,在一个目录中只存储一个应该程序的镜像,比如要创建的nginx的镜像,那么就创建一个目录,这个目录名就是nginx,所有的nginx的镜像都是放在同一个目录下。
因为现在有多个镜像,那么如果想唯一的标识一个镜像,就需要借助于 tag(标签),比如第一个1.9 1.11 1.23,这样通过repo名称和标签名的组合,就可以唯一的标识一个镜像。
docker官方提供有docker仓库,但是其实也有第三方提供的,而且也可以自己做docker仓库。
1.简化配置
工作中的环境有生产环境、测试环境、开发环境测试环境又分为功能测试、性能测试;生产环境又分为预生产环境和生成环境。
这么多的环境,环境不同,配置也就不同,如果配置不同,那么就可能会导致上线失败,使用docker就可以简化配置,做一个镜像,使用这个镜像就可以完成部署上线。
2.代码流水线管理
开发人员在开发完成以后,将代码传递到服务器上,然后测试人员可以从服务器上拉去代码进行测试,测试完成以后,开始进行发布,首先就是进行灰度发布,然后才是正事发布。
3.开发效率
新员工入职后配置各种环境,这个过程就往往是比较麻烦的,那么这里,我们就可以用docker做个容器轻松来实现。
4.应用隔离
各个应用之间互相是隔离的。
5.服务器整合
也就是说一个服务器可以跑多个容器实例
6.调试能力
处理bug的能力
7.多租户
8.快速部署
docker是秒级的,启动速度极其快。
比如之前说过,春晚的微信抢红包,用的是docker,说是可以1秒启动1000个docker程序。
大中型公司选择docker的理由
l 技术储备
l 跟上节奏,提升自身技术
l 符和当前业务需求
(目前普遍都是第二个,根本都不是第一个和第三个)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。