docker-swarm—01
swarm介绍
swarm几个关键介绍
- Swarm
集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
- Node
一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。要将应用程序部署到swarm,请将服务定义提交给 Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。
- Service
一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
Swarm的工作模式
node:
server:
任务与调度
服务副本与全局服务
swrm调度策略
Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
1)Random
顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
2)Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
3)Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。
环境:
主机名 | IP地址 |
---|---|
docker-node1 | 192.168.42.1 |
docekr-node2 | 192.168.42.2 |
docker-node3 | 192.168.42.3 |
开始搭建
-
修改主机名
docker-node1:
hostnamectl set-hostname docker-node1
docker-node2:
hostnamectl set-hostname docker-node2
docker-node3:
hostnamectl set-hostname docker-node3
-
修改域名解析
cat >> /etc/hosts << EOF 192.168.42.1 docker-node1 192.168.42.2 docker-node2 192.168.42.3 docker-node3 EOF
-
将域名解析复制到其他三台主机上
scp -rp /etc/hosts 192.168.42.2:/etc/hosts scp -rp /etc/hosts 192.168.42.3:/etc/hosts
-
为了方便我们做一个私有库下载私有库
docker pull registry:2
-
修改配置文件,(下面IP为本机IP地址)
cat > /etc/docker/daemon.json << EOF { "insecure-registries":["192.168.42.1:5000"], "registry-mirrors": [ "http://1dmptu91.mirror.aliyuncs.com", "https://0c6d0a431300f29d0f64c01719650540.mirror.swr.myhuaweicloud.com", "https://docker.mirrors...ustc.edu.cn", "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com" ]} EOF
-
重启docker
systemctl daemon-reload systemctl restart docker
-
运行容器并暴露5000端口
docker run -d --restart always -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
-
修改标签nginx
docker tag nginx 192.168.42.1:5000/nginx
-
上传到私有库中
docker push 192.168.42.1:5000/nginx
-
进行免密登录
docker-node1
ssh-keygen ssh-copy-id docker-node2 ssh-copy-id docler-node3
docker-node2
ssh-keygen ssh-copy-id docker-node1 ssh-copy-id docker-node3
docker-node3
ssh-keygen ssh-copy-id docker-node1 ssh-copy-id docker-node2
-
把/etc/docker/daemon.json配置文件复制到其他主机
scp /etc/docker/daemon.json docker-node2:/etc/docker/daemon.json scp /etc/docker/daemon.json docker-node3:/etc/docker/daemon.json
-
重启docker
docker-node2
systemctl daemon-reload systemctl restart docker
docker-node3
systemctl daemon-reload systemctl restart docker
-
初始化一下swarm
docker swarm init --advertise -addr 192.168.42.1
-
将node2,node3加入到node1中
docker-node2(复制上一步用红线括起来的)
docker swarm join --token SWMTKN-1- 3g9tuoub2w34i8ysnmcnz3xa97bvgz8qrhd6wqenyrg650jii3-0hs8wh8hl3i31ryowb73ndnx4 192.168.42.1:2377
docker-node2(复制上一步用红线括起来的)
docker swarm join --token SWMTKN-1- 3g9tuoub2w34i8ysnmcnz3xa97bvgz8qrhd6wqenyrg650jii3-0hs8wh8hl3i31ryowb73ndnx4 192.168.42.1:2377
-
查看是否加入到节点
docker node ls
-
提升docker-node2为管理员
docker node promote docker-node2
-
降级node2为普通
docker node demote docker-node2
-
管理者不需要存服务
docker ndoe update --availability drain
-
创建nginx容器
docker create --name web02 --rep 192.168.42.1:5000/nginx
-
创建10个nginx服务
docker service create --replicas 10 --name web02 192.168.42.1:5000/nginx
-
查看web02的服务分布的节点
docker service ps web02
-
访问端口(更新端口映射或创建时直接加上端口映射)
docker service update --publish-add 8888:80 web01 或 docker service create --name web03 --replicas 10 --publish 50:80 192.168.42.1:5000/nginx
-
访问一下是否能够访问到nginx
http://192.168.42.1:50 或 http://192.168.42.1:8888
-
访问一下是否能够访问到nginx
http://192.168.42.1:50 或 http://192.168.42.1:8888