docker swarm
环境准备
在本地搭建3台虚拟机1C2G,用于swarm集群。
ip地址 192.168.1.10,192.168.1.11,192.168.1.12. 配置yum源使用阿里云,使用xshell发送到所有session功能,一次操作3台机器
安装docker
#配置yum源使用阿里云,使用xshell发送到所有session功能,一次操作4台机器
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
#安装依赖包
yum -y install gcc gcc++
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum 软件包索引,这一步可能因为网络问题而失败,失败之后导致下一步也无法成功.
yum makecache fast
#安装docker engine 包含3个必备组件,不指定版本,默认安装最新版本
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
#设置docker开机自启
systemctl enable docker
#验证docker正确安装,并拉取hello-world
docker run hello-world
配置Docker加速
配置镜像加速的目的是使用国内的仓库,不然使用国外仓库会比较慢,甚至无法获取镜像。
#备份docker.service文件,并赋予执行权限
cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
chmod a+x /etc/systemd/system/docker.service
#在内容种增加ExecStart=/usr/bin/dockerd --registry-mirror=https://dh0xuqe2.mirror.aliyuncs.com ,每个账号都可以申请到免费地址
vim /etc/systemd/system/docker.service
#reload 并验证
systemctl daemon-reload
systemctl restart docker
ps -ef |grep docker
进入docker 官方
https://docs.docker.com/engine/swarm/
左边导航栏: run your app in production --> Configure containers --> Scale your app --> How swarm mode works -
集群工作模式
Docker Engine 1.12引入了集群模式,允许你创建一个或多个Docker引擎的集群,称为集群。集群由一个或多个节点组成:在集群模式下运行Docker Engine 1.12或更高版本的物理或虚拟机。有两种节点类型: managers and workers.
Manager nodes
manager nodes 处理集群管理任务
-
维护集群状态
-
服务调度
-
服务于集群模式的HTTP API端点
通过使用Raft实现,管理器可以维护整个集群以及在其上运行的所有服务的一致内部状态。出于测试目的,使用单个管理器运行群集是可以的。如果单管理器集群中的管理器发生故障,您的服务将继续运行,但您需要创建一个新的集群来恢复。
为了利用集群模式的容错特性,Docker建议您根据组织的高可用性需求实现奇数个节点。当您拥有多个管理器时,您可以从一个管理器节点的故障中恢复,而无需停机。
重要提示:添加更多的管理器并不意味着增加可伸缩性或更高的性能。一般来说,事实正好相反。
Worker nodes
Worker节点也是Docker引擎的实例,它的唯一目的是执行容器。Worker节点不参与Raft分布式状态,不做调度决策,也不服务于集群模式的HTTP API。
您可以创建一个管理器节点的集群,但是您不能拥有一个没有至少一个管理器节点的工作节点。默认情况下,所有管理人员也是工人。在一个单一的管理节点集群中,你可以运行像docker service create这样的命令,调度程序将所有任务放在本地引擎上。
为了防止调度程序将任务放置在多节点群中的管理节点上,可以将管理节点的可用性设置为耗尽。调度程序正常地停止处于排泄模式的节点上的任务,并调度活动节点上的任务。调度程序不会将新任务分配给具有耗尽可用性的节点。
How services work
当Docker引擎处于集群模式时,要部署应用镜像,需要创建一个service。服务通常是一些大型应用程序上下文中的微服务的映像。服务的例子可能包括HTTP服务器、数据库或您希望在分布式环境中运行的任何其他类型的可执行程序。
创建服务时,需要指定要使用哪个容器映像,以及要在运行的容器中执行哪些命令。您还为该服务定义了以下选项:
- 集群对外提供服务的端口
- 一个覆盖网络,用于服务连接到集群中的其他服务
- CPU和内存限制和预留
- 滚动更新策略
- 集群中要运行的映像副本的数量
Services, tasks, and containers
当您将服务部署到集群时,集群管理器将接受您的服务定义作为服务的期望状态。然后将集群内节点上的服务调度为一个或多个副本任务。任务在集群的节点上独立运行。
例如,假设您希望在一个HTTP侦听器的三个实例之间实现负载平衡。下图显示了一个具有三个副本的HTTP侦听器服务。侦听器的三个实例中的每一个都是群集中的一个任务。
容器是一个孤立的过程。在集群模式模型中,每个任务只调用一个容器。任务类似于调度程序放置容器的“槽”。一旦容器处于活动状态,调度器就会识别出任务处于运行状态。如果容器的健康检查失败或终止,则任务终止
Tasks and scheduling
任务是群集内调度的原子单位。当您通过创建或更新服务来声明所需的服务状态时,编排器通过调度任务来实现所需的状态。例如,您定义了一个服务,该服务指示编排器始终保持一个HTTP侦听器的三个实例运行。协调器通过创建三个任务来响应。每个任务都是一个槽,调度程序通过生成一个容器来填充。容器是任务的实例化。如果HTTP侦听器任务随后的健康检查失败或崩溃,则编排器将创建一个新的复制任务,该复制任务将生成一个新的容器。
任务是一种单向机制。它在一系列状态中单调地发展:分配、准备、运行等。如果任务失败,编排器将删除任务及其容器,然后根据服务指定的所需状态创建一个新任务来替换它。
Docker群模式的底层逻辑是一个通用的调度和编排器。服务和任务抽象本身不知道它们实现的容器。假设,您可以实现其他类型的任务,如虚拟机任务或非容器化流程任务。调度程序和编排器不知道任务的类型。然而,当前版本的Docker只支持容器任务。
下图显示了集群模式如何接受服务、创建请求并将任务调度到工作节点。
Replicated and global services
有两种类型的服务部署,复制的和全局的。
对于复制的服务,您可以指定要运行的相同任务的数量。例如,您决定部署一个带有三个副本的HTTP服务,每个副本提供相同的内容。
全局服务是在每个节点上运行一个任务的服务。没有预先指定的任务数量。每次向集群中添加一个节点时,编排器创建一个任务,调度程序将该任务分配给新节点。全局服务的良好候选对象是监视代理、反病毒扫描器或希望在集群中的每个节点上运行的其他类型容器。
命令--> 管理 --> api -->调度 --> 工作节点 (创建task容器维护创建)
下图显示了一个黄色的三服务副本和一个灰色的全局服务。
集群搭建
集群规划:3台机器
192.168.1.10 manager
192.168.1.11 manager
192.168.1.12 worker
docker自带swarm功能,因此实验swarm命令来搭建集群
1、生成主节点 192.168.1.10 init
#查看帮助命令
docker swarm --help
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
#初始化节点,使其称为第一个集群manager节点
docker swarm init --help
#使节点成为主节点,使用私网地址,省流量费用
docker swarm init --advertise-addr 192.168.1.10
Swarm initialized: current node (txo876ujxzs76ncpbjwprtups) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#加入一个节点 docker swarm join
#生成manager令牌
docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
#生成worker令牌
docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
#在需要加入集群的节点输入以上命令,节点即可加入集群
2、加入集群 (manage、worker)
#将192.168.1.11节点加入,同时作为manager
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
#将192.168.1.12节点加入加入成为worker
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-5jku9lmca4m67k938zz79ehq7 192.168.1.10:2377
集群搭建完成。
Raft协议
Raft是一个分布式一致性协议/算法,是Replicated And Fault Tolerant的缩写。
双主双从:如果一个节点挂掉会怎样?其他节点是否可以正常工作
Raft:保证大多数节点存活才可用,集群至少大于3台
实验:
1、停止1台manage 节点的docker ,另一个节点也不能使用
#stop 192.168.1.11节点的docker
systemctl stop docker
#192.168.1.10节点将不可用
docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
#要使节点可用,需要重新强制初始化新的集群
docker swarm init --advertise-addr 192.168.1.10 --force-new-cluster
#再将192.168.1.11加入集群
docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2ludchowgad637q1shqjbczqkboxeh08izd4llldy6l9nrv7mk-0zjzpjor2o8ilrzntnwpqlyzv 192.168.1.10:2377
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
txo876ujxzs76ncpbjwprtups * node1 Ready Active Leader 20.10.4
0s93se9yabmsk9zqymehzeoij node2 Down Active 20.10.4
r1p29vvcmx7684sidqg6ozttn node2 Down Active 20.10.4
vyyci26knpi2l3cng34rbytcm node2 Ready Active Reachable 20.10.4
ox6cq9c66i85crudisvd92kuy node3 Ready Active 20.10.4
2、将其他节点离开集群
#节点离开集群
docker swarm leave
3、worker是工作节点,不能操作命令,
docker service ps my-nginx
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
小结:
将管理节点增加到3台,保证 >1个节点存活,集群才可用
弹性扩缩容
docker-compose up 启动一个项目! --> 单机
集群: swarm docker service
容器 --> 服务 --> 副本 (同时开启)
集群: 实现高可用, web--redis, 分布在3台机器,
实验
查看service帮助:创建服务,动态扩展服务,动态更新服务
docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
灰度发布:金丝雀发布
发布nginx服务
#查看create 帮助命令
docker service create --help
#创建nginx服务
docker service create -p 8888:80 --name my-nginx nginx
#查看my-nginx在那个节点启动
docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
o0tqau2qlgor my-nginx.1 nginx:latest node2 Running Preparing 8 minutes ago
#查看运行的service
docker service ls
ID NAME MODE REPLICAS IMAGE
od4ucb22q6pi my-nginx replicated 0/1 nginx:latest
#查看运行的service 详细信息
docker service inspect my-nginx
弹性扩缩容
#增加副本数
docker service update --replicas 5 my-nginx
1/5: preparing [=================================> ]
overall progress: 2 out of 5 tasks
1/5: preparing [=================================> ]
2/5: preparing [=================================> ]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: preparing [=================================>
#增加副本数
docker service scale my-nginx=5
[root@node1 ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
#移除服务
docker service rm my-nginx
my-nginx
小结:
docker run 容器启动,不具有扩缩容功能
docker service 服务,具有扩缩容功能,滚动更新
弹性扩缩容,实现服务的高可用
Docker 概念总结:
swarm
集群的管理和编排,dockers可以初始化一个swarm集群,然后其他节点可以加入: manager + worker
node
就是一个docker节点,多个节点就组成一个网络集群: manager + worker
service
任务,可以在管理节点或工作节点来运行,核心!
Task
容器内的命令,细节任务
命令--> 管理 --> api -->调度 --> 工作节点 (创建task容器维护创建)
调整service 以什么方式运行
--mode string
docker service create --mode replicated --name mytomcat tomcat:7
docker service create --mode global --name haha alpine ping baidu.com
网络模式:
PublishMode:
overlay:
ingress: 特殊的overlay网络,具有负载均衡功能
docker network inspect ingress
[
{
"Name": "ingress",
"Id": "6k7m9h1paz80cwslxe5zpyfee",
"Created": "2021-03-06T18:37:09.435832212+08:00",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
......
"Labels": {},
"Peers": [
{
"Name": "a2d20f2da568",
"IP": "192.168.1.10"
},
{
"Name": "node2-0717d99ccecc",
"IP": "192.168.1.11"
},
{
"Name": "node3-0717d99ccecf",
"IP": "192.168.1.12"
}
]
}
虽然docker安装在3台不同的集群,但是实际在同一个网络,
Docker stack
docker-compose 单机部署项目
docker stack 部署,集群部署
#单机
docker-compose up -d wordpress.yaml
#集群
docker stack deploy wordpress.yaml
docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
Docker secret
docker secret --help
Usage: docker secret COMMAND
Manage Docker secrets
Commands:
create Create a secret from a file or STDIN as content
inspect Display detailed information on one or more secrets
ls List secrets
rm Remove one or more secrets
Run 'docker secret COMMAND --help' for more information on a command.
Docker config
docker config --help
Usage: docker config COMMAND
Manage Docker configs
Commands:
create Create a config from a file or STDIN
inspect Display detailed information on one or more configs
ls List configs
rm Remove one or more configs
Run 'docker config COMMAND --help' for more information on a command.