概述
Docker是一个用于开发、发布和运行应用程序的开放平台。Docker能够将应用程序与基础设施分离开来,以便快速交付软件。使用Docker,可以与管理应用程序相同的方式管理基础设施。通过利用Docker快速发布、测试和部署代码的方法,可以显著减少编写代码和在生产环境中运行代码之间的延迟。
Docker能干什么
- 快速、一致地交付应用程序
Docker简化了开发生命周期,允许开发人员在标准化的环境中使用本地容器来提供应用程序和服务。容器对于持续集成和持续交付(CI/CD)工作流非常有用
- 响应式部署和扩展
Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以运行在开发人员的本地笔记本电脑、数据中心的物理机或虚拟机、云提供商或混合环境中。
Docker的可移植性和轻量级特性也使得它可以很容易地动态管理工作负载,并根据业务需求几乎实时地扩展或拆除应用程序和服务。 - 在相同的硬件上运行更多的工作负载
Docker是轻量级和快速的。它为基于管理程序的虚拟机提供了一种可行的、经济有效的替代方案,因此您可以使用更多的计算能力来实现业务目标。Docker非常适合高密度环境和中小型部署,在这些环境中,你需要用更少的资源做更多的事情。
Docker架构
Docker使用C/S架构(client-server架构),其中C端是Docker客户端(Docker client),S端是Docker服务端(Docker server,又叫Docker daemon,译为Docker守护进程),Docker客户端和Docker守护进程使用REST API
方式通过UNIX套接字或网络接口进行通信。Docker客户端和Docker守护进程可以运行在同一个系统上,或者可以将一个Docker客户端连接到一个远程Docker守护进程。
- Docker daemon
Docker daemon(dockerd
)监听Docker API请求,管理Docker对象,如images(镜像)、containers(容器)、networks(网络)和volumes(卷)。一个守护进程也可以与其他守护进程通信来管理Docker服务。 - Docker client
Docker客户端(docker
)是许多Docker用户与Docker交互的主要方式。当使用诸如docker run
之类的命令时,客户端将这些命令发送给dockerd,由dockerd执行这些命令。docker命令使用docker API。Docker客户端可以与多个守护进程通信。 - Docker registries
Docker注册表存储Docker镜像。Docker Hub是一个任何人都可以使用的公共注册表,Docker默认配置为在Docker Hub上查找镜像。甚至可以运行自己的私有注册表。
当使用docker pull
或docker run
命令时,将从配置的注册表中提取所需的镜像。当使用docker push
命令时,镜像将被推送到已配置的注册表中。
Docker 对象
- 镜像(Images)
镜像是一个只读模板,包含创建Docker容器的说明。通常,一个镜像是基于另一个镜像,并进行一些额外的定制。例如,构建一个基于ubuntu镜像的镜像,在这个镜像中安装Apache web服务器和应用程序,以及运行应用程序所需的配置细节。可以自己创建镜像,也可以只使用其他人创建的并在注册表中发布的镜像。要构建自己的镜像,需要使用简单的语法创建一个Dockerfile,用于定义创建镜像和运行镜像所需的步骤。Dockerfile中的每条指令在镜像中创建一个层。当更改Dockerfile并重新构建镜像时,只会重新构建那些已更改的层。与其他虚拟化技术相比,这是使镜像如此轻量级、小型和快速的部分原因。
简单理解下,镜像就是一个只读模板
,模板内容就是运行镜像步骤
(相当于安装程序步骤)。 - 容器(Containers)
容器是镜像的可运行实例。使用Docker API或CLI创建、启动、停止、移动或删除容器。可以将容器连接到一个或多个网络,为其附加存储,甚至根据其当前状态创建新镜像。
默认情况下,容器与其他容器及其主机相对隔离。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
容器由它的镜像以及在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,任何不存储在持久存储中的对其状态的更改都会消失。
底层技术
Docker是用Go编程语言编写的,并利用了Linux内核的几个特性来交付其功能。Docker使用名为namespaces
的技术来提供名为容器的独立工作区。当您运行一个容器时,Docker会为该容器创建一组namespaces
。
这些namespaces
提供了一个隔离层。容器的每个方面都运行在一个单独的名称空间中,它的访问仅限于该名称空间。