Docker是轻量级容器管理引擎,它的出现为软件开发和云计算平台之间建立了桥梁。
Docker将成为互联网应用开发领域最重要的平台级技术和标准。Docker的核心价值在于,它很有可能改变传统的软件交付方式和运行方式。
传统的交付源码或交付软件包的方式的最大的问题在于,软件运行期间所依赖的环境是无法控制并且不能标准化的。
而Docker将软件与其依赖的环境打包在一起,以镜像的方式进行交付,让软件运行在标准的环境中,这非常符合云计算的要求。
这种变革一旦为IT人员接受,可能会对产业链带来很大的冲击。我们熟悉的apt-get和yum是否会逐渐被docker pull取代呢?
以Docker为代表的容器技术是目前非常流行的一类技术,对虚拟化,云计算乃至软件开发流程都是革命性的影响。
Docker也可以被称为轻量级虚拟化技术。与传统的VM相比,它更轻量,启动速度更快,单台硬件上可以同时跑成千上百个容器,所以非常适合在业务高峰期通过启动大量容器进行横向扩展。
毫不夸张的说,Docker是革命性的,它重新定义了软件开发,测试,交付和部署的流程。我们交付的不再只是代码,配置文件,数据库定义等。而是整个应用程序运行环境:“操作系统+各种中间件+依赖库+应用程序代码”。
容器是直接运行在操作系统内核之上的用户空间。因此容器虚拟化也被称为操作系统虚拟化,容器技术可以让多个用户空间运行在同一台宿主机上。
容器只能运行与底层宿主机相同或者相似的操作系统。如Ubuntu上运行Centos,但无法运行Windows。
容器最常见的例子就是"权限隔离监牢"。它创建一个隔离的目录环境来运行进程,如果权限隔离监牢中正在运行的进程被入侵者攻破,入侵者便会发现自己"深陷监狱",因为权限不足被困在容器创建的目录中,无法对宿主机进行进一步的破坏。
尽管容器有着光辉的历史,但是始终并未受到广泛的认可。
- 容器技术的复杂性
- 不易安装
- 管理和自动化困难
Docker就是为了改变这一切而生。
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。基于Apache2.0开源授权协议发行。
Docker的特别之处在于它在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供了一个清量,快速的环境,能够运行开发者的程序,并方便高效的将程序从开发者的电脑部署到测试环境和生产环境。
上图为Docker提供的官方镜像,点击此处查看。
Docker的特点
- 简单轻量
- 开发测试环境一致性
- 快速高效,具备可移植性,易于构建,易于协作
- 适用于分布式架构
- Docker客户端和服务器
- Docker镜像
- Registry
- Docker容器
我们通过一个简单的示例来看看Docker。你可以在本教程之前安装docker,下文与将有相关教程。
docker run hello-world
Docker是一个客户-服务器架构的程序。此时我们使用的命令docker就可以认为是一个客户端,docker run hello-world
,即向docker公司服务端发出请求,并请求到了结果。Docker提供了一个命令行工具docker以及一整套RESTful API。
我们可以在同一台宿主机上运行docker,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker服务。
该示例中的hello-world就是一个镜像,保存镜像的组件叫Registry。它又分为公有和私有。Docker公司运营的公共Registry叫做Docker Hub。用户可以在Docker Hub上注册账号,把本地的镜像上传到Docker Hub,可以向别人分享你的镜像。
比如你的账号是 gocloudcoder,你发布的镜像名称是hello-world,当你构建完成之后,并发布到Docker Hub上。
其他人可以通过
docker run gocloudcoder/hello-world
来使用你的镜像服务,后面我们将完成这一小例子。
镜像是投建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的构建部分。镜像是基于联合文件系统的一种层式的结构,由一系列指令一步一步投建出来,这是属于Dockerfile的内容,后面将详细介绍。
我们可以认为,镜像是Docker生命周期中的构建和打包阶段,而容器则是启动或执行阶段。类似于maven,maven打包的过程就可以认为是打包镜像,打包完成之后的jar包执行就是容器。
官方提供了很多常用操作系统镜像,如ubuntu,centos等,也提供了很多常用的软件,如redis,mysql等。也提供了很多常用的运行环境,如go,jdk等。
我们可以基于这些镜像,运行自己的应用程序。
Docker应用场景:
- 加速本地开发和构建流程,使其更加高效,更加轻量化。本地开发人员可以构建,运行并分享Docker容器,容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境。这一过程保证了运行环境的唯一性。不用再去争论是开发还是测试的问题了。
- 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。即不论你使用ubuntu,debian,centos等,在Docker眼里都是一样的。让服务或应用程序运行在容器中,不论你的宿主机是什么都是无异的。
- 构建一个多用户的平台即服务基础措施(PaaS)。
- 为开发,测试提供一个轻量级的独立沙盒环境,或者将独立的沙盒环境用户技术教学,如Unix Shell的使用、编程语言教学。
- 提供软件即服务(SaaS)应用程序。
- 高性能,超大规模的宿主机部署。
基于Linux内核的命名空间(namespace),用于隔离文件系统,进程和网络。
- 文件系统隔离:每个容器都有自己的root文件系统
- 进程隔离:每个容器都运行在自己的进程环境中
- 网络隔离:容器间的虚拟网络接口和IP地址是分开的
- 资源隔离和分组:使用cgroups(即controll group,linux的内核特性之一)将CPU和内存之类的资源独立分配给每个Docker容器
- 写时复制:文件系统都是通过写时复制创建的,这意味着文件系统是分层的,快速的,而且占用的磁盘空间更小
- 日志:容器产生的STDOUT,STDERR和STDIN这些IO流都会被收集并记录到日志。
- 交互式shell:用户可以创建一个伪终端,将其连接到STDIN,为容器提供一个交互的shell