Docker 概述
Docker 是一个用于开发、交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的快速交付、测试和部署代码的方法,您可以显着减少编写代码和在生产中运行代码之间的延迟。
Docker可以做什么?
快速,一致地交付您的应用程序
Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付 (CI/CD) 工作流。
场景:
- 您的开发人员在本地编写代码并使用 Docker 容器与同事共享他们的工作。
- 他们使用 Docker 将他们的应用程序推送到测试环境中并执行自动化和手动测试。
- 当开发者发现 bug 时,他们可以在开发环境中进行修复,并重新部署到测试环境中进行测试和验证。
- 测试完成后,为客户提供修复就像将更新的映像推送到生产环境一样简单。
响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker 架构
Docker 使用客户端(client)-服务器(server)架构。Docker 客户端 与 Docker 守护进程(deamon) 通信,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
守护进程(Docker Daemon)
Docker 守护进程 ( dockerd) 监听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
客户端(Docker client)
Docker 客户端 ( docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如docker run 之类的命令时,客户端会将这些命令发送到dockerd,从而执行它们。该docker命令使用 Docker API。Docker 客户端可以与多个守护进程通信。
仓库或注册表(Docker registries)
Docker 注册表用于存储 Docker 镜像。Docker Hub 是一个任何人都可以使用的公共注册中心,Docker 默认配置为在 Docker Hub 上查找镜像。您甚至可以运行自己的私有注册表。
当您使用docker pull或docker run命令时,所需的映像将从您配置的注册表中提取。当您使用该docker push命令时,您的映像会被推送到您配置的注册表中。
镜像(Docker Images)
一个Image是用来创建容器的一个模板。通常,一份Image基于另一个容器,并带有一些额外的自定义。例如,可以构建一个ubuntu镜像。
您可以自己创建自己的Image,也可以使用其他人创建并发布的Image。构建镜像,需要使用Dockerfile,用于定义创建和运行镜像所需的步骤。Dockerfile 中每条指定都会在Image中创建一个层,当您更改Dockerfile并重建Image时,只会重建那些已经更改的层。所以与其他的虚拟化技术相比,这才是轻巧、快速的部分原因。
容器(Docker Containers)
容器是镜像的运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,为其添加存储,甚至可以根据其当前转台创建新的镜像。
默认情况下,容器与期同期及其主机相对隔离。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。
容器有镜像以及您再创建或启动它的时候提供给它任何配置选型。当容器被移除时,没有持久化的最后都会消失。
示例docker run命令
以下命令运行一个ubuntu容器,以交互方式附加到您的本地命令行会话,并运行/bin/bash
$ docker run -i -t ubuntu /bin/bash
运行此命令时,会发生以下情况(假设您使用的是默认注册表配置):
- 如果您在
ubuntu本地没有该镜像,Docker会从您配置的仓库中提取它,就像您docker pull ubuntu手动运行一样。 Docker会创建一个新容器,就像您docker container create手动运行命令一样。Docker为容器分配一个读写文件系统,作为它的最后一层。这允许正在运行的容器在其本地文件系统中创建或修改文件和目录。Docker创建一个网络接口来将容器连接到默认网络,因为您没有指定任何网络选项。这包括为容器分配IP地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。Docker启动容器并执行/bin/bash. 由于容器以交互方式运行并附加到您的终端(由于-i和-t标志),您可以在输出记录到终端时使用键盘提供输入。- 当您键入
exit以终止/bin/bash命令时,容器会停止但不会被移除。您可以重新启动或删除它。
底层技术
Docker 是用 Go 编程语言编写的,并利用 Linux 内核的几个特性来提供其功能。Docker 使用一种namespaces称为 容器 的技术来提供隔离的工作空间。当您运行一个容器时,Docker 会为该容器创建一组 命名空间。
这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且其访问权限仅限于该命名空间。