说docker必需要要说容器,因此咱们须要首先来讲一下容器的概念。linux
其实容器就是一工具,泛指能够容纳其余的物品工具,能够用来存储、运输物品;物品能够放在容器中的,而容器能够保护物品。nginx
常见的容器:算法
瓶子docker
篮子apache
碗ubuntu
集装箱windows
柜子后端
说容器,就必须对比容器和虚拟化技术,首先就说虚拟化技术。centos
咱们实现虚拟化技术主要有两种tomcat
方式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 符和当前业务需求
(目前广泛都是第二个,根本都不是第一个和第三个)