docker swarm

1.准备三台机器,分别安装docker,例如IP分别为:

        192.168.88.131,192.168.88.136,192.168.88.138

2.修改/etc/hostname 分别为:

        manger,node1,node2

3.分别修改/etc/hosts添加: 

        192.168.88.131  manger

        192.168.88.136  node1

        192.168.88.138  node2

4.分别关闭三台机器上的防火墙,如果是开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口,容器之间)端口。

创建swarm集群

初始化swarm

docker swarm init --advertise-addr 192.168.88.131

--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系

Swarm initialized: current node (ixsi4v1hsb0w5pcg5u71s5dfh) is now a manager.

To add a worker to this swarm, run the following command:
    # 这就是添加节点的方式
    docker swarm join --token SWMTKN-1-4xj9hgftxeu6nsqlxpk9k9b7fgh2urka9t80ofxorlzbyjrrvz-cgp4ie0h8jk15pcltzgljra0g 192.168.88.131:2377

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

注意:保存初始化后token,因为在节点加入时要使用token作为通讯的密钥

添加节点到swarm

在 192.168.88.136 与 192.168.88.139 上分别执行:

docker swarm join --token SWMTKN-1-4xj9hgftxeu6nsqlxpk9k9b7fgh2urka9t80ofxorlzbyjrrvz-cgp4ie0h8jk15pcltzgljra0g 192.168.88.131:2377

[root@node1]# docker swarm join --token SWMTKN-1-4xj9hgftxeu6nsqlxpk9k9b7fgh2urka9t80ofxorlzbyjrrvz-cgp4ie0h8jk15pcltzgljra0g 192.168.88.131:2377
This node joined a swarm as a worker.

注意:节点机器要能访问manger的2377端口

节点退出集群:docker swarm leave

master 解散集群:docker swarm leave --force

node 命令:

1.查看节点列表:docker node ls 
[root@manger]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ixsi4v1hsb0w5pcg5u71s5dfh *   manger     Ready     Active         Leader           20.10.16
2tdqxnzgn57na71p3uk7soqap     node1      Ready     Active                          20.10.16
hnqkyddxdr7tlxcec5bqmbn3d     node2      Ready     Active                          20.10.16

node ID旁边那个*号表示现在连接到这个节点上

2.更改节点的availablity状态: docker node update --availability drain node1
[root@manger]# docker node update --availability drain node1
node1
[root@manger]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ixsi4v1hsb0w5pcg5u71s5dfh *   manger     Ready     Active         Leader           20.10.16
2tdqxnzgn57na71p3uk7soqap     node1      Ready     Drain                           20.10.16
hnqkyddxdr7tlxcec5bqmbn3d     node2      Ready     Active                          20.10.16

swarm集群中node的availability状态可以为 active或者drain,其中:

active状态下,node可以接受来自manager节点的任务分派;

drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)

3.将node提升等级:docker node promote node1

swarm中部署服务

这里案例是部署nginx服务,分别在三台机器上安装了相同版本的nginx镜像,也可以只在manger上安装镜像,其他节点会自动拉取镜像,但这需要有网络

创建网络

docker network create -d overlay nginx_net

  • -d 参数用于指定网络驱动程序
  • overlay 是一种网络驱动程序的类型,网络驱动程序是 Docker 中用于实现容器间通信和网络隔离的组件。overlay 驱动程序是一种跨多个 Docker 宿主机的网络驱动程序,它允许创建分布式应用程序,其中容器可以在不同的宿主机上运行,并且仍然可以通过网络进行通信。当使用 overlay 驱动程序创建网络时,可以在不同的 Docker 宿主机上运行容器,并且它们可以通过该网络进行通信,就好像它们在同一台宿主机上运行一样。这对于构建分布式应用程序、容器编排和负载均衡非常有用。

服务部署

docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx:latest

在 Docker Swarm 模式下,docker service create 命令用于创建一个服务

  • --replicas 1:这指定了服务的副本数。在这个例子中,指定了 1 个副本,这意味着 Swarm 将确保始终有一个运行的容器实例来提供这项服务。

  • --network nginx_net:这指定了服务将连接到的网络。在这个例子中,服务使用的是名为 nginx_net 的网络,这是一个预先创建的网络,使用 overlay 驱动程序创建的,这允许跨多个 Docker 主机的容器通信。

