Docker Swarm

Docker Swarm


Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的

集群方式的部署、

  1. 准备四台安装Docker的服务器

  2. 安装地址:https://docs.docker.com/develop/

image-20200915153956629

搭建集群:


 

image-20200915155214481

image-20200915155324752

私网、公网

初始化节点(创建)
# docker swarm init 初始化节点
#--advertise-addr 地址
[root@Docker-01 ~]# docker swarm init --advertise-addr 192.168.1.99

image-20200915155510717

#获取令牌
docker swarm join-token manager #管理节点
docker swarm join-token worker  #工作节点
[root@Docker-01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-bdxtj1xp5po6qmx3s1fu0hzhg 192.168.1.99:2377
#2和3加入管理节点1
[root@Docker-01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-bdxtj1xp5po6qmx3s1fu0hzhg 192.168.1.99:2377

#查看:
[root@Docker-01 ~]# docker node ls
ID                           HOSTNAME           STATUS             AVAILABILITY       MANAGER STATUS     ENGINE VERSION
nlccevd2kp3ddcvzealrcimh9 *   Docker-01           Ready               Active             Leader              19.03.12
dlkzlvvsurcf62pir2efu05p7     Docker-02           Ready               Active                                  19.03.12
mzzag5vqlqws94123kk9t58pw     Docker-03           Ready               Active                                  19.03.12
#将04加入并管理节点
[root@Docker-01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-d6114b887g9byls2mzo4feaeg 192.168.1.99:2377
[root@Docker-04 ~]# docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-d6114b887g9byls2mzo4feaeg 192.168.1.99:2377
This node joined a swarm as a manager.

#再次查看
[root@Docker-01 ~]# docker node ls
ID                           HOSTNAME           STATUS             AVAILABILITY       MANAGER STATUS     ENGINE VERSION
nlccevd2kp3ddcvzealrcimh9 *   Docker-01           Ready               Active             Leader              19.03.12
dlkzlvvsurcf62pir2efu05p7     Docker-02           Ready               Active                                  19.03.12
mzzag5vqlqws94123kk9t58pw     Docker-03           Ready               Active                                  19.03.12
npw27mywz4g60ueh2f3m57rso     Docker-04           Ready               Active             Reachable           19.03.12

#两个管理节点 两个工作节点()一般管理节点是3+台、奇数

image-20200915161300004

  1. 生成主节点 init

  2. 加入(管理、工作节点)

 

Raft协议


双主双从:假设一个节点挂了,其他节点是否可用?

Raft协议:保证大多数节点存活才可以用。集群至少>3台。

实验:(基本命令操作)
  1. 将主节点docker-01服务停掉,查看另外一主节点(04节点)是否可用?(双主)

    [root@Docker-01 ~]# systemctl  stop docker 
    [root@Docker-04 ~]# docker node ls
    Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
  2. 发现另一主节点不可用

  3. 将03节点离开集群、查看发现显示Down

    [root@Docker-03 ~]# docker swarm leave
    Node left the swarm.
    [root@Docker-04 ~]# docker node ls
    ID                           HOSTNAME           STATUS             AVAILABILITY       MANAGER STATUS     ENGINE VERSION
    nlccevd2kp3ddcvzealrcimh9     Docker-01           Ready               Active             Reachable           19.03.12
    dlkzlvvsurcf62pir2efu05p7     Docker-02           Ready               Active                                  19.03.12
    mzzag5vqlqws94123kk9t58pw     Docker-03           'Down'               Active                                  19.03.12
    npw27mywz4g60ueh2f3m57rso *   Docker-04           Ready               Active             Leader              19.03.12
  4. 把03加入设置为管理节点

    #获取管理节点令牌
    [root@Docker-01 ~]# docker swarm join-token manager
    To add a manager to this swarm, run the following command:
      docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-d6114b887g9byls2mzo4feaeg 192.168.1.99:2377
    #加入集群设置管理节点
    [root@Docker-03 ~]# docker swarm join --token SWMTKN-1-6cfhg4y3yyix3ba3bgnb66vzmcwnn61sj3f36bou11xn3e3ioz-d6114b887g9byls2mzo4feaeg 192.168.1.99:2377
    This node joined a swarm as a manager.
    #03节点测试
    [root@Docker-03 ~]# docker node ls
    ID                           HOSTNAME           STATUS             AVAILABILITY       MANAGER STATUS     ENGINE VERSION
    nlccevd2kp3ddcvzealrcimh9     Docker-01           Ready               Active             Reachable           19.03.12
    dlkzlvvsurcf62pir2efu05p7     Docker-02           Ready               Active                                  19.03.12
    mzzag5vqlqws94123kk9t58pw     Docker-03           Down               Active                                  19.03.12
    qy9su0bul9kqp7qxpzlija3s4 *   Docker-03           Ready               Active             Reachable           19.03.12
    npw27mywz4g60ueh2f3m57rso     Docker-04           Ready               Active             Leader              19.03.12
  5. work就是工作的、管理节点操作、3台机器设置为主节点

  6. 现在再把01主节点停掉、查看另外两个主节点是否可用、

    [root@Docker-01 ~]# systemctl stop docker 
    [root@Docker-03 ~]# docker node ls  
    ID                           HOSTNAME           STATUS             AVAILABILITY       MANAGER STATUS     ENGINE VERSION
    nlccevd2kp3ddcvzealrcimh9     Docker-01           Ready               Active             'Unreachable'         19.03.12
    dlkzlvvsurcf62pir2efu05p7     Docker-02           Ready               Active                                  19.03.12
    mzzag5vqlqws94123kk9t58pw     Docker-03           Down               Active                                  19.03.12
    qy9su0bul9kqp7qxpzlija3s4 *   Docker-03           Ready               Active             Reachable           19.03.12
    npw27mywz4g60ueh2f3m57rso     Docker-04           Ready               Active             Leader              19.03.12
    #发现03和04主节点依旧可用、
  7. 现在再把03停用、04是否可用?

    [root@Docker-03 ~]# systemctl stop docker
    [root@Docker-04 ~]# 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.
    #发现不可用、需要等一下,有延迟

总结:集群,可用! 3个主节点。。

Raft协议:保证大多数节点存活,才能使用,高可用!

 

弹性、扩缩容!

体会弹性、扩缩容!

以后告别docker run !

docker-compose up! 启动一个项目,单机!

集群: swarm docker service

容器=》服务! =>副本!

redis=3 !容器 、集群:高可用,web->redis(3台分布不同主机上)

体验:创建服务、动态扩展服务、动态更新服务。

[root@Docker-01 ~]# 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
Run 'docker service COMMAND --help' for more information on a command.

灰度发布:金丝雀发布!


启动一个服务:

# docker  run  容器启动、 不具有扩缩容器
# docker service 服务!   具有扩缩容、滚动更新!
[root@Docker-01 ~]# docker service create -p 8888:80 --name my-nginx nginx
d2gtohwwxwszny9j4eflwnzbc
overall progress: 1 out of 1 tasks
1/1: running  
verify: Service converged
#查看服务副本 docker service ps 服务名字 或者: docker service ls 或者 inspect 服务名
[root@Docker-01 ~]# docker service ps my-nginx
ID                 NAME               IMAGE               NODE               DESIRED STATE       CURRENT STATE           ERROR               PORTS
sv3vzpdg8ft3       my-nginx.1         nginx:latest       Docker-03           Running             Running 53 seconds ago  
#发现启动的一个服务副本在03上,随机分配

访问量大了-扩展副本,以及服务副本缩容。

#扩展3个副本
[root@Docker-01 ~]# docker service update --replicas 3 my-nginx
my-nginx
overall progress: 3 out of 3 tasks
1/3: running  
2/3: running  
3/3: running  
verify: Service converged
#发现访问任意一个节点 都能访问! 若不行 就重启该节点服务 restart docker

#服务副本缩容
[root@Docker-01 ~]# docker service update --replicas 1 my-nginx
my-nginx
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
#发现所有节点只剩一个副本。ps -a 也没有。棒a! 依旧所有节点可以访问!

{docker service scale my-nginx=5} 等于 {docker service update --replicas 5 my-nginx}

删除服务:docker service rm my-nginx (移除)

服务,集群中的任意节点都可以访问。服务可以有多个服务副本,随时动态扩缩容。

弹性、扩缩容!!服务的高可用!

docker swarm 掌握:搭建集群、启动服务、动态管理容器服务就OK!

原文地址:https://www.cnblogs.com/james-23/p/13674542.html