不包含在任何 Swarm 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式。一旦被加入 Swarm 集群,则切换为 Swarm 模式。第一步我们要做的就是初始化 Swarm。
将本机作为manager节点
docker swarm init --advertise-addr 192.168.xxx.xxx
docker warm init
会通知 Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点,同时也会使该节点开Swarm 模式。
--advertise-addr
参数配置当前管理节点的发布地址,其他节点必须能连接这个地址。在机器只有一个ip的情况下可以省略,如果由多个ip则必须手动指定。
可以通过以下命令查看集群和节点的状态
docker info
其它节点可以以工作节点或管理节点的方式加入集群,执行的命令,可以在管理节点运行以下命令查看:
docker swarm join-token worker # 查看工作节点加入集群的指令和令牌
docker swarm join-token manager # 查看管理节点加入集群的指令和令牌
docker swarm 搭建好集群,我们目的在集群中部署应用。swarm集群部署应用最基本的命令是docker service,它的使用方式类似 docker container,也适用于部署单个应用,都不能进行编排(后续引入docker stack类似集群下的docker compose),只不过一个用于单机,一个用于集群
下面以在swarm集群中部署nginx为例:
默认的情况下,管理节点也是一个工作节点,服务也会部署在了管理节点上,如果我们不希望服务部署在管理节点上的话,可以将管理节点设置为darin状态。
执行以下命令将管理节点设置威darin
docker node update --availability drain server
我这里因为只有一台机子,因此我就不设置为drain了
之后执行以下命令部署nginx应用:
docker service create --name nginx-test --replicas 2 -p 8080:80 nginx:1.21.6
swarm集群中进行应用部署使用docker swarm create命令,该命令与熟悉的 docker container run 命令的许多参数是相同的,上面的命令中声明基于nginx镜像部署应用,服务名称为nginx-test,将容器内部的80端口映射到集群网络的8080端口,–replicas 2在集群节点之中保持2个服务副本(即两个容器)。
运行以下命令查看服务以及查看服务详情
docker service ls
docker service ps nginx-test
我们创建的所有服务都会被 Swarm 持续监控,Swarm 会在后台进行轮训检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致。如果一致,则无须任何额外操作;如果不一致,Swarm 会使其一致。换句话说,Swarm 会一直确保实际状态能够满足期望状态的要求。
例如这里的两个nginx的容器其中一个宕机了,swarm会重新启动一个副本,让正常运行的nginx容器始终保持在两个,这使得服务在面对节点宕机等问题时具有自愈能力。
这里如果有多台机器加入了集群,每个机器的ip:8080都能访问到nginx服务
因为默认情况下swarm集群采用ingress模式发布端口,通过路由网格模式让我们发布的端口在集群每一个节点上口都可以访问,再通过内部的负载均衡自动转发到实际的运行的容器之中。具体可参考这篇文章
我们的应用在实际的应用中可能会根据访问量进行扩容、缩容,即根据实际情况调整容器启动的数量,通过docker service scale命令可以很方便得进行操作。例如下面将nginx容器扩展到4个
docker service scale nginx-test=4
docker service update --publish-add 8081:80 nginx-test