1.1. Docker介绍
Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker在操作系统层实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
Docker运行结构
Docker是一个C/S结构的项目,有Docker Client、RESTAPI、Docker Server组成。
Docker Client:Docker客户端命令工具。
REST API:提供标准的RESTful接口。
Docker Server::Docker daemon的主要组成部分,接收用户从Docker Client调用REST API发送过来的请求。
Docker 包括三个基本概念:
镜像(Image)
容器(Container)
仓库(Repository)
Docker镜像
Docker 镜像就是一个只读的模板。你可以拿KVM虚拟机镜像来对比理解。
例如:一个镜像可以包含一个完整的CentOS操作系统运行(注意不包含内核),里面仅安装了Nginx或用户需要的其它应用程序。
镜像可以用来创建Docker容器。就像你使用创建好的镜像直接启动一个虚拟机一样。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
小提示:为什么在CentOS的宿主机上可以运行一个Ubuntu的Docker容器?因为Docker镜像里面只是包含了容器运行时的文件、库文件等,并不包含Kernel,统一使用宿主机的Linux内核。
Docker容器
Docker利用容器来运行应用,就像你运行一个KVM虚拟机一样。容器就是从镜像创建的运行实例,就像我们上面提到了虚拟机实例一样。它可以被启动、开始、停止、删除。每个容器都是相互独立的、隔离的个体。但其实没有虚拟机隔离的那么彻底,这个我们后面再说。
你可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker仓库
Docker仓库是集中存放镜像文件的场所。就像OpenStack的Glance服务,仓库分为公开仓库(Public)和私有仓库(Private)两种形式。这个有点像Git代码托管,你可以把代码放在GitHub上并公开,也可是使用Gitlab创建一个私有的代码托管平台。
Docker最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载,后面你也可以创建自己的镜像分享到Docker Hub中。
同时你可以创建自己的镜像托管平台,Docker有一个叫做Registry的组件,使用Docker Registry可以启动一个私有的镜像托管平台,这个平台可以存放多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
有时候我们会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分,实际上不严谨的,不过也不用太纠结这些名词,可以根据上下文来理解。
当用户创建了自己的镜像之后就可以使用docker push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上docker pull下来就可以了。是的,没错,就像你操作Git那样。
1.1.1. Docker与虚拟化
Docker是一种容器技术,它和虚拟化是有区别,就像下图所示:
可以看到Docker的容器并不需要运行一个Hypervisor。直接是Docker Engine来管理容器,减少了Hypervisor的开销,但是由于Docker容器并不是一个虚拟机,所以也无法提供像虚拟机一样的完全的资源隔离,还有很多隔离层面的问题。所以如果你的业务要求完全的资源隔离,可能Docker并不是一个好的选择。例如我们之前支付业务,需要在物理机上插入U Key,在虚拟机的情况下可以通过USB重定向来实现,但是Docker却并不支持。
所有的技术都有它适用的场景,只有深入了解Docker,我们才能发挥它的作用,提高工作效率。
1.1.2. Docker与OpenStack对比
在Docker还没有普及之前,云计算、OpenStack等流行的技术铺面而来。严格来说Docker不应该和OpenStack做对比,他们没有在一个层级上,和KVM比会更好一些。
类别 | Docker | OpenStack/KVM |
---|---|---|
部署难度 | 非常简单 | 组件多,部署复杂 |
启动速度 | 秒级 | 分钟级 |
执行性能 | 和物理系统几乎一致 | VM会占用一些资源 |
镜像体积 | 镜像是MB级别 | 虚拟机镜像GB级别 |
管理效率 | 管理简单 | 组件相互依赖,管理复杂 |
隔离性 | 隔离性高 | 彻底隔离 |
可管理性 | 单进程、不建议启动SSH | 完整的系统管理 |
网络连接 | 比较弱 | 借助Neutron可以灵活组件各类网络架构 |
1.1.3. Docker改变了什么?
我觉得Docker在不同的层面都改变了我的工作方式:
面向产品
增加了产品交付模式。在产品交付方面,之前做产品交付我们都是交付的软件包、安装操作文档等,需要用户进行部署。而现在可以直接交付Docker镜像,直接启动就可以访问。例如现在很多开源的项目都提供了Docker镜像或者Dockerfile,对于只想尝试一下的人员来说,再也不用进行繁琐的安装步骤了,而且往往部署成功后,发现并不能满足我们的要求。
面向开发
简化了开发环境配置。公司每次有开发入职,当天除了办手续就是准备开发环境了。如果使用Docker,我们可以给不同项目,构建不同的Docker镜像。开发入职后,就可以快速的进入开发工作。而且这个镜像一次构建,可以在开发、测试、预生产、生产都可以使用。
面向测试
Docker实现了多版本测试。之前我公司测试团队,如果想测试一个项目的不同分支,由于测试环境的局限性大家要排队,串行的进行测试。测试人员A再使用某个项目的测试环境时,其它人要排队。现在每个测试人员都可以创建不同分支的Docker容器。让测试团队可以并行测试。
面向运维
解决环境一致性、实现运行环境回滚。我们也不需要使用SaltStack进行配置管理了。做好一个Docker镜像之后,开发、测试、生产都用一套运行环境,只是上面的代码不同。当然这个虚拟机也可以实现,但是不够敏捷。而且在生产代码部署的时候,以Docker容器为单位进行发布。如果要进行回滚,直接把上一个版本的Docker容器启动即可。
面向架构
SOA服务部署、微服务部署、自动化扩容。之前我们做SOA、微服务的时候最多以虚拟机为单位进行管理。但是现在启动一个Docker容器要远远快速启动一个KVM虚拟机。而且不需要太复杂的操作步骤,你就可以在一个新的服务器上安装上Docker,并下载镜像,启动容器。