本文简要介绍Docker。
一、 Doceker概述
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker具有以下特点:
- 灵活:即使最复杂的应用程序也可以容器化。
- 轻量级:容器利用并共享主机内核,在系统资源方面比虚拟机更有效。
- 可移植:可以在本地构建,部署到云并在任何地方运行。
- 松散耦合:容器是高度自给自足并封装的容器,可以在不破坏其他容器的情况下更换或升级它们。
- 可扩展:可以在数据中心内增加并自动分发容器副本。
- 安全:容器将积极的约束和隔离应用于流程,而无需用户方面的任何配置。
二、 Docker平台
Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使我们可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在实际上是虚拟机的主机中运行Docker容器!
Docker提供了工具和平台来管理容器的生命周期:
- 使用容器开发应用程序及其支持组件。
- 容器成为分发和测试应用程序的单元。
- 准备就绪后,可以将应用程序作为容器或协调服务部署到生产环境中。无论生产环境是本地数据中心,云提供商还是两者的混合,其工作原理都相同。
三、 Docker引擎
Docker Engine 是具有以下主要组件的客户端-服务器应用程序:
- 服务器是一种长期运行的程序,称为守护程序进程(
dockerd
命令)。 - REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
- 命令行界面(CLI)客户端(
docker
命令)。
CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护程序或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。
守护进程创建和管理Docker对象,例如镜像(images),容器(containers),网络(networks)和卷(volumes)。
四、 Docker应用
1、 快速,一致地交付应用程序
Docker允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程。
- 开发人员在本地编写代码,并使用Docker容器与同事共享他们的工作。
- 他们使用Docker将其应用程序推送到测试环境中,并执行自动和手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中以进行测试和验证。
- 测试完成后,将修补程序推送给生产环境就像将更新的映像推送到生产环境一样简单。
2、 响应式部署和扩展
Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑上,数据中心中的物理或虚拟机上,云提供商上或混合环境中运行。
Docker的可移植性和轻量级的特性还使您可以轻松地动态管理工作负载,并根据业务需求指示实时扩展或拆除应用程序和服务。
3、 在同一硬件上运行更多工作负载
Docker轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行,经济高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。
Docker非常适合于高密度环境以及中小型部署,而您需要用更少的资源做更多的事情。
五、Docker架构
Docker使用客户端-服务器架构。Docker 客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
1、 Docker守护进程
Docker守护程序(dockerd
)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
2、 Docker客户端
Docker客户端(docker
)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。
3、 Docker仓库
Docker仓库存储Docker映像。Docker Hub是任何人都可以使用的公共仓库,并且默认情况下,Docker已配置为在Docker Hub上查找镜像。您甚至可以运行自己的私人仓库。如果使用Docker数据中心(DDC),则其中包括Docker可信仓库(DTR)。
使用docker pull
或docker run
命令时,所需的镜像将从配置的仓库中提取。使用该docker push
命令时,会将镜像推送到配置的仓库。
4、 Docker对象
使用Docker时,创建和使用镜像(images),容器(containers),网络(networks)和卷(volumes),插件(plugins)和其他对象(other objects)。
本节是其中一些对象的简要概述。
IMAGES
Docker把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。
image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Ubuntu的image基础上,往里面加入Apache服务器,形成你的image。
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
image文件是通用的,一台机器的image文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的image文件,而不是自己制作。即使要定制,也应该基于别人的image文件进行加工,而不是从零开始制作。
为了方便共享,image文件制作完成后,可以上传到网上的仓库。Docker的官方仓库 Docker Hub 是最重要、最常用的image仓库。
CONTAINERS
容器是镜像(image)的可运行实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件:image文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
$ docker run -i -t ubuntu /bin/bash
当运行此命令时,会发生以下情况(假设您使用的是默认仓库配置):
- 如果在本地没有该镜像,则Docker将从您配置的仓库中自动提取该镜像,就像已经手动运行
docker pull ubuntu
命令一样。 - Docker会创建一个新容器,就像已经手动运行
docker container create
命令一样。 - Docker将一个读写文件系统分配给容器,作为其最后一层。这允许运行中的容器在其本地文件系统中创建或修改文件和目录。
- Docker创建了一个网络接口以将容器连接到默认网络,因为您未指定任何网络选项。这包括为容器分配IP地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
- Docker启动容器并执行
/bin/bash
。由于容器是交互式运行的,并且已附加到终端(由于-i和-t 标志),因此可以在输出记录到终端时使用键盘提供输入。 - 当输入
exit
以终止/bin/bash
命令时,容器将停止但不会被删除。可以重新启动或删除它。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls -a
# 手动终止那些不会自动终止的容器
$ docker container kill [containID]
# 删除容器
$ docker container rm [containerID]
六、 底层技术
Docker使用Go语言编写,并利用Linux内核的多个功能来交付其功能。
Namespaces
Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组命名空间。
这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且对其的访问仅限于该命名空间。
Docker Engine在Linux上使用以下名称空间:
- The pid namespace:进程隔离(PID:进程ID)。
- The net namespace:管理网络接口(NET:网络)。
- The ipc namespace:管理访问IPC资源(IPC:进程间通信)。
- The mnt namespace:管理文件系统挂载点(MNT:Mount)。
- The uts namespace:隔离内核和版本标识符。(UTS:Unix时间共享系统)。
Control groups
Linux上的Docker引擎还依赖于另一种称为控制组 (cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。