docker技术简介
翻译自docker官方文档,原文地址:https://docs.docker.com/engine/docker-overview/
Docker概述
docker是一个用于开发,传递和运行应用程序的开放平台。docker使你可以把应用和物理设施隔离开因此你可以快速传递应用。通过docker,你可以像管理应用一样管理你的物理设施。借助docker快速传递,测试和发布代码的能力,你可以显著地缩短写代码和代码运行在生产环境之间的时间。
Docker平台
docker让你可以把应用打包并运行在一个叫做”容器(container)”的松散隔离的环境中。这种隔离性和安全性让你能在一个宿主机中同时运行多个容器。容器是轻量级的,因为它们不需要额外加载管理程序(hypervisor),而是直接运行在宿主机内核中。这意味着相比于虚拟机,你可以在一个物理机上运行更多容器。你甚至可以在虚拟机中运行docker容器!
docker提供了工具和平台来管理你的容器的整个生命周期:
- 通过容器开发你的应用程序和支持组件。
- 容器是分发和测试你的应用的基本单元。
- 当你准备好的时候,把你的应用以容器或编排好的服务的形式部署到你的生产环境。不管你的生产环境是本地数据中心,云平台还是两者结合,这项工作都是一样的。
Docker引擎(Engine)
docker引擎是一个客户端-服务端架构的应用,它由以下主要组件构成:
- 一种长期运行的叫做守护进程(daemon process)的服务(dockerd命令)
- 一套REST型的API,它给程序提供了用来连接守护进程并给守护进程发送指示的接口
- 一套命令行用户接口(CLI)(docker命令)
命令行接口使用docker提供的REST型的API来控制或和docker守护进程交流,可以使用脚本或直接发送命令。很多其他docker应用会使用更底层API或命令行接口。
守护进程创建并管理docker对象,如镜像,容器,网络和数据卷等。
注意: docker遵循apache2.0开源协议
更多细节请参考下方docker架构。
我可以用docker做什么?
快速,持续地传递你的应用
docker可以加快开发的生命周期。通过包含了你的应用和服务的本地容器,来允许开发者在标准化环境中工作。容器能很好地适应持续集成/持续交付(CI/CD)工作流。
设想下面的流程:
- 开发者在本地写代码,并通过docker容器和同事共享他们的工作。
- 他们使用docker来把应用发布到测试环境然后自动运行并进行人工测试。
- 当开发者发现bug时,他们可以在开发环境修复它们并重新发布到测试环境来测试和验证。
- 当测试完成后,把修复的版本提供给用户就和把更新镜像发布到测试环境一样简单。
快速开发和扩展
docker的基于容器的平台允许应用的高可移植性。docker容器可以运行在开发者的本地电脑中,数据中心的物理或虚拟机中,云平台中或多种环境的混合场景。
docker的可移植和轻量级的特性还使得我们能根据业务需要近实时地很轻易地动态管理负载,扩展或下线应用和服务。
在同样的硬件上支持更多负载
docker是轻量级并快速的。它提供了基于管理程序(hypervisor-based)的虚拟机的一种切实可行的替代方案。因此你可以使用更多你的计算能力来进行你的业务逻辑(译者注:而不是用来运行虚拟机)。docker很适合于应用高密度的环境或需要在更少的资源上运行更多应用的中小型企业环境。
docker架构
docker是客户端/服务器式的架构。docker客户端和docker守护进程进行交互,守护进程负责构建,运行和发布你的docker容器等重活。docker客户端和服务端可以运行在同一系统中,或者你可以把一个客户端连上一个远程的docker守护进程。docker客户端和守护进程通信使用一套REST型的API,通过UNIX套接字(socket)或网络接口。
docker守护进程
docker守护进程(dockerd)负责监听dockerAPI的请求和管理docker对象,例如镜像,容器,网络和数据卷。一个守护进程还可以和其他守护进程通信来管理docker服务。
docker客户端
docker客户端(docker)是很多docker用户和docker通信的最主要的方式。当你运行例如docker run
之类的命令时,客户端把这些命令发送给dockerd,后者负责执行它们。docker命令使用dockerAPI。一个docker客户端可以同时和多个守护进程通信。
docker仓库(registry)
docker仓库(registry)保存了很多docker镜像。docker hub和docker cloud是任何人都能使用的公开的docker仓库,docker默认配置是从docker hub查找镜像。你甚至可以搭建自己的私有仓库。如果你使用 Docker Datacenter (DDC),它包含了docker信任的仓库( Docker Trusted Registry (DTR))。
当你运行docker pull
或docker run
命令时,需要的镜像会从你配置的仓库中拉取。当你运行docker push
命令时,你的镜像会被推送到你配置的仓库。
docker商店允许你买卖docker镜像或免费发布它们。比如,你可以从软件提供商处买一个包含他们的应用或服务的docker镜像,并使用这个镜像在你测试,临时和生产环境中发布应用。你可以通过拉取最新版本的镜像并重新部署容器来更新这个应用。
docker对象
当你使用docker时,你会创建并使用镜像,容器,网络,数据卷,插件和其他对象。本节是部分对象的概览。
镜像
镜像是个包含创建一个docker容器所需的步骤的只读模版。一个镜像通常基于另一个镜像,再增加一些额外的用户配置。比如,你可以构建一个基于ubuntu镜像,安装了apache web服务器和你自己的应用程序和运行程序所需的配置细节的新镜像。
你可以创建自己的镜像或直接使用其他人创建并发布到仓库的镜像。要构建自己的镜像,你要用一套简单的语法来创建一个Dockerfile文件,使用这套语法来定义创建镜像并运行它所需的步骤。Dockerfile中的每条指令都会在镜像中创建一层。当你修改Dockerfile并重新构建镜像时,只有有改变的层会被重构。这也是相比其他虚拟技术,镜像能如此轻量,小巧并快速的部分原因。
容器
容器是镜像的可运行实例。你可以通过dockerAPI或命令行接口(CLI)来创建,启动,移动或删除一个容器。你可以把一个容器连接到一个或多个网络,为它附加存储空间,甚至基于容器当前状态构建一个新镜像。
一个容器默认和其他容器和宿主机都很好地隔离了。你可以控制容器和其他容器和宿主机之间的网络,存储或其他底层子系统之间的隔离性。
容器状态被它的镜像和启动时你配置的参数决定。当一个容器被删除时,任何没有保存到持久化存储空间的状态改变都会消失。
举例:docker run 命令
下面的命令会启动一个ubuntu容器,借助你本地的命令行窗口进行交互,并运行/bin/bash
命令
$ docker run -i -t ubuntu /bin/bash
当你运行这条命令时,会一次发生下面的步骤(假设你使用默认的仓库配置):
- 如果你本地没有ubuntu镜像,docker会从你配置的仓库拉取(pull)该镜像,就像手动执行
docker pull ubuntu
一样 - docker创建一个新的容器,就像手动运行
docker create
命令一样 - docker给容器分配一个可读写的文件系统,作为它的最终层。这允许运行中的容器创建或修改它本地的文件和文件夹
- docker创建一个网络接口来把容器连到默认的网络上,因为你没有指定任何网络参数。这步包括给容器分配一个IP地址。默认的,容器可以通过宿主机的网络连到外部网络中。
- docker启动容器并运行
/bin/bash
命令。因为容器运行在交互模式并关联到你的终端(由于-i和-t标志),你可以用键盘输入而且输出会打印到你的终端上。 - 当你输入
exit
来终止/bin/bash
命令时,容器会停止但不会被删除,你可以再次启动它或删除它。
服务(services)
服务(Services)允许你在多个docker守护进程之间扩展容器,这些守护进程协同工作构成一个有多个管理者(manager)和工作者(worker)的集群(swarm)。集群的每个成员都是docker守护进程,进程之间通过dockerAPI通信。一个服务允许你定义你需要的配置,如一个服务在任意时刻必须可用的副本数量。默认的,服务会在所有工作节点中进行负载均衡。对用户来说,docker服务是一个单独的应用。在docker1.12及更高版本中的docker引擎支持集群模式。
底层技术
docker用go语言编写,并利用了一些Linux内核的特性来实现某些功能。
命名空间(Namespaces)
docker使用了一种叫做命名空间(namespaces)的技术来提供容器的隔离性。当你运行容器时,docker会为这个容器创建一些命名空间。
这些命名空间提供了一层隔离。容器的各部分都运行在一个单独的命名空间而且它对该命名空间的访问是受限的。
docker引擎使用Linux中下列的命名空间:
- pid namespace:进程间隔离(PID: Process ID,进程号)
- net namespace:管理网络接口(NET: Networking,网络)
- ipc namespace:管理IPC资源(IPC: InterProcess Communication,进程间通信)
- mnt namespace:管理文件系统挂载点(MNT: Mount,挂载)
- uts namespace:隔离内核和版本标示(UTS: Unix Timesharing System,UNIX分时系统)
控制组(Control groups)
在Linux系统中的docker引擎还依赖另一种技术,叫做control groups (cgroups)。一个cgroup限制了一个应用可以使用的一系列特定资源的额度。Control groups允许docker引擎把可用的硬件资源在容器间共享并可选的进行强制限制。比如,你可以限制特定容器的可用内存。
联合文件系统(Union file systems)
联合文件系统(Union file systems, UnionFS),是通过创建层来工作的文件系统,这使得它们很轻量并快速。docker引擎使用联合文件系统来为容器构建磁盘空间。docker引擎能使用多种UnionFS变种,包括AUFS, btrfs, vfs,和 DeviceMapper。
容器格式(container format)
docker引擎把命名空间,控制组和联合文件系统组合在一起,形成一个叫容器格式的集合体。默认的容器格式是libcontainer
。在未来,docker可能支持其他的容器格式,通过结合诸如BSD Jails 或 Solaris Zones之类的技术。
上一篇: 微博开放接口的使用
下一篇: js如何获取select标签选中的值