Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的
集群方式的部署、
-
准备四台安装Docker的服务器
搭建集群:
私网、公网
初始化节点(创建)
# docker swarm init 初始化节点
#--advertise-addr 地址
[root@Docker-01 ~]# docker swarm init --advertise-addr 192.168.1.99
#获取令牌
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+台、奇数
-
生成主节点 init
-
加入(管理、工作节点)
Raft协议
双主双从:假设一个节点挂了,其他节点是否可用?
Raft协议:保证大多数节点存活才可以用。集群至少>3台。
实验:(基本命令操作)
-
将主节点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 -
发现另一主节点不可用
-
将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 -
把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
-
work就是工作的、管理节点操作、3台机器设置为主节点
-
现在再把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主节点依旧可用、 -
现在再把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!