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

创建swarm集群

初始化swarm

docker swarm init –advertise-addr192.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:2377To 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:2377This node joined a swarm as a worker.

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

node 命令:

1.查看节点列表:docker node ls
[root@manger]# docker node lsIDHOSTNAME STATUSAVAILABILITY MANAGER STATUS ENGINE VERSIONixsi4v1hsb0w5pcg5u71s5dfh * manger Ready Active Leader 20.10.162tdqxnzgn57na71p3uk7soqap node1Ready Active20.10.16hnqkyddxdr7tlxcec5bqmbn3d node2Ready Active20.10.16

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

2.更改节点的availablity状态:docker node update –availability drain node1
[root@manger]# docker node update --availability drain node1node1[root@manger]# docker node lsIDHOSTNAME STATUSAVAILABILITY MANAGER STATUS ENGINE VERSIONixsi4v1hsb0w5pcg5u71s5dfh * manger Ready Active Leader 20.10.162tdqxnzgn57na71p3uk7soqap node1Ready Drain 20.10.16hnqkyddxdr7tlxcec5bqmbn3d node2Ready Active20.10.16

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

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

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

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:latestf1l9qk1myxhhecvkhmb880s7zoverall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged 

查看运行的服务

docker service ls

[root@manger]# docker service lsID NAME MODE REPLICAS IMAGEPORTSf1l9qk1myxhh my_nginx replicated 1/1nginx:latest *:80->80/tcp

查看服务运行在哪个节点

docker service ps my_nginx

[root@manger ~]# docker service ps my_nginxID NAME IMAGENODEDESIRED STATE CURRENT STATE ERROR PORTSepy1sa80788b my_nginx.1 nginx:latest mangerRunning 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=2my_nginx scaled to 2overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged [root@manger ~]# docker service lsID NAME MODE REPLICAS IMAGEPORTSf1l9qk1myxhh my_nginx replicated 2/2nginx:latest *:80->80/tcp[root@manger ~]# docker service ps my_nginxID NAME IMAGENODEDESIRED STATE CURRENT STATEERROR PORTSepy1sa80788b my_nginx.1 nginx:latest mangerRunning Running 8 minutes agoepj01r396741 my_nginx.2 nginx:latest node1 Running Running 16 seconds ago # manger上[root@manger ~]# docker ps CONTAINER ID IMAGECOMMANDCREATEDSTATUSPORTSNAMES1aa09354770e nginx:latest "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 80/tcp my_nginx.1.epy1sa80788bdzd84kvabhwy7# node1上[root@node1 ~]# docker psCONTAINER ID IMAGECOMMANDCREATED STATUS PORTS NAMES362a88f3ff9a nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcpmy_nginx.2.epj01r396741eu1tjq4prl4na

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

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

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

# node1 上[root@node1 ~]# systemctl stop docker# manger 上[root@manger ~]# docker node lsIDHOSTNAME STATUSAVAILABILITY MANAGER STATUS ENGINE VERSIONixsi4v1hsb0w5pcg5u71s5dfh * manger Ready Active Leader 20.10.162tdqxnzgn57na71p3uk7soqap node1DownActive20.10.16hnqkyddxdr7tlxcec5bqmbn3d node2Ready Active20.10.16[root@manger ~]# docker service ps my_nginxID NAME IMAGENODEDESIRED STATE CURRENT STATEERROR PORTSepy1sa80788b my_nginx.1 nginx:latest mangerRunning 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 ShutdownRunning 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=1my_nginx scaled to 1overall progress: 1 out of 1 tasks 1/1: verify: Service converged [root@manger ~]# docker service lsID NAME MODE REPLICAS IMAGEPORTSf1l9qk1myxhh my_nginx replicated 1/1nginx:latest *:80->80/tcp[root@manger ~]# docker service ps my_nginxID NAME IMAGENODEDESIRED STATE CURRENT STATEERROR PORTSepy1sa80788b my_nginx.1 nginx:latest mangerRunning Running 25 minutes ago 9jb9uzkdx0uz my_nginx.2 nginx:latest node2 ShutdownComplete 3 minutes ago epj01r396741\_ my_nginx.2 nginx:latest node1 ShutdownShutdown 3 minutes ago 

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

  • docker service update –replicas 1 my_nginx
[root@manger ~]# docker service update --replicas 1 my_nginxmy_nginxoverall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [root@manger ~]# docker service ps my_nginxID NAME IMAGENODEDESIRED STATE CURRENT STATEERROR PORTSepy1sa80788b my_nginx.1 nginx:latest mangerRunning 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_nginxmy_nginx[root@manger ~]# docker service lsIDNAMEMODEREPLICAS IMAGE PORTS[root@manger ~]# docker service ps my_nginxno such service: my_nginx

swarm + docker-compose

vim docker-compose.yml

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

deploy:

  • mode: replicated: 指定部署模式为复制模式,这是 Swarm 服务的默认模式,意味着服务会在多个节点上复制运行。
  • replicas: 3: 指定启动 nginx 服务的副本数为 3。Swarm 会确保有三个 nginx 容器在集群中运行。
  • replicas: 1: 该服务只有一个副本。
  • placement: constraints: [node.role == manager]: 限制该服务只能部署在manger节点上。
[root@manger docker-swarm]# docker service lsID NAME MODE REPLICAS IMAGE PORTSyatq3t8u6wn5 deploy_deamon_nginxreplicated 3/3nginx:latest*:8888->80/tcp47wbd3gxdm72 deploy_deamon_portainerreplicated 1/1portainer/portainer:latest*:9000->9000/tcpb3o2nhue4eb3 deploy_deamon_visualizer replicated 1/1dockersamples/visualizer:latest *:8080->8080/tcp[root@manger docker-swarm]# docker service ps deploy_deamon_nginxID NAMEIMAGENODEDESIRED STATE CURRENT STATE ERROR PORTSrc6zyh66ywte deploy_deamon_nginx.1 nginx:latest mangerRunning 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_portainerID NAMEIMAGENODEDESIRED STATE CURRENT STATE ERROR PORTSopp4pwveq35q deploy_deamon_portainer.1 portainer/portainer:latest mangerRunning Running about an hour ago [root@manger docker-swarm]# docker service ps deploy_deamon_visualizerID NAME IMAGE NODEDESIRED STATE CURRENT STATE ERROR PORTSdljxa28dx9fh deploy_deamon_visualizer.1 dockersamples/visualizer:latest mangerRunning Running about an hour ago

注意:

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

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

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

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

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

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

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

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

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

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

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

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

    # 移除整个应用栈 docker stack rm deploy_deamon # 移除特定服务 docker service rm deploy_deamon_nginx
  6. 更新服务配置(docker-compose up -d 替代)

    当你更改了 docker-compose.yml 文件并希望应用这些变更时,可以重新执行 docker stack deploy

    docker stack deploy -c docker-compose.yml deploy_deamon

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