docker swarm

发布时间 2023-10-13 11:13:32作者: lclc
一、环境准备
1.准备好四台服务器
docker1(192.168.0.10)、docker2(192.168.0.11)、docker3(192.168.0.13)、docker4(192.168.0.14)
2.安装docker
#参考文档:官网
#地址:https://docs.docker.com/engine/install/centos/
注由于4台机器都要安装我们需要用到xshell的小技巧如下:
点击发送到所有会话。

工作模式

https://docs.docker.com/engine/reference/commandline/swarm/
 
注:操作都在manager
搭建集群: 
地址:公网   内网
 
[root@docker1 ~]# docker swarm init --advertise-addr 192.168.0.10
初始化节点: docker swarm init
加入一个节点:docker swarm join 
#获取令牌
docker swarm join-token manager
docker swarm join-token worker
吧docker2加入docker1
[root@docker2 ~]# docker swarm join      --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-4xvt57zk562y77omphdm6fq4f     192.168.0.10:2377
查看列出群组中的节点
[root@docker1 ~]# docker node ls
 
把docker3加入节点
[root@docker3 ~]# docker swarm join      --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-4xvt57zk562y77omphdm6fq4f     192.168.0.10:2377
This node joined a swarm as a worker.
 
把docker4加入主节点
1.创建主节点令牌
[root@docker1 ~]# docker swarm join-token manager
2.把docker4加入主节点
[root@docker4 ~]# docker swarm join     --token SWMTKN-1-3u6cnjv3o8ntnxylrc5tntrm8bvtko5jzg8g3umbddtjxczflc-dfj1fe83a5uwnjhpb0etanwh9     192.168.0.10:2377
This node joined a swarm as a manager.
3.查看
[root@docker1 ~]# docker node ls
raft协议
双重双主:假设一个节点挂了,其它节点是否可用
raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于三台
实验:
将ocker1机器停止,宕机,由于我们现在是双主结构,另外一个节点也不能使用了!
[root@docker1 ~]# systemctl stop docker.service
[root@docker4 ~]# docker node ls
Error response from daemon: rpc error: code = 2 desc = raft: no elected cluster leader
启动docker1后正常
[root@docker1 ~]# docker node ls
ID                           HOSTNAME  STATUS   AVAILABILITY  MANAGER STATUS
01a0568r7nja4roc6n4x0i1ji    docker3   Ready    Active        
4xzwtgsmkpgu9yjv7x7xpt54k    docker4   Unknown  Active        Leader
abd2mw7cn4c0lq5bxgrlhs4tx    docker2   Unknown  Active        
ez0d73ul2uf6c18m4fnausdin *  docker1   Ready    Active        Reachable
将docker3移除节点
[root@docker3 ~]# docker swarm leave
Node left the swarm.
主要保证集群可用至少要保证三个主节点,>1太管理节点存活
删除节点前,需先停该节点的docker服务
docker node rm  [hostname]
体会
弹性、扩缩容、集群
以后告别docker run!
docker-compose up! 启动一个项目单机
集群 swarm docker service
容器=》服务=》副本
体验:创建服务、动态扩展服务、动态更新服务
灰度发布:金丝雀发布!
[root@docker1 ~]# docker service create -p 8888:80 --name my-nginx nginx
3jscijnxvaihuc1zm138tde0v
docker  run  容器启动!不具有扩缩容功能
docker service 服务! 具有扩缩容、滚动更新
[root@docker1 ~]# docker service ps my-nginx
ID                         NAME        IMAGE  NODE     DESIRED STATE  CURRENT STATE          ERROR
a73nmtzy9w0xvpzjlu7aj36me  my-nginx.1  nginx  docker2  Running        Running 2 minutes ago  
查看服务
动态扩缩容
[root@docker1 ~]# docker service update --replicas 3 my-nginx
查看结果
[root@docker2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
503b07b909b8        nginx:latest        "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       80/tcp              my-nginx.1.a73nmtzy9w0xvpzjlu7aj36me
[root@docker3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6631aff5eb4d        nginx:latest        "/docker-entrypoint.s"   3 minutes ago       Up 3 minutes        80/tcp              my-nginx.3.2s58g5mtl6oig7gcs4kq6hdvb
[root@docker3 ~]#
[root@docker4 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
44b2a002cf6e        nginx:latest        "/docker-entrypoint.s"   5 seconds ago       Up 4 seconds        80/tcp              my-nginx.2.brddytptvq2tpq0thag1rmz8v
服务,集群中任意的节点都可以访问,服务可以有多个副本
[root@docker1 ~]# docker service update --replicas 50  my-nginx 可以加很多个(随机分配)
[root@docker1 ~]# docker service update --replicas 1  my-nginx  也可以瞬间把很多个副本缩小为一个
弹性、扩缩容,实现服务高可用,任何服务、云
[root@docker1 ~]# docker service scale my-nginx=5 扩容5份跟上面命令一样
 
[root@docker1 ~]# docker node rm docker   移除服务
docker swarm 其实并不难,只要会搭建集群,动态管理容器就可以了
概念总结
swarm
集群的管理和标号。docker可以初始化一个swarm集群,其他节点可以加入(管理、工作)
service
任务,可以在管理节点或者工作节点来运行,核心,用户访问
逻辑是不变的:命令->管理->api->调度->工作节点(创建Task容器维护创建)