注意:这里要指定镜像名和版本号

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

查看运行的服务

docker service ls

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

查看服务运行在哪个节点

docker service ps my_nginx

[root@manger ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
epy1sa80788b   my_nginx.1   nginx:latest   manger    Running         Running 2 minutes ago   

查询Swarm中服务的信息

docker service inspect --pretty my_nginx

在Swarm中动态扩展服务(scale)

docker service scale my_nginx=2

[root@manger ~]# docker service scale my_nginx=2
my_nginx scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@manger ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
f1l9qk1myxhh   my_nginx   replicated   2/2        nginx:latest   *:80->80/tcp
[root@manger ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
epy1sa80788b   my_nginx.1   nginx:latest   manger    Running         Running 8 minutes ago              
epj01r396741   my_nginx.2   nginx:latest   node1     Running         Running 16 seconds ago 

# manger上
[root@manger ~]# docker ps 
CONTAINER ID   IMAGE                        COMMAND                  CREATED          STATUS          PORTS                                                                                            NAMES
1aa09354770e   nginx:latest                 "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   80/tcp                                                                                           my_nginx.1.epy1sa80788bdzd84kvabhwy7

# node1上
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
362a88f3ff9a   nginx:latest   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   80/tcp    my_nginx.2.epj01r396741eu1tjq4prl4na

可以看到 replicas 为2, 当前2个服务运行在 manger,node1上

模拟宕机node节点,服务动态移动

如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。

# node1 上
[root@node1 ~]# systemctl stop docker

# manger 上
[root@manger ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ixsi4v1hsb0w5pcg5u71s5dfh *   manger     Ready     Active         Leader           20.10.16
2tdqxnzgn57na71p3uk7soqap     node1      Down      Active                          20.10.16
hnqkyddxdr7tlxcec5bqmbn3d     node2      Ready     Active                          20.10.16

[root@manger ~]# docker service ps my_nginx
ID             NAME             IMAGE          NODE      DESIRED STATE   CURRENT STATE                    ERROR     PORTS
epy1sa80788b   my_nginx.1       nginx:latest   manger    Running         Running 14 minutes ago                     
9jb9uzkdx0uz   my_nginx.2       nginx:latest   node2     Running         Running less than a second ago             
epj01r396741    \_ my_nginx.2   nginx:latest   node1     Shutdown        Running 6 minutes ago   

可以看到 node1的状态Down, 当前2个服务运行在 manger,node2上

在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上

Swarm 动态缩容服务(scale)

  • docker service scale my_nginx=1
[root@manger ~]# docker service scale my_nginx=1
my_nginx scaled to 1
overall progress: 1 out of 1 tasks 
1/1:   
verify: Service converged 
[root@manger ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
f1l9qk1myxhh   my_nginx   replicated   1/1        nginx:latest   *:80->80/tcp
[root@manger ~]# docker service ps my_nginx
ID             NAME             IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
epy1sa80788b   my_nginx.1       nginx:latest   manger    Running         Running 25 minutes ago             
9jb9uzkdx0uz   my_nginx.2       nginx:latest   node2     Shutdown        Complete 3 minutes ago             
epj01r396741    \_ my_nginx.2   nginx:latest   node1     Shutdown        Shutdown 3 minutes ago 

可以看到 replicas 为1, 当前1个服务运行在 manger上

  • docker service update --replicas 1 my_nginx
[root@manger ~]# docker service update --replicas 1 my_nginx
my_nginx
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@manger ~]# docker service ps my_nginx
ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
epy1sa80788b   my_nginx.1   nginx:latest   manger    Running         Running 27 minutes ago             
[root@manger ~]# 

使用 --replicas 缩容服务会清除掉停止的服务记录

重建节点服务

docker service update --force my_nginx

重启或者在不同的节点上重建特定的服务副本

删除swarm服务

docker service rm my_nginx

[root@manger ~]# docker service rm my_nginx
my_nginx
[root@manger ~]# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS
[root@manger ~]# docker service ps my_nginx
no such service: my_nginx

swarm + docker-compose 

vim docker-compose.yml

version: "3"
services:
  nginx:
    image: nginx:latest
    ports:
      - 8888:80
    deploy:
      mode: replicated
      replicas: 3
 
  visualizer:
    image: dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
 
  portainer:
    image: portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

deploy:

  • mode: replicated: 指定部署模式为复制模式,这是 Swarm 服务的默认模式,意味着服务会在多个节点上复制运行。
  • replicas: 3: 指定启动 nginx 服务的副本数为 3。Swarm 会确保有三个 nginx 容器在集群中运行。
  • replicas: 1: 该服务只有一个副本。
  • placement: constraints: [node.role == manager]: 限制该服务只能部署在manger节点上。

 docker stack deploy --compose-file=docker-compose.yml deploy_deamon

[root@manger docker-swarm]# docker service ls
ID             NAME                       MODE         REPLICAS   IMAGE                             PORTS
yatq3t8u6wn5   deploy_deamon_nginx        replicated   3/3        nginx:latest                      *:8888->80/tcp
47wbd3gxdm72   deploy_deamon_portainer    replicated   1/1        portainer/portainer:latest        *:9000->9000/tcp
b3o2nhue4eb3   deploy_deamon_visualizer   replicated   1/1        dockersamples/visualizer:latest   *:8080->8080/tcp

[root@manger docker-swarm]# docker service ps deploy_deamon_nginx
ID             NAME                    IMAGE          NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
rc6zyh66ywte   deploy_deamon_nginx.1   nginx:latest   manger    Running         Running about an hour ago             
0lcd8qs5vvhy   deploy_deamon_nginx.2   nginx:latest   node1     Running         Running about an hour ago             
ic824cfmnyg9   deploy_deamon_nginx.3   nginx:latest   node2     Running         Running about an hour ago             

[root@manger docker-swarm]# docker service ps deploy_deamon_portainer
ID             NAME                        IMAGE                        NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
opp4pwveq35q   deploy_deamon_portainer.1   portainer/portainer:latest   manger    Running         Running about an hour ago             

[root@manger docker-swarm]# docker service ps deploy_deamon_visualizer
ID             NAME                         IMAGE                             NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
dljxa28dx9fh   deploy_deamon_visualizer.1   dockersamples/visualizer:latest   manger    Running         Running about an hour ago    
docker swarm 共享存储卷 

共享存储卷,可以使用外部NFS做为共享卷来存储服务的持久化数据,也是可以Docker Swarm的本地volume卷来存储数据,这里两种方式都有具体操作,但是建议使用本地volume来存储。
Docker Swarm 的共享存储卷功能会自动在集群中的多个节点之间分布共享存储卷的数据,并保证数据的一致性和可用性。它内部使用了分布式文件系统来存储数据,并提供一个统一的接口,让容器可以访问存储卷中的数据。

💡 具体来说,Docker Swarm 会在集群中的每个节点上创建一个存储卷的副本,并使用复制策略来保证每个副本中的数据都是一致的。这样,当容器在某个节点上进行写操作时,Docker Swarm 会自动将写操作同步到其它节点的副本中,保证数据的一致性。同时,Docker Swarm 还会监控每个存储卷的状态,如果某个存储卷的副本出现故障,Docker Swarm 会自动在其它节点上创建新的副本,以保证存储卷的可用性。

总之,Docker Swarm 的共享存储卷功能可以方便地解决容器之间共享数据的问题,并保证数据的安全性和可用性。

注意:

在 Docker Swarm 模式下,当使用 docker stack deploy 来部署一个应用栈时,不能再使用 docker-compose 命令来管理这些服务。这是因为 docker-compose 主要用于单机部署,而 docker stack 是为了与 Docker Swarm 一起工作而设计的。对于在 Swarm 集群中部署的服务,需要使用 docker service 命令来管理它们。

下面是一些常见的 docker-compose 命令及其在 Docker Swarm 模式下的替代命令:

  1. 查看服务状态(docker-compose ps 替代)

    使用 docker service ls 查看所有服务,或者使用 docker service ps <service_name> 查看特定服务的任务(容器)。

    # 查看所有服务 docker service ls 
    # 查看特定服务的任务状态 例如,对于 "nginx" 服务
    docker service ps deploy_deamon_nginx 
  2. 重启服务(docker-compose restart 替代)

    Docker Swarm 没有直接的重启命令,但你可以通过更新服务来达到类似的效果。更新服务时,可以更改服务的配置或者保持不变,Swarm 都会重新启动服务的任务。

    docker service update --force <service_name>
  3. 查看日志(docker-compose logs 替代)

    使用 docker service logs 查看服务的日志。

    docker service logs <service_name>
  4. 扩展或缩小服务(docker-compose scale 替代)

    使用 docker service scale 调整服务的副本数。

    docker service scale <service_name>=<number_of_replicas>
  5. 停止并移除服务(docker-compose down 替代)

    使用 docker stack rm 停止并移除整个应用栈,或者使用 docker service rm 移除特定服务。

    # 移除整个应用栈 
    docker stack rm deploy_deamon 
    
    # 移除特定服务 
    docker service rm deploy_deamon_nginx

haproxy

vim haproxy.cfg

global
    daemon
    maxconn 25600
defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
frontend http-in
    bind *:80
    default_backend servers
backend servers
    server server1 192.168.88.100:8080 check weight 1 maxconn 200 inter 5000 rise 2 fall 2
    server server2 192.168.88.101:8080 check weight 1 maxconn 200 inter 5000 rise 2 fall 2
    server server3 192.168.88.102:8080 check weight 1 maxconn 200 inter 5000 rise 2 fall 2
    server server4 192.168.88.103:8080 check weight 1 maxconn 200 inter 5000 rise 2 fall 2

vim Dockerfile

FROM haproxy
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

haproxy.cfg配置文件是为HAProxy负载均衡器设置的,用于分配HTTP流量到后端的服务器。下面是配置文件内容的逐行解释及其作用:

Global Section

  • global:这部分的配置适用于整个HAProxy实例。
    • daemon:以守护进程模式运行HAProxy,使其在后台执行。
    • maxconn 25600:全局最大并发连接数设置为25600。这是HAProxy可以同时处理的最大连接数。

Defaults Section

  • defaults:这些设置将应用于后面没有特别指定的所有前端(frontend)和后端(backend)。
    • mode http:工作模式设置为HTTP,意味着HAProxy将理解并可以处理HTTP协议。
    • timeout connect 5000ms:连接超时设置为5000毫秒(5秒)。如果HAProxy在5秒内无法建立到后端服务器的连接,则认为尝试失败。
    • timeout client 50000ms:客户端超时设置为50000毫秒(50秒)。这意味着客户端在50秒内没有发送请求,则HAProxy将关闭客户端连接。
    • timeout server 50000ms:服务器超时设置为50000毫秒(50秒)。这意味着如果后端服务器在50秒内没有响应,则HAProxy将关闭到服务器的连接。

Frontend Section

  • frontend http-in:定义了一个名为http-in的前端,这是接收客户端请求的入口点。
    • bind *:80:监听所有IP地址上的80端口,用于接收进入的HTTP请求。
    • default_backend servers:将流量转发到名为servers的后端。

Backend Section

  • backend servers:定义了一个名为servers的后端,包含了多个后端服务器的列表,HAProxy将向这些服务器转发请求。
    • server1, server2, server3: 这些是后端服务器的名称,用于在HAProxy配置中标识不同的服务器。

    • check: 启用健康检查。HAProxy会定期检查后端服务器以确保它们能够接收请求。

    • weight 1: 服务器的权重。在负载均衡算法中使用,权重越高的服务器将接收更多的请求。在这个配置中,所有服务器的权重都被设置为1,意味着它们将平等地接收请求。

    • maxconn 200: 每个服务器的最大并发连接数设置为200。这是为了限制指向单个服务器的并发连接数,以防服务器过载。

    • inter 5000: 健康检查的间隔时间,单位为毫秒。在这里,每5秒执行一次健康检查。

    • rise 2: 在将服务器标记为健康之前,需要连续通过健康检查的次数。这里设置为2,意味着如果服务器连续两次健康检查都成功,则将其视为健康。

    • fall 2: 在将服务器标记为不健康之前,允许健康检查失败的次数。这里设置为2,意味着如果服务器连续两次健康检查都失败,则将其视为不健康。

通过上述配置,HAProxy将会以轮询的方式(如果没有指定其他负载均衡算法的话)将接收到的HTTP请求分发给定义在servers后端中的四台服务器。每个后端服务器都被配置了健康检查,确保只有正常运行的服务器才会接收到流量。此配置适用于需要高可用性和负载均衡的应用场景。

参考 :https://www.cnblogs.com/zhujingzhi/p/9792432.html#_label0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值