详情参考:http://c.biancheng.net/view/3176.html
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
1.初始化一个全新的 Swarm
(1)登录到 mgr1 并初始化一个新的 Swarm
docker swarm init \
--advertise-addr 10.0.0.1:2377 \
--listen-addr 10.0.0.1:2377
docker swarm init
会通知 Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点。同时也会使该节点开启 Swarm 模式。
--advertise-addr 指定其他节点用来连接到当前管理节点的 IP 和端口。这一属性是可选的,当节点上有多个 IP 时,可以用于指定使用哪个IP。此外,还可以用于指定一个节点上没有的 IP,比如一个负载均衡的 IP。
--listen-addr 指定用于承载 Swarm 流量的 IP 和端口。其设置通常与 --advertise-addr
相匹配,但是当节点上有多个 IP 的时候,可用于指定具体某个 IP。并且,如果 --advertise-addr 设置了一个远程 IP
地址(如负载均衡的IP地址),该属性也是需要设置的。建议执行命令时总是使用这两个属性来指定具体 IP 和端口。
Swarm 模式下的操作默认运行于 2337 端口。虽然它是可配置的,但 2377/tcp 是用于客户端与 Swarm 进行安全(HTTPS)通信的约定俗成的端口配置。
(2)列出 Swarm 中的节点。
docker node ls
(3)在 mgr1 上执行 docker swarm join-token
命令用来获取添加新的工作节点和管理节点到 Swarm 的命令和 Token
(4)登录到 wrk1,并使用包含工作节点接入 Token 的 docker swarm join
命令将其接入 Swarm。
docker swarm join \
--token SWMTKN-1-0uahebax...c87tu8dx2c \
10.0.0.1:2377 \
--advertise-addr 10.0.0.4:2377 \
--listen-addr 10.0.0.4:2377
2.Swarm服务的部署及相关操作
(1)使用 docker service create
命令创建一个新的服务。
docker service create --name web-fe \
-p 8080:8080 \
--replicas 5 \
nigelpoulton/pluralsight-docker-ci
需要注意的是,该命令与熟悉的 docker container run
命令的许多参数是相同的。这个例子中,使用 --name 和 -p 定义服务的方式,与单机启动容器的定义方式是一样的。
通过上面的命令和输出可以看出。使用 docker service creale
命令告知 Docker
正在声明一个新服务,并传递 --name 参数将其命名为 web-fe。将每个节点上的 8080 端口映射到服务副本内部的 8080
端口。接下来,使用 --replicas 参数告知 Docker 应该总是有 5 个此服务的副本。最后,告知 Docker
哪个镜像用于副本,重要的是,要了解所有的服务副本使用相同的镜像和配置。
敲击回车键之后,主管理节点会在 Swarm 中实例化 5 个副本,管理节点也会作为工作节点运行。相关各工作节点或管理节点会拉取镜像,然后启动一个运行在 8080 端口上的容器。
这还没有结束。所有的服务都会被 Swarm 持续监控,Swarm 会在后台进行轮训检查(Reconciliation
Loop),来持续比较服务的实际状态和期望状态是否一致。如果一致,则无须任何额外操作;如果不一致,Swarm 会使其一致。换句话说,Swarm
会一直确保实际状态能够满足期望状态的要求。
举例说明,假如运行有 web-fe 副本的某个工作节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4
个,从而不能满足期望状态的要求。Docker 变回启动一个新的 web-fe
副本来使实际状态与期望状态保持一致。这一特性功能强大,使得服务在面对节点宕机等问题时具有自愈能力。
(2)使用 docker service ls
命令可以查看 Swarm 中所有运行中的服务
docker service ls
(3)执行 docker service ps
命令可以查看服务副本列表及各副本的状态。
docker service ps web-fe
(4)关于服务更为详细的信息可以使用 docker service inspect
命令查看
docker service inspect --pretty web-fe
以上例子使用了 --pretty 参数,限制输出中仅包含最感兴趣的内容,并以易于阅读的格式打印出来。
不加 --pretty 的话会给出更加详尽的输出。
(5)副本服务vs全局服务
服务的默认复制模式(Replication Mode)是副本模式(replicated)。
这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。
另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本。可以通过给 docker service create
命令传递 --mode global 参数来部署一个全局服务。
(6)服务的扩缩容
假设业务呈爆发式增长,则 Web 前端服务接收到双倍的流量压力。所幸通过一个简单的 docker service scale
命令即可对 web-fe 服务进行扩容。
docker service scale web-fe=10
该命令会将服务副本数由 5 个增加到 10 个。后台会将服务的期望状态从 5 个增加到 10 个。
运行 docker service ls 命令来检查操作是否成功。
docker service scale web-fe=5
再次执行 docker service scale
命令将副本数从 10 个降为 5 个。
(7)删除服务
docker service rm web-fe
docker service rm
命令可用于删除之前部署的服务。
(8)滚动升级
对部署的应用进行滚动升级是常见的操作。长期以来,这一过程是令人痛苦的。我曾经牺牲了许多的周末时光来进行应用程序主版本的升级,而且再也不想这样做了。
然而,多亏了 Docker 服务,对一个设计良好的应用来说,实施滚动升级已经变得简单多了!
为了演示如何操作,下面将部署一个新的服务。但是在此之前,先创建一个新的覆盖网络(Overlay Network)给服务使用。
这并非必须的操作,只是希望能够让大家了解如何创建网络并将服务接入网络。
docker network create -d overlay uber-net
该命令会创建一个名为 uber-net 的覆盖网络,接下来会将其与要创建的服务结合使用。覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。
即使这些容器所在的 Docker 主机位于不同的底层网络上,该覆盖网络依然是相通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。
执行 docker network ls
来查看网络是否创建成功,且在 Docker 主机可见。
下面创建一个新的服务,并将其接入 uber-net 网络。
docker service create --name uber-svc \
--network uber-net \
-p 80:80 --replicas 12 \
nigelpoulton/tu-demo:v1
首先,将服务命名为 uber-svc,并用 --network 参数声明所有的副本都连接到 uber-net 网络。
然后,在整个 swarm 中将 80 端口暴露出来,并将其映射到 12 个容器副本的 80 端口。
最后,声明所有的副本都基于 nigelpoulton/tu-demo:v1 镜像。
执行 docker service ls
和 docker service ps
命令以检查新创建服务的状态。
通过对服务声明 -p 80:80 参数,会建立 Swarm 集群范围的网络流量映射,到达 Swarm 任何节点 80 端口的流量,都会映射到任何服务副本的内部 80 端口。
默认的模式,是在 Swarm 中的所有节点开放端口,称为入站模式(Ingress Mode)。此外还有主机模式(Host Mode),即仅在运行有容器副本的节点上开放端口
即使某个节点上并未运行服务的副本,依然可以进入该页面,所有节点都配置有映射,因此会将请求转发给运行有服务副本的节点。
update
假设本次投票已经结束,而公司希望开启一轮新的投票。现在已经为下一轮投票构建了一个新镜像,并推送到了 Docker Hub 仓库,新镜像的 tag 由 v1 变更为 v2。
此外还假设,本次升级任务在将新镜像更新到 Swarm 中时采用一种阶段性的方式,每次更新两个副本,并且中间间隔 20s。
那么就可以采用如下的 docker service update
命令来完成。
docker service update \
--image nigelpoulton/tu-demo:v2 \
--update-parallelism 2 \
--update-delay 20s uber-svc
仔细观察该命令,docker service update
通过变更该服务期望状态的方式来更新运行中的服务。
这一次我们指定了 tag 为 v2 的新镜像。接下来用 --update-parallelism 和 --update-delay
参数声明每次使用新镜像更新两个副本,其间有 20s 的延迟。最终,告知 Docker 以上变更是对 uber-svc 服务展开的。
(9)Docker Swarm服务日志及相关配置
Docker 节点默认的配置是,服务使用 json-file 日志驱动,其他的驱动还有 journald(仅用于运行有 systemd 的 Linux 主机)、syslog、splunk 和 gelf。
json-file 和 journald 是较容易配置的,二者都可用于 docker service logs
命令。
命令格式为:
docker service logs <service-name>