一、 简介
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。Docker在虚拟化的容器执
行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。Docker极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的Linux内核和二进制文件最小限的宿主机。
大多数Docker容器只需不到一秒钟即可启动,由于去除了管理程序的开销,Docker容器拥有
很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。
二、 Docker组件
Docker客户端和服务器、Docker镜像、Registry、Docker容器
2.1 Docker客户端和服务器
Docker是一个客户-服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护
进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker提供了一个命令行
工具docker,可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
2.2 Docker镜像
Docker镜像是一个只读的模板。例如,一个镜像可以包含安装了Apache Web服务应用的
Ubuntu操作系统。镜像可以用来创建Docker容器。Docker提供了构建新镜像或升级原有镜
像的较为便利的方式,或者你也可以下载别人已经创建好的镜像。Docker镜像是Docker的
构建组件。
镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周
期中的“构建”部分。镜像是基于联合文件系统的一种层式的结构。由一系列指令一步一步构建出来。例如:添加一个文件,执行一个命令,打开一个端口。
也可以把镜像当做容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。
2.3 Registry
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker 仓库分为公有和私
有。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部
分。
Docker Hub 是一个用于分享、管理 Docker 容器的 Docker SaaS 平台。由Docker公司负责维护的公共注册中心,包含超过15,000个可用来下载和构建容器的镜像,并提供认证、工作
组结构、工作流工具(比如webhooks)、构建触发器以及私有工具。
2.4 Docker容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。
每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分
三、 Docker作用
1、 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以创建、运行并分享Dokcer容器。容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境。
2、 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署中尤其实用。
3、 用Docker创建隔离的环境进行测试。例如,用Jenkins这样的持续集成工具启动一个用于测试的容器。
4、 构建一个多用户的平台即服务基础设施。Docker能够作为云计算的多租户容器,使用
Docker能容易为每个租户创建运行应该多个实例,这得益其灵活的快速环境以及有效diff
命令。
5、 高性能、超大规模的宿主机部署。
6、 Docker通过创建进程的容器,不必重新启动操作系统,几秒内能关闭,你可以在数据中心创建或销毁资源,不用担心额外消耗。典型的数据中心利用率是30%,通过更积极的资源
分配,以低成本方式对一个新的实例实现一个更聚合的资源分配,我们很容易超过这个
利用率,大大提高数据中心的利用效率。
四、 命名空间
命名空间是Linux内核为实现容器虚拟化而引入的特性。每个容器都有自己的命名空间,这保证了容器之间的互不影响。利用该特性,容器实现了在内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等资源的隔离,而不再是应用进程直接共享的状态。
1、进程命名空间
Linux通过命名空间管理进程号,同一进程在不同的命名空间中的进程号是不同的。进程命名空间是一个父子关系的结构,子空间的进程可看到父进程的ID。
2、网络命名空间
通过网络命名空间可以实现网络的完全隔离。一个网络命名空间为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口、IPv4和IPv6协议栈、IP路由表、防火墙规则、sockets等。Docker可采用虚拟网络设备(Virtual Network Device)的方式将不同命名空间的网络设备连接在一起。默认情况下,容器的虚拟网卡将与宿主机的docker0网桥连接在一起。
3、IPC命名空间
进程间交互(Interprocess Communication - IPC)的信息包括信号量、消息队列、共享内存等。同一IPC命名空间的进程可以交互;否则不行。PID命名空间和IPC命名空间可以组合使用。
4、挂载命名空间
挂载命名空间可以将一个进程放到一个特定的目录执行,且允许不同命名空间的进程看到的文件结构不同,将各个命名空间中的进程看到的文件目录隔离。
5、UTS命名空间
UTS(UNIX Time-sharing System)命名空间可以另每个容器拥有独立的主机名和域名,从而虚拟出一个拥有独立主机名和独立网络空间的环境。默认情况下,Docker容器的主机名就是容器的ID。
6、用户命名空间
每个容器拥有不同的用户和组ID,容器可以使用自身内部的特定用户执行程序,而非宿主机系统上存在的用户。每个容器内部都可以有root账号,且跟宿主机不在同一命名空间。