原文地址:docs.docker.com/get-started… (Docker官方文档)
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker能使你的程序与你的基础设施分开,所以你可以快速地交付软件。通过Docker,你可以与管理应用程序同样的方式管理你的应用程序。通过借助Docker快速地交付、测试和编码的优势,你可以显著地减少你编码和运行你产品的延迟。
Docker 平台
Docker提供一种通过宽松的隔离环境打包和运行应用程序的能力,这种宽松的隔离环境也叫容器(container)。它的隔离性和安全性允许你在一个给定的主机里同时运行很多的容器。容器是轻量级的,而且它包含了运行应用程序所必须的所有的东西,所以你不需要依赖目前在你主机所安装的东西。你可以在你工作时很轻易地分享你的容器,它可以保证每个被分享的人的同一个容器能通过同一的方式工作。
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,由dockerd执行这些命令。 docker命令使用docker API。 Docker客户端可以与多个守护进程通信。
Docker仓库
Docker仓库存储Docker镜像。 Docker Hub是一个任何人都可以使用的公共仓库,Docker默认配置为在Docker Hub上查找映像。 您甚至可以运行自己的私有仓库。
当您使用docker pull或docker run命令时,将从配置的仓库中提取所需的镜像。 当您使用docker push命令时,您的镜像将被推送到已配置的仓库中。
Docker对象
当您使用Docker时,您正在创建和使用镜像、容器、网络、卷、插件和其他对象。 本节简要介绍其中一些对象。
镜像
镜像是一个只读模板,包含创建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使用名为名称空间的技术来提供名为容器的独立工作区。 当您运行一个容器时,Docker会为该容器创建一组名称空间。
这些名称空间提供了一个隔离层。 容器的每个方面都运行在一个单独的名称空间中,它的访问仅限于该名称空间。