Docker介绍
Docker概述
Docker是一个用于开发、部署和运行应用程序的开放平台。Docker使您能够将应用程序与基础设施分离,从而能够快速交付软件。通过使用Docker,您可以以与管理应用程序相同的方式来管理基础设施。通过利用Docker快速发布、测试和部署代码的方法,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker平台
Docker提供了在一个松散隔离的环境(称为容器)中打包和运行应用程序的能力。容器的隔离和安全性使您能够在一个主机上同时运行多个容器。容器很轻量,并包含运行应用程序所需的一切,因此您不需要依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得相同的容器,以相同的方式工作。
Docker提供工具和平台来管理容器的生命周期:
- 使用容器开发应用程序及其支持组件。
- 容器成为分发和测试应用程序的单位。
当您准备好时,将应用程序作为容器或编排服务部署到生产环境中。无论您的生产环境是本地数据中心、云提供商还是两者的混合,都可以采用相同的方法。
我可以用Docker做什么呢?
快速、一致地交付应用程序
Docker通过使用本地容器来让开发人员在标准化环境中工作,从而简化了开发生命周期。容器为您的应用程序和服务提供支持。容器非常适合持续集成和持续交付(CI/CD)的工作流程。
考虑以下示例场景:
- 开发人员在本地编写代码,并使用Docker容器与同事共享他们的工作。
- 他们使用Docker将应用程序推送到测试环境,并执行自动化和手动测试。
- 当开发人员发现错误时,他们可以在开发环境中修复错误,并将其重新部署到测试环境进行测试和验证。
- 测试完成后,将修复后的更新镜像推送到生产环境就像推送更新的镜像一样简单。
灵活的部署和扩展
Docker的基于容器的平台支持高度可移植的工作负载。Docker容器可以在开发人员的本地计算机上运行,也可以在数据中心的物理或虚拟机上运行,还可以在云提供商上或在各种环境的混合中运行。
Docker的可移植性和轻量化使得动态管理工作负载变得容易,可以根据业务需求实时扩展或停止应用程序和服务。
在相同硬件上运行更多的工作负载
Docker轻量且快速。它提供了一种可行、经济高效的替代方案,可以使用更多的服务器容量来实现您的业务目标,与基于虚拟机的虚拟化相比。Docker非常适合高密度环境和需要以较少资源做更多工作的中小型部署。
Docker架构
Docker使用客户端-服务器架构。Docker客户端与Docker守护程序进行通信,守护程序负责构建、运行和分发Docker容器。Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序使用REST API通过UNIX套接字或网络接口进行通信。另一个Docker客户端是Docker Compose,它使您可以使用一组容器来处理应用程序。
Docker守护程序
Docker守护程序(dockerd)监听Docker API请求并管理Docker对象,例如镜像、容器、网络和卷。守护程序还可以与其他守护程序通信,以管理Docker服务。
Docker客户端
Docker客户端(docker)是许多Docker用户与Docker进行交互的主要方式。当您使用docker run等命令时,客户端会将这些命令发送给dockerd来执行。docker命令使用Docker API。Docker客户端可以与多个守护程序进行通信。
Docker桌面版
Docker桌面版是一个易于安装的应用程序,适用于Mac、Windows或Linux环境,它使您能够构建和分享容器化的应用程序和微服务。Docker桌面版包括Docker守护程序(dockerd)、Docker客户端(docker)、Docker Compose、Docker Content Trust、Kubernetes和Credential Helper。了解更多信息,请查看Docker桌面版。
Docker注册表
Docker注册表用于存储Docker镜像。Docker Hub是一个公共的注册表,任何人都可以使用,默认情况下Docker配置为在Docker Hub上查找镜像。您甚至可以运行自己的私有注册表。
当您使用docker pull或docker run命令时,所需的镜像将从您配置的注册表中拉取。当您使用docker push命令时,您的镜像将推送到您配置的注册表中。
Docker对象
在使用Docker时,您会创建和使用镜像(images)、容器(containers)、网络(networks)、卷(volumes)、插件(plugins)和其他对象。本节是对这些对象的简要概述。
镜像
镜像是一个只读模板,包含创建Docker容器的指令。通常,一个镜像是基于另一个镜像,并进行了一些额外的定制。例如,您可以构建一个基于ubuntu镜像的镜像,但同时安装了Apache web服务器和您的应用程序,以及运行应用程序所需的配置细节。
您可以创建自己的镜像,也可以使用其他人创建并发布在注册表中的镜像。要构建自己的镜像,您可以创建一个Dockerfile,使用简单的语法定义创建镜像和运行它所需的步骤。Dockerfile中的每条指令都会在镜像中创建一个层。当您更改Dockerfile并重新构建镜像时,只会重新构建那些已更改的层。与其他虚拟化技术相比,这是镜像如此轻量、小巧和快速的一部分原因。
容器
容器是镜像的可运行实例。您可以使用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会为该容器创建一组命名空间。
这些命名空间提供了一层隔离。容器的每个方面都在一个单独的命名空间中运行,并且其访问仅限于该命名空间。