一、介绍
Docker是一个用GO语言编写的,用于开发、发布和运行应用程序的开放平台。Docker能够将应用程序和基础设施分离,使得可以快速交付软件。有了Docker,你可以像管理应用程序一样管理基础设施。通过利用Docker快速发布、测试和部署的特性,可以显著减少从编写代码到部署到生产环境的的时间。
二、Docker平台
Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的能力。隔离性和安全性可以使得同一个主机上同时运行多个容器。因为容器是轻量级的,所以它是不需要额外的hypervisor负载,而是直接在主机的内核里运行。这意味着可以在给定的硬件资源下运行比虚机更多的容器,甚至可以在虚机里运行Docker容器。
Docker提供了管理容器生命周期的工具和平台:
使用容器开发应用程序及其支持的组件
使用容器成为分发和测试应用程序的单元
将应用程序作为容器或编排的服务部署到生产环境中。
三、Docker引擎
Docker引擎是一个Client-Server的应用,包含以下组件:
Server:是一个一直运行的后台守护进程(dockerd)。
REST API:应用程序通过REST API与后台进程通信,执行相应的指令。
Client:客户端是一个命令行接口(docker)。
Docker CLI Client通过脚本或CLI命令通过REST API与Docker Server守护进程交互。Docker Server负责创建和管理Docker对象,如images,containers,networks和volumes。
四、Docker特性
1、应用程序的快速、一致性交付
开发人员通过在标准环境中使用容器来缩短开发周期,这些容器用来提供应用程序和服务。容器非常适合持续集成和持续交付(CI/CD)的场景。比如下面的这些场景:
开发人员在本地编写代码,使用Docker容器与其他同事进行分享。
使用Docker将应用程序推送到测试环境,并执行自动化和手动测试。
当开发人员发现bug时,可以在开发环境中修复它们,并重新部署到测试环境中进行测试和验证。
当测试完成后,将更新后的镜像推送到生产环境就可以修复用户问题。
2、灵活的部署和扩缩容
Docker这种基于容器的平台可以方便的移植,也可以运行在本地笔记本电脑、物理机和虚拟机等多种机器上。Docker的可移植和轻量级特性可以动态的进行管理,能够做到根据业务需求扩展和缩放应用程序和服务的副本,几乎是实时的。
3、硬件资源的充分利用
Docker轻巧快速,成为基于hypervisor的虚拟机的一个可行的、经济的替代方案。因此,可以在同等配置的机器算力下运行更多的服务来实现业务目标。
五、Docker架构
Docker使用Client-Server架构,Docker Client与Docker Server守护进程通信,Docker Server守护进程负责构建、运行和分发Docker容器。Docker Client和Docker Server可以运行在同一个系统上,也可以运行在不同的机器上。Docker Client和Docker Server守护进程通过一个REST API进行通信。
1、Docker守护进程
Docker守护进程(dockerd)监听Docker API请求和管理Docker对象,如images,containers,networks和volumes。Docker 守护进程也会与其他守护进程通信来管理Docker服务。
2、Docker客户端
Docker client是Docker用户与Docker交互的主要方式。当用户执行docker run命令时,客户端会发送这些命令给dockerd,dockerd来执行这些命令。docker的命令通过Docker API发送给dockerd。Docker client可以与多个守护进程进行通信。
3、Docker仓库
Docker仓库用来存储Docker镜像。Docker Hub是一个任何人都可以访问的公共镜像仓库。Docker默认情况下去Docker Hub里查找镜像。每个组织可以根据自己的情况搭建自己的私有仓库。当使用docker pull或docker run命令时,所需的镜像就会从配置得镜像仓库去拉取。当使用docker push时,镜像也会推送到配置得镜像仓库里。
4、Docker对象
当使用Docker时,会创建和使用images、containers、networks、volumes、plugins等对象,下面做个简单介绍:
镜像(IMAGES)
镜像是一个用于创建Docker容器的模板。通常情况下,一个镜像是基于另一个镜像,并带有一些额外的自定义内容。例如,你可以构建一个基于ubuntu镜像的镜像,但需要安装Apache Web Server和应用程序,以及应用程序运行所需的配置详细信息。
你可以创建自己的镜像,也可以使用他人创建并推送到镜像仓库里的镜像。要构建自己的镜像,需要创建一个Dockerfile文件,其中包含一些简单的语法,用于定义构建镜像以及运行镜像的步骤。Dockerfile中的每条指令都会在镜像中创建一层。当修改Dockerfile并重新构建时,只有被修改的层会
重新构建。与其他虚拟化技术相比,这是使得镜像如此轻量、体积小和快速的原因之一。
容器(CONTAINERS)
容器是镜像运行的一个实例,可以通过Docker CLI命令创建、启动、停止和删除一个容器。可以将一个容器连接到一个或多个网络,将存储附加到这个容器上,甚至可以基于当前容器的状态创建新的镜像。
默认情况下,一个容器会与其他容器及其主机隔离,你可以控制一个容器的网络、存储或
其他底层子系统与其他容器或主机的隔离程度。容器由镜像以及创建或启动时提供的配置选项定义的。当一个容器被删除时,任何没有存储到持久性存储里的变更都会消失。
以docker run这个命令为例:
下面的命令运行一个ubuntu的容器,以交互的方式连接到容器里的本地命令行会话,并运行/bin/bash。
$ docker run -i -t ubuntu /bin/bash
假设使用的是默认的镜像仓库配置,执行这个命令的步骤是:
1、如果本地没有ubuntu镜像,Docker会从镜像仓库拉取这个镜像,和手动执行docker pull ubuntu命令一样。
2、Docker创建了一个新的容器,和手动执行docker container create命令一样。
3、Docker为容器分配一个读写文件系统,作为容器的最后一层。这就允许正在运行的容器在本地文件系统中创建和修改文件和目录。
4、Docker创建一个网络接口,因为这里没有指定任何网络选项,比如为容器分配IP地址等,所以容器会连接到默认网络。默认情况下,容器可以使用主机网络连接到外部网络。
5、Docker启动容器并且执行/bin/bash。由于容器是以交互方式执行并连接到本地终端(-i -t参数),你可以使用本地的键盘输入信息以及在本地终端上看到日志。
6、当输入exit终止/bin/bash命令时,容器停止但不会被删除。
服务(SERVICES)
服务是可以跨多个Docker守护进程扩展容器,服务允许定义预期的状态,比如任意时刻服务副本的数量。默认情况下,服务的负载是通过集群node节点来做的,对消费者来说,Docker服务表现出来的就是一个单独的应用。
六、基础技术
Docker是用GO语言编写的,利用了Linux内核的一些特性来提供功能。
命名空间(Namespaces)
Docker利用了命名空间的技术来为容器提供独立的工作区域。当运行容器时,Docker会为这个容器创建一组命名空间。这些命名空间提供了一个隔离层,容器的每个方面都在一个单独的命名空间中运行并且其访问权限仅限于该命名空间。
Docker引擎使用如下的命名空间:
1、pid命名空间:进程隔离(PID:Process ID)
2、net命名空间:管理网络接口(NET:Networking)
3、ipc命名空间:管理对IPC资源的访问(IPC:InterProcess Communication)
4、mnt命名空间:管理文件挂载点(MNT:Mount)
5、uts命名空间:隔离内核和版本标识符(UTS:Unix Timesharing System)
控制组(Control groups)
Docker引擎还依赖于另一种称为控制组(cgroup)的技术。cgroup将应用程序限制为特定的资源集。控制组允许Docker引擎将可用的硬件资源共享给容器,并实施限制和约束。例如,限制特定容器的可用内存。
联合文件系统(Union file systems)
联合文件系统(UnionFS),是通过创建层来操作的文件系统,使得非常轻量级和快速。Docker引擎使用UnionFS为容器提供构建块。Docker引擎可以使用多个UnionFS变体,包括AUFS、btrfs、vfs和DeviceMapper。
容器格式(Container format)
Docker引擎将命名空间、控制组和UnionFS组合成一个容器格式的包装器,默认的容器格式是libcontainer。
七、总结
Docker的出现改变了软件的交付方式和部署、运维方式。随着基于Docker的云原生技术的不断发展,在未来,软件的交付会越来越便捷,交付速度也会越来越快,进而提升企业的市场竞争力。由于Docker本身的天然优势,替换虚机是大势所趋,云平台会成为像水和电一样的基础设施,DevOps也必然成为企业内部软件交付的中台能力。
翻译:Docker官网
欢迎关注交流“DevOps亮哥”