引入
在Docker没有出现以前,我们开发了一款产品,开发和上线使用的是两套不同的环境。比如我们的项目需要依赖Java、Tomcat的环境,我们需要在服务器上进行配置,如果是分布式应用,那么每台服务器都需要配置。还可能出现在开发人员的电脑上能运行,到运维人员手中就出现问题,产生矛盾,那么我们能不能将项目带上安装环境一起打包呢?这样运维部署将变得十分方便。于是Docker就可以实现,在Docker中将带环境的项目打包在一起,叫做镜像。
Docker概述
Docker是一个开项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。Docker自开源后受到广范的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc。RedHat已经在其RHEL6.5中集中支持Docker;Google也在其PaaS产品中广泛应用。Docker的目标是实现经量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在LXC的基础上Docker进行了进一步的封装,让用户不需要关心容器的管理,使得操作更加简单。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
下图比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现的虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层现实现。
Docker设计思想
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。Docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。Docker就是集装箱。
1、不同的应用程序可能会有不同的应用环境,比如 .net 开发的网站和 php 开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如 IIS 和 Apache 访问端口冲突。这个时候你就要隔离. net 开发的网站和 php 开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。Docker 可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
2、你开发软件的时候用的是 Ubuntu ,但是运维管理的都是 CentOS ,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些 Ubuntu 转 CentOS 的问题,比如:有个特殊版本的数据库,只有 Ubuntu 支持,CentOS 不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有 Docker 你就可以把开发环境直接封装转移给运维,运维直接部署你给他的 Docker 就可以了。而且部署速度快。
3、在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,Docker 部署的话,这些内存就会利用起来。
Docker优点
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
传统虚拟机方式运行10 个不同的应用就要起10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。具体说来,Docker 在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快。容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
3、更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker局限性
1、Docker是基于Linux 64bit 的,无法在 32bit 的 Linux/Windows/Unix 环境下使用。
2、LXC是基于cgroup 等 linux kernel 功能的,因此 container 的 guest 系统只能是linux base的。
3、隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。
4、网络管理相对简单,主要是基于namespace 隔离。
5、cgroup 的 cpu 和 cpuset 提供的 cpu 功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)。
6、Docker 对 disk 的管理比较有限。
7、container 随着用户进程的停止而销毁,container 中的 log 等用户数据不便收集。
docker在开发/测试/部署中的定位
1、尝试新软件
对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于 Docker,让我们有可能在一条或者几条命令内就搭建完环境。Docker 有一个傻瓜化的获取软件的方法,Docker 后台会自动获得环境镜像并且运行环境。
并不仅仅是新技术环境搭建用得到 Docker。如果你想快速在你的笔记本上运行一个 MySQL 数据库,或者一个 Redis 消息队列,那么使用 Docker 便可以非常容易地做到。例如 Docker 只需要一条命令便可以运行 MySQL 数据库:docker run -d -p 3306:3306 tutum/mysql
。
2、进行演示
工作中自己开发的成果对客户或者别人做一两个演示。搭建演示环境的过程非常麻烦。Docker是演示这些工具的最合理的方式。同时,对于客户来说,可以直接将 Docker 镜像提供给他们,而不必去做任何环境配置的工作,工作的效果也会和在他们演示中所看到的一模一样,同时不必担心他们的环境配置会导致我们的产品无法运行。
3、避免”我机器上可以运行“
因为环境配置不同,很多人在开发中也会遇到这个情况(我的机器可以运行,你的机器不能),甚至开发的软件到了测试人员的机器上便不能运行。但这都不是重点。重点是,如果我们有一个可靠的、可分发的标准开发环境,那么我们的开发将不会像现在这么痛苦。Docker 便可以解决这个问题。Docker 镜像并不会因为环境的变化而不能运行,也不会在不同的电脑上有不同的运行结果。可以给测试人员提交含有应用的 Docker 镜像,这样便不再会发生“在我机器上是可以运行的”这种事情,很大程度上减轻了开发人员测试人员互相检查机器环境设置带来的时间成本。
4、更好地利用资源
虚拟机的粒度是“虚拟出的机器”,而 Docker 的粒度则是“被限制的应用”,相比较而言 Docker 的内存占用更少,更加轻量级。对我来说这是 Docker 的一个优势:因为在如果在电脑中运行多个 Docker 应用,使用 Docker 比使用虚拟机更加简单,方便,粒度更细,也能持续地跟踪容器状态。
5、为微服务定制
Docker 可以很好地和微服务(Microservices)结合起来。从概念上来说,一个微服务便是一个提供一整套应用程序的部分功能,Docker 便可以在开发、测试和部署过程中一直充当微服务的容器。甚至生产环境也可以在 Docker 中部署微服务。
6、在云服务提供商之间移植
大多数的云主机提供商已经全面支持 Docker。对于开发人员来说,这表示你可以很方便地切换云服务提供商,当然也可以很方便地将你本地的开发环境移动到云主机上,不需要本地上配置一次运行环境、在云主机上还配置一次运行环境。全面部署 Docker (Docker here and Docker there) 作为标准运行环境可以极大地减轻应用上线时的工作量和产生 BUG。
7、技术的创新
Docker 正在快速发展,工具也在不断更新,没有人能预见到未来 Docker 会是什么样子的。你在复杂的系统中 Docker 使用的越多,越是可能会发现技术上的空白和未来技术发展的方向。现在还处在 Docker 的发展期,任何你使用 Docker 创建的工具都有可能成为社区关注的热点。
Docker与虚拟机比较
Docker利用的是宿主机的内核,VM需要的是Guest OS。
虚拟机的缺点: 资源占用多、冗余步骤多、启动慢。
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker 有着比虚拟机更少的抽象层。由于 Docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 Docker 将会在效率上有明显优势。
Docker 利用的是宿主机的内核,而不需要 Guest OS。因此,当新建一个容器时,Docker 不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而 Docker 由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个 Docker 容器只需要几秒钟。
评论区