compose、machine 和 swarm 是docker 原生提供的三大编排工具。
Compose
1. 概述
在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。
compose 是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。使用 compose 可以简化容器镜像的构建以及容器的运行。
compose 使用 YAML 文件来定义多容器之间的关系。一个 docker-compose up
就可以把完整的应用跑起来。 本质上, compose 把 YAML 文件解析成 docker 命令的参数,然后调用相应的 docker 命令行接口,从而将应用以容器化的方式管理起来。它通过解析容器间的依赖关系顺序地启动容器。而容器间的依赖关系由 YAML 文件中的 links
标记指定。
2. compose 配置简介
Compose 是对 docker 命令的封装,默认使用 docker-compose.yml 文件指定各个命令中的参数。
一个简单的例子:
web:
build: .
ports:
- 8080:80
volumes:
- . : /code
links:
- redis
redis:
image: redis
这个 YAML 文件定义了两个服务: Web 和 Redis, 服务的名称由用户自定义。提供 Web 服务的镜像从 Dockerfile 构建; Web 服务监听80端口,并和主机的8080端口建立映射;主机的当前目录挂载到容器里的 /code 目录上;Web 服务器通过链接 Redis 容器来访问后台 Redis 数据库。而 Redis 数据库服务是通过运行 Redis 镜像来提供的。
在 docker-compose.yml 文件中,每个定义的服务都至少包含 build
或image
其中之一,其他命令都是可选的。 build 命令指定了包含 Dockerfile 的目录,可以是相对目录也可以是绝对目录。
docker-compose.yml 文件中的 "ports" 标记对应于 docker run 的 "-p"选项; "volumes"标记对应 docker run 的 "-v" 选项; "links" 标记对应 docker run 的 "--links"选项。
此外,image
用于指定服务的镜像。
最后,在 docker-compose.yml 所在的目录下执行 docker-compose up
命令,Web 和 Redis 服务都会成功运行起来。
Machine
1. 概述
Docker Machine 是一个简化Docker 安装的命令行工具。通过一个简单的命令行即可在相应的平台上安装 Docker,为用户提供了灵活的功能,使得用户可以在任一主机上运行 Docker 容器。简单说,一个 Docker Machine 就是一个 Docker host 主机和经过配置的 Docker client 的结合体。
技术上讲, Machine 是一个框架,比较开放。对于任何提供虚拟机服务的平台,只要在这个框架下开发针对该平台的驱动,,Docker Machine 就可以集成到该平台,在该平台上执行创建、删除、启动、停止等行为。
Docker Machine 的架构如图所示
2. Machine 的基本概念和流程
Docker Machine 首先会创建一个虚拟机并在其上创建一个 Docker host,然后使用Docker client 和 Docker host 通信,从而在 Docker host 上创建镜像,启动容器。
用 Docker Machine 创建虚拟机的时候需要制定相应的驱动,目前支持本机的驱动有 VirtualBox 驱动、VMware 驱动及 Windows 下的 Hyper-V 驱动。除此之外,Machine 还支持云主机的创建。只要开发了符合框架规范的驱动,Docker Machine 就可以支持相应的平台。
Machine 创建的 Docker host 的IP地址是所创建的虚拟机的IP地址。
使用Docker Machine 及 VirtualBox 驱动创建本地虚拟机并搭建 Docker host 的运行流程如下:
执行
docker-machine create --driver virtualbox dev
命令。此命令首先创建用于 Docker client 和 Docker host 通信用的 CA 证书。 其次创建 VirtualBox 虚拟机, 并配置用于通信的 TLS 参数及配置网络, 最后部署 Docker 的运行环境 即 Docker host。在 Docker client 里运行
eval "$(docker-machine env dev)"
命令, 配置用于 Docker host 通信的环境变量。使用 docker 相关命令创建或启动相应的容器。
Swarm
1. 概述
Swarm 是 Docker 社区提供的原生支持 Docker 集群的工具。 它可以把多个 Docker 主机组成的系统转换成为单一的虚拟 Docker 主机。Swarm 对外提供两种 API。一种是标准的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;另一种是 Swarm 的集群管理 API,用于集群的管理。
Swarm工具本身不是很成熟,不建议用在生产环境。
而 Google 开源的Kubernetes 是目前容器生态圈中最受欢迎的编排部署工具。
Kubernetes 的架构基于有多个 Minion 节点的 Master 服务器。关于 K8s我还没有接触到,后面学到后再总结在这里。
更新:
K8s 架构框图
组件解释:
- Master:主控服务器,运行 kebernetes 的管理进程,包括 API 服务、备份控制器和调度器等。
- Minion: Kubelet 服务和 Docker 引擎的主机, Minion 接受来自 Master 的指令
- Kubelet:Kubernetes 节点层面的管理器, 运行在 Minion 上
- Pod:多个容器的集合,并且这些容器运行在同一个 Minion 上。 Pod 是 K8s 的最小管理单元
- Replication Controller:管理 Pod 的生命周期
- Service:定义允许容器暴露出的服务和端口,以及通信交互的外部代理
- Kubecfg:命令行接口,与 Master 交互,请求应用业务的部署、管理
参考:Docker 进阶与实战
以上只是简单对 docker 编排工具的介绍,要深入了解可以访问各自的社区获取最新信息及发展动态。