一、Docker是什么?
Docker最初是由dotCloud公司的创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并于2013年3月以Apache 2.0授权协议开源,主要项目代码在GitHub上进行维护。Docker项目后来还加入了了Linux基金会,并成立了推动开放容器联盟(OCI)。
Docker是一个开放源代码的软件项目,可以让应用程序部署在软件容器下的工作可以自动化的进行,借此在Linux操作系统上,提供了一个额外的软件抽象层以及操作系统层虚拟化的自动管理机制。Docker利用Linux核心中的资源分脱机制,例如(cgroup控制组,以及Namespace核心名称空间来独立的创建和限制软件容器的资源)。
Docker是世界领先的软件容器平台。开发人员可以利用Docker来消除协作编码时"在我机器上可以正常工作运行"的问题。运维人员可以利用Docker在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新的功能。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。Docker讲应用程序与该程序的依赖打包在一个文件里,可以实现一次创建到处运行;运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用再担心环境问题了。
总体来说,Docker的接口相当的简单,用户可以方便的创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改等操作,就想管理普通的代码一样便利。
二、Docker的优点
Docker极大的解决了环境配置的问题,真正的实现了"一次配置,到处运行"的效果。Docker在开发和运维的过程中,具有以下几个方面的优势:
1)更高效的资源利用。使用Docker容器不再需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)的支持,因为Docker它是内核级层面的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
2)更快速的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试人员和运维人员可以直接使用完全相同的环境来部署代码。
3)更轻松的迁移和扩展。Docker容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发型版本。
4)更简单的更新管理。创建Dockerfile文件,只需要根据Dockerfile的指令来基于基础镜像根据应用需求来修改和配置自己所需要的镜像,就可以替代以往大量的更新工作。并且所有的修改都以增量的方式被发布和更新出来,从而实现自动化并且高效的同期管理。
三、Docker VS VM
作为一种轻量级的虚拟化方式,Docker在运行应用上与传统的虚拟机方式相比较具有以下显著的优势:
1)Docker容器具有快速性,容器的创建、启动、停止、销毁都可以在秒级别实现,而传统的虚拟机方式需要数分钟才能完成;
2)Docker容器对系统主机的资源占用很少,一台主机上可以同时运行数千个Docker容器;
3)Docker通过类似于Git设计的理念的操作方便用户的获取、分发和更新应用镜像,存储复用,增量更新;
4)Docker通过Dockerfile支持灵活的自动化创建和部署机制,提供工作效率,使流程标准化。
四、Docker的架构与工作机制
Docker Engine是一个CS架构,主要有以下两个概念:
1)Docker daemon:Docker的守护进程,运行在宿主机上,用户通过Docker Client(Docker命令)与Docker daemon进程交互。
2)Docker Client:Docker的命令行工具,是用户使用Docker的主要方式,Docker Client与Docker daemon通信并将结果返回给用户,Docker Client也可以通过socket或者RESTful API来访问远程的Docker daemon进程。
了解了Docker的基本组成之后,再来了解一下Docker的核心概念:
1)Docker Image:Docker镜像类似于虚拟机的镜像,可以将它理解为是一个只读模板,镜像自身是只读的,容器从镜像启动的时候,会在镜像的最上层创建一个可写层。例如,一个镜像可以包含一个基本的操作系统环境,里面仅包含了Apache应用程序。镜像用来创建Container容器,一个镜像可以运行多个Container容器;镜像可以通过Dockerfile来创建,也可以从Docker Hub/Registry上去下载。在面向对象编程中镜像可以理解为是一个了类。
2)Docker Container:Docker类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行的实例,容器是一个隔离的环境,多个容器之间不会互相影响,保证容器中的程序运行在一个相对安全的环境中。(可以把容器看做是一个简易版的Linux系统环境,包括root用户权限、进程空间、用户空间和网络空间等,以及运行在其中的应用程序打包而成的盒子),在面向对象编程中容器可以理解为一个实例。
3)Docker Hub/Registry:共享和管理Docker镜像,用户可以上传和下载上面的公共镜像到本地。
五、Docker底层的技术依赖
Docker是使用Go语言编写的,它利用了Linux内核的几个核心技术来提供其功能。
1)Namespaces名称空间
Docker使用一种称为namespaces提供隔离工作空间的技术,这种技术称为容器,当你运行容器时,Docker会为改容器创建一组namespaces名称空间。这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,其访问权限只能是限于该名称空间。
Linux内核所提供的主要名称空间有:MountNamespaces:文件系统挂载点,每个容器能看到不同的文件系统层次结构。UTSNamespaces:nodename和domainname,每个容器可以有自己的hostname和domainame。IPCNamespaces:特定的进程间通信资源,包括System V IPC和POSIX message queues,每个容器都有其自己的System V IPC和POSIX消息队列文件系统,因此,只有在同一个IPC namespaces的进程之间的才能互相通信。PID namespaces:进程ID数字空间,每个PID namespace中的进程可以有其独立的PID,每个容器都有其PID为1的root进程,这也使得容器可以在不同的主机之间迁移,因为namespace中的进程ID和主机无关,所以容器中的每个进程都有两个PID:容器中的PID和host主机上的PID。Networknamespace:网络相关的系统资源,每个容器用有其独立的网络设备,IP地址,IP路由表,/porc/net目录,端口号等等,这也使得一个host上多个容器内的同一个应用都可以绑定到各自容器的80端口上。Usernamespaces:用户和组ID空间,在user namespaces中的进程和组ID可以和host主机上不同,每个容器可以有不同的user和group id;一个host上的非特权用户可以成为user namespace中的特权用户。
2)Control groups
Linux上的Docker Engine还依赖于另一种称为控制组(cgroups)的技术。cgroup将应用程序限制为特定的一组资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并可以选择强制执行限制和约束。例如,您可以限制容器的可用内存为多大。(用来分配资源,优先级设定、资源计量、资源控制)
3)Union file systems
联合文件系统或UnionFS是通过创建层来操作的文件系统,使它们非常轻量和快速。Docker Engine使用UnionFS为容器提供构建块。Docker Engine可以使用多种UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
4)Container format
Docker Engine将命名空间,控制组和UnionFS组合到一个称为容器格式的包装器中。默认的容器格式是libcontainer。将来,Docker可以通过与BSD Jails或Solaris Zones等技术集成来支持其他容器格式。