Docker简介
什么是docker
Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业)。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机VM额外的操作系统开销,提高资源利用率。
下面图比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复制本地主机的操作系统,而传统方式则是在硬件层面实现。
虚拟化与docker对比图
Docker与虚拟机的区别
简单解释,VMware运行在操作系统上,而docker是直接运行在应用上。所以docker无法提供一个像VMware那样完全的隔离,甚至到很多地方都没有进行隔离,比如说用户空间。
Docker的工作模式
Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。
用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者。
而Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;而后Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。而libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后,一个实际的Docker容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。
CLI交互模型
RemoteAPI交互模型
Docker的八种应用场景
1、简化配置,统一配置,通过镜像快速启动(Simplifying)
2、代码流水线管理,开发环境=>测试环境=>预生产环境=>灰度发布=>正式发布,docker在这里实现了快速迁移(Code Oioeline Management)
3、开发效率,对于开发人员有了镜像直接启动容器即可(Developer Productivity)
4、应用隔离、相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(Applsolation)
5、服务器整合,一台服务器跑多个docker容器,提高服务器的利用率(Server Consolidation)
6、调试能力,debug调试(Debugging Capabilties)
7、多租户,一个租户多个用户,类似于阿里云的一个project下多个用户(Multi-tenancy)
8、快速部署,不需要启动操作系统,实现秒级部署(Rapid Deplovment)
Docker的八种开发模式
1.共享基础容器
2.共享卷开发容器
3.开发工具容器
4.不同环境下测试容器
5.构建容器
6.安装容器
7.盒子中默认服务容器
8.基础设施/粘合剂容器
Docker中存在的问题
1.容器不同于虚拟机
2.容器不如虚拟机来得成熟
3.容器可以在几分之一秒内启动
4.容器已在大规模环境证明了自身的价值
5.IT人员称容器为轻量级
6.容器引发了安全问题
7.Docker已成为容器的代名词,但它不是唯一的提供者
8.容器能节省IT人力,加快更新
9.容器仍面临一些没有解决的问题
Docker带来的改变
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致
面向架构:自动化扩容(微服务)
Docker与虚拟化
类别 |
Docker |
OpenStack |
结论 |
部署难度 |
非常简单 |
组件多,部署复杂 |
因为平台是对已有的线上生产环境进行改造,必须选择侵入性较小的容器化技术 |
启动速度 |
秒级 |
分钟级 |
面对流量峰值,速度就是一切 |
执行性能 |
和物理系统几乎一致 |
VM会占用一些资源 |
微博核心业务对服务SLA要求非常苛刻 |
镜像体积 |
镜像是MB级别 |
虚拟机镜像是GB级别 |
当集群大规模部署时,体积小就代表更大的并发调度量 |
管理效率 |
管理简单 |
组件相互依赖,管理复杂 |
生产系统集群可控性是核心竞争力 |
隔离性 |
隔离性高 |
彻底隔离 |
|
可管理性能 |
单进程、不建议启动SSH |
完整的系统管理 |
|
网络连接 |
比较弱 |
借助Neutron可以灵活组建各类网络架构 |
|
Docker三大核心概念
Docker镜像(image)
Docker镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
镜像可以用来创建Docker容器。
Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
Docker容器(container)
Docker利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
Docker仓库(repository)
仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。
Docker的性质
Docker需要搭建自己的registry,专属自己的私有仓库。Docker容器其实是跑在操作系统上的一个进程,docker不是虚拟机。
Docker的配置文件
对于upstart的系统(Ubuntu14.10或以前的版本,Debian7或以前的版本),配置文件可能在
Ubuntu/Debian:/etc/default/docker
Centos/RHEL:/etc/sysconfig/docker
对于systemd的系统(Ubuntu 15.04及以后的版本,Debian 8及以后的版本,Centos/RHEL 7),配置文件在
/etc/systemd/system/multi-user.target.wants/docker.service