一. 概念剖析
1. docker compose
docker compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。它主要是通过docker-compose.yml文件进行相关容器的配置,然后通过一些简单的指令可以操作该配置文件所包含的容器,常见的操作有:创建容器并启动、关闭容器、删除容器等等。(详见:https://www.cnblogs.com/yaopengfei/p/13672708.html)
注:docker compose相关指令主要是对一个docker-compose.yml文件进行管理,所以它的指令主要服务于单服务器,不适用于集群环境。
另外,一个docker-compose.yml可以管理一组容器,也就是一组任务的集合,这个也叫作services。
2. swarm
(1). 定义
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。Swarm 和 K8s 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
Swarm内部主要是通过节点(node)进行集群管理的,节点分为:管理节点和工作节点。
简单的说:swarm就是用来创建管理docker集群的。
(2). 节点概念
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) ,节点分为管理 (manager) 节点和工作 (worker) 节点。
A. 管理节点:
用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
B. 工作节点
是任务执行节点,管理节点将服务 (service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
3. services
services是指一组任务的集合,服务定义了任务的属性,服务有两种模式,如下,两种模式通过 docker service create 的 --mode 参数指定。
(1). replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
(2). global services 每个工作节点上运行一个任务
简单的说:services就是在swarm构建好的集群的基础上进行 “ 单容器创建等容器相关的管理工作 ”。(这里的单容器是指一条指令只能操作一个容器,但这条指令可以在集群的每个节点上生效)
4. stack
Stack 是基于 Docker Swarm 之上来完成应用的部署,Stack 能够在单个声明文件中定义复杂的多服务应用。Stack 还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!它可以通过一个docker-compose.yml文件进行多个容器的管理。
简单的说:stack就是在swarm构建好的集群的基础上进行“ 多容器创建等容器相关的管理工作 ”。(这里的多容器是指基于docker-compose.yml可以操作多个容器,这条指令可以在集群的每个节点上生效)
换句话说:stack可以同时操作多个services。
5. 总结
Dockerfile、docker compose 、service、node、 swarm、stack
(1). Dockerfile是用来构建镜像的,一个Dockerfile只能构建一个镜像
(2). docker compose可以在单机上构建一组任务,可以管理多个容器
(3). service 是一组任务,包含多个镜像和容器,通常用于在集群的基础上管理容器
(4). node是swarm中的节点概念,一个节点对应一台服务器。
(5). swarm是用来构建集群
(6). stack是在集群的基础上管理容器,他可以操作多个service
二. swarm+service集群容器管理
1. 环境准备
(1). 两台centos服务器:192.168.137.201 和 192.168.137.202
(2). 每个服务器事先准备好两个webapi镜像:ypfwebapi1(暴露端口9001) 和 ypfwebapi2(暴露端口9002)
(3). 服务器的防火墙要关闭,相关指令如下:
#查看防火墙服务
systemctl status firewalld.service
#关闭防火墙
systemctl stop firewalld.service
#永久关闭防火墙(可能不好用)
systemctl disable firewalld.service
2. 搭建集群的步骤
(1). 选择192.168.137.201作为管理(manager)节点,运行下面指令
docker swarm init --advertise-addr 192.168.137.201
(2). 在192.168.137.202主机上执行下面指令,加入工作节点(worker)这个集群
docker swarm join --token SWMTKN-1-254wexmq8blkpmi2ujs8o6job51u6e1jjy3k44pyngwjzx3my2-anldosyr1a9wbww4lriycuaxw 192.168.137.201:2377
PS:出现下面错误,说明201服务器的防火墙没关:(指令见上)
然后重新执行加入集群的命令,执行成功
3. 构建容器的步骤
(1). 在管理(manager)节点上执行下面指令: (201服务器)
# 基于镜像ypfwebapi1构建service_con1容器 docker service create --replicas 2 --name service_con1 --publish 8201:9001 ypfwebapi1 # 基于镜像ypfwebapi2构建service_con2容器 docker service create --replicas 2 --name service_con2 --publish 8202:9002 ypfwebapi2
参数说明:
A. - -replicas 2 : 代表在2个任务,即在两台主机上执行上述指令
B. -- publish:端口映射,8201为容器的端口,9001是镜像的端口。
注:程序的端口必须写死在程序中或dockerfile中,因为这里不能动态传参。
运行如图:
(2). 查看相应信息
A. 在管理节点服务器上: 用指令【docker service ls】查看集群中的容器情况 , 【docker node ls】查看节点情况。
B. 在工作节点服务器上,用指令【docker ps】查看
4. 测试
经测试,以下4个地址均可以正常访问。
http://192.168.137.201:8201/weatherforecast http://192.168.137.201:8202/weatherforecast http://192.168.137.202:8201/weatherforecast http://192.168.137.202:8202/weatherforecast
5. 指令总结
二. swarm+stack进行集群容器管理
1. 环境准备
同上。
2. 搭建集群
同上。
3. stack构建容器步骤
(1). 在管理节点服务器上(201服务器)进行操作
在工作目录上新建一个文件夹 【mkdir mystack】,然后新建一个docker-compose.yml文件【vi docker-compose.yml】,复制下面内容进去并保存。
内容如下:
{ "version": "3.8", "services": { "api1": {
"image": "ypfwebapi1", "ports": [ "8301:9001" ], "deploy": { "mode": "replicated", "replicas": 2 } }, "api2": {
"image": "ypfwebapi2", "ports": [ "8302:9002" ], "deploy": { "mode": "replicated", "replicas": 2 } } } }
PS: 这里个人倾向使用json格式,缩进的那种格式非常容易出错。 参数介绍详见:https://www.cnblogs.com/yaopengfei/p/13672708.html
(2). 进入mystack文件下,运行下面指令进行发布,其中ypfstack1是 stack的名称。
docker stack deploy -c docker-compose.yml ypfstack1
(3). 查看相关信息
A. 查看所有的stack 【docker stack ls】
B. 查看所有的service 【docker service ls】
4. 测试
以下4个地址均能访问
http://192.168.137.201:8301/weatherforecast http://192.168.137.201:8302/weatherforecast http://192.168.137.202:8301/weatherforecast http://192.168.137.202:8302/weatherforecast
5. 其他
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。