Docker Swarm介绍及使用入门

一、Swarm介绍

Docker Swarm是管理跨节点容器的编排工具,相较于Docker Compose而言,Compose只能编排单节点上的容器,Swarm将一群Docker节点虚拟化为一个主机,使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作。如果下载的是最新版的Docker,那么Swarm就已经被包含在内了,无需再安装。

Docker Swarm架构包含两种角色,manager和node,前者是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求,然后调度Node进行具体的容器工作,比如容器的创建、扩容与销毁等。 manager本身也是一个node。通常情况下,为了集群的高可用,manager个数>=3的奇数,node的个数则是不限制。

二、Swarm实例

2.1 准备工作

我们需要准备好三个节点,并在各自节点上安装好Docker Engine,才能进行接下来的实例搭建。此处选本地虚拟机方式搭建三台Centos虚机,并安装Docker(Docker初体验)。

192.168.160.100 ————作为manager
192.168.160.101 ————作为node1
192.168.160.102 ————作为node2

2.2 创建集群

在创建集群之前,我们使用docker node ls想查看下集群中节点的信息,反馈目前没有节点信息,并且当前节点并不是manager。

博主之前已经创建过一个swarm集群,所以先删除掉。
[root@localhost ~]# docker swarm leave -f 删除swarm

那么我们首先就在manager这个节点上执行如下操作,表示要将它设置为manager,并且设置自己的通讯IP为192.168.160.100

[root@localhost ~]# docker swarm init --advertise-addr 192.168.160.100
Swarm initialized: current node (upral6mrlz1928ssrqrehjnr8) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

如上就完成了manager节点的设置,并且得到提示信息如下:

  • 可以在其它节点上执行docker swarm join --token......来将该节点设置为工作node,并加入到这个swarm集群中;
  • 可以在其它节点上执行docker swarm join-token manager来获取下一步执行指令,执行该指令后,该节点将设置为manager从节点加入到这个swarm集群中;

我们目前演示的是一个manager,两个工作node的模式,所以在另外两台node1和node2上执行第一个命令即可:

docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377

 如此,一个swarm集群就算搭建完成了。

2.3 使用集群

manager是我们管理集群的入口,我们的docker命令都是在manager上执行,node节点上是不能执行dockr命令的,这一点要十分牢记。

查看当前节点信息;

[root@localhost ~]# docker node ls
ID                            HOSTNAME                STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
i91jji6pecz0pic225aogilh7     localhost.localdomain   Ready     Active                          20.10.21
so1xdgl2iudz0gobsnh60cgca     localhost.localdomain   Ready     Active                          20.10.21
upral6mrlz1928ssrqrehjnr8 *   localhost.localdomain   Ready     Active         Leader           20.10.21

创建一个私有网络,供不同节点上的容器互通使用;

[root@localhost ~]# docker network create -d overlay niginx_network
0mbficvfzsly02hs5v34iq0p1

[root@localhost ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
df559dd730a7   bridge            bridge    local
a0e7ced640ef   docker_gwbridge   bridge    local
9df73a6f4d7a   host              host      local
9i5uwy0rfkek   ingress           overlay   swarm
2187dde6db43   mynet             bridge    local
0mbficvfzsly   niginx_network    overlay   swarm
fa0cdda1cb13   none              null      local

使用指定的网络部署一个服务(提前拉去镜像docker pull nginx);

[root@localhost ~]# docker service create --replicas 1 --network niginx_network --name my_nginx -p 80:80 nginx:latest
goaillb240g83fi1ygzjj39h4
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
2193c8281810   nginx:latest   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   80/tcp    my_nginx.1.s558g27cnz6s4h9492eii03bp

 如上使用nginx:latest镜像创建了一个容器,容器名称为my_nginx,对外暴露80端口;

查看运行中的服务列表;

[root@localhost ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
goaillb240g8   my_nginx   replicated   1/1        nginx:latest   *:80->80/tcp

 查看某个服务在哪个节点上运行;

[root@localhost ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE                    DESIRED STATE   CURRENT STATE           ERROR     PORTS
s558g27cnz6s   my_nginx.1   nginx:latest   hostname-100   Running         Running 5 minutes ago

动态扩缩容某个服务的容器个数;

[root@localhost ~]# docker service scale my_nginx=4
my_nginx scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged

使用update命令也是等价的:docker service update --replicas 3 my_nginx; 

下线一个节点,使之不参与任务分派;

[root@localhost ~]# docker node update --availability drain hostname-102
hostname-102
[root@localhost ~]# docker node ls
ID                            HOSTNAME       STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 *   hostname-100   Ready     Active         Leader           20.10.21
so1xdgl2iudz0gobsnh60cgca     hostname-101   Ready     Active                          20.10.21
i91jji6pecz0pic225aogilh7     hostname-102   Ready     Drain                           20.10.21

值得一提的是,如果某个节点被设置下线,或者因为其它故障宕机了,那么它其上的容器会被转移到其它可运行的节点上,如此来保证始终有指定副本数量的容器在运行。

上线一个下线中的节点,使之参与任务分派;

[root@localhost ~]# docker node update --availability active hostname-102
hostname-102
[root@localhost ~]# docker node ls
ID                            HOSTNAME       STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 *   hostname-100   Ready     Active         Leader           20.10.21
so1xdgl2iudz0gobsnh60cgca     hostname-101   Ready     Active                          20.10.21
i91jji6pecz0pic225aogilh7     hostname-102   Ready     Active                          20.10.21

移除一个任务,使得集群中所有该任务的容器都删除;

[root@localhost ~]# docker service rm my_nginx
my_nginx
[root@localhost ~]# docker service ps my_nginx
no such service: my_nginx

 加入一个现有的swarm集群

[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-d6c6v0fonjuh07qg88h0dzn33 192.168.160.100:2377

[root@localhost ~]# docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4jg8as3v4whcy9gtabon078ooyiu1fuytuelyb2ipqbcuxa7jk-55dc9derg80k6ovt0jx2kju28 192.168.160.100:2377

 

节点离开集群;

[root@localhost ~]# docker swarm leave
Node left the swarm.
[root@localhost ~]# docker node ls
ID                            HOSTNAME       STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
upral6mrlz1928ssrqrehjnr8 *   hostname-100   Ready     Active         Leader           20.10.21
so1xdgl2iudz0gobsnh60cgca     hostname-101   Down      Active                          20.10.21
i91jji6pecz0pic225aogilh7     hostname-102   Ready     Active                          20.10.21

删除swarm集群;

[root@localhost ~]# docker swarm leave -f
Node left the swarm.

当最后一个manager节点离开,则swarm集群自动删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值