Docker: Build, Ship, and Run Any App, Anywhere
在任何地方构建、交付和运行任何应用
1. 引言
最近简单的学习了下Docker
,本文先简要梳理下Docker
涉及到的一些重要概念,后续在结合.NET Core探讨其基本用法。
2. What’s Docker
Docker
是用GO
语言编写,利用Linux
内核的几个特性来提供它的功能。Docker
是一个开放平台用于快速开发、分发和部署应用程序。它提供了一个操作系统级别的抽象。它隔离了应用程序对基础架构(操作系统等)的依赖。解决了生产、测试、部署环境的一致性问题。
Docker
提供了容器(松耦合且隔离的环境)去打包和运行应用程序。良好的安全性和隔离性允许我们在一个主机上运行多个容器。因为容器是直接在宿主机器的内核中运行且不需要额外的管理程序的负载(比如虚拟机需要VMware
管理程序),所以说容器是轻量级的。
3. Docker Engine
从图中可知,Client
使用docker CLI
(命令行工具)通过Docker REST API
去和docker daemon
(docker
的守护进程)进行交互,docker daemon
负责去创建和管理Docker objects
(比如镜像、容器、网络和存储卷等)。
4. Docker的适用场景
快速、一致地交付应用
Docker
通过使用容器(其提供应用程序和服务)来提供标准化的工作环境来精简开发周期。容器在持续集成和持续开发(CI/CD
)中十分有用。
考虑以下示例场景:
- 开发人员在本地编写代码,并使用
Docker
容器与同事分享他们的工作。 - 开发人员使用
Docker
将应用程序推入测试环境,并执行自动和手动测试。当开发人员发现错误时,他们可以在开发环境中修复它们,并将其重新部署到测试环境进行测试和验证。 - 完成测试后,将修复程序推送给客户就如同将更新的镜像推送到生产环境一样简单。
响应式部署和缩放
Docker
的可移植性和轻量级特性也使得动态管理工作负载变得非常容易,几乎可以实时地按业务需求对应用程序和服务进行扩展和收缩。
在同一硬件运行多个工作负载
Docker
的轻量级及运行快速的特性,允许我们用更少的资源做更多的事情,最大化的使用计算机的资源。Docker
是高密度环境和中小型部署的理想选择。
5. Docker架构
从图中我们可以看出,Docker
是一个C/S
架构。客户端通过REST API
与Docker
的守护进程进行交互,守护进程从Registry
(仓库,如DockerHub
)拉取镜像,再构建、运行和分发容器等。
6. Docker VS Vitual Machine
首先,Docker
是一种容器管理技术,而非虚拟化技术。与我们熟知的虚拟机有着本质区别:
通过上图可知,Docker
是基于Docker
引擎通过共享宿主机的硬件资源,使用容器来提供独立运行环境来运行应用程序!而VM
则是基于Supervisor
(虚拟机管理程序)使用虚拟机技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低!
7. 核心术语
下面我们就来重点梳理下Docker
涉及到的一些核心术语:Registry、Image、Container、Stack、Service、Swarm
。
Registry(仓库)
Docker Registry
用来存储Docker
镜像,比如Docker
官方的Docker Hub
就是一个公开的仓库。在上面我们可以找到我们想要的镜像。当然我们也可以建立私有的镜像仓库。
当我们执行Docker pull
或Docker run
命令时,若本地无所需的镜像,那么将会从仓库(一般为DockerHub
)下载(pull
)一个镜像。Docker
执行run
方法得到一个容器,用户在容器里执行各种操作。Docker
执行commit
方法将一个容器转化为镜像。Docker
利用login
、push
等命令将本地镜像推送(push
)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序。
另外,我们可以在Docker Store
进行镜像交易。
Image(镜像)
镜像是自读的,用于创建Docker
容器。我们可以基于一个镜像做一些额外的自定义更改后,commit
成我们自己的镜像。也可以使用Dockerfile
,build
成我们自己的镜像。Docker
使用镜像分层技术,Dockerfile
中的每个指令都会创建为镜像中的一个层。
Container(容器)
容器是docker
中最重要的概念,Container
是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。我们可以通过docker run <image>
创建指定镜像的容器,创建容器时会在镜像上附加一个读写层。我们可以连接容器到一个或多个网络,并为其附加存储,或基于它当前状态创建一个新的镜像。Docker
使用namespace
的技术来实现容器之间的隔离!对于容器的更改是暂时的,当容器停止时,相应的改动就会丢失。我们可以通过挂载volume
来持久化存储!
Docker Swarm(Docker集群)
Docker Swarm
是 Docker
的独立原生集群工具的名称。Docker Swarm
将多个Docker
主机集群并将它们暴露为单个虚拟的Docker
主机。
Service(服务)
通过服务我们可以很好进行容器扩展,默认情况下,服务在Swarm
下的所有工作节点之间进行负载平衡。在Docker
中我们通过编写docker-compose.yml
来定义、运行和扩展服务。
Stack(服务堆)
Stack
是一组相互关联的服务,它们可以共享依赖关系,并且可以一起协调和缩放。单个Stack
能够定义和协调整个应用程序的功能。