• Docker Swarm服务的部署及相关操作

    服务是自 Docker 1.12 后新引入的概念,并且仅适用于 Swarm 模式。

    使用服务仍能够配置大多数熟悉的容器属性,比如容器名、端口映射、接入网络和镜像。此外还增加了额外的特性,比如可以声明应用服务的期望状态,将其告知 Docker 后,Docker 会负责进行服务的部署和管理。

    举例说明,假如某应用有一个 Web 前端服务,该服务有相应的镜像。测试表明对于正常的流量来说 5 个实例可以应对。那么就可以将这一需求转换为一个服务,该服务声明了容器使用的镜像,并且服务应该总是有 5 个运行中的副本。

    下面通过示例来看看如何创建刚刚描述的内容。

    使用 docker service create 命令创建一个新的服务。

    在 Windows 上创建新服务的命令也是一样的。然而本例中使用的是 Linux 镜像,它在 Windows 上并不能运行。请使用 Windows 的小伙伴将镜像替换为一个 Windows Web Server 的镜像,以便能正常运行。

    再次强调,在 PowerShell 终端中输入命令的时候,使用反引号(`)进行换行。

    $ docker service create --name web-fe \
    -p 8080:8080 \
    --replicas 5 \
    nigelpoulton/pluralsight-docker-ci

    z7ovearqmruwk0u2vc5o7ql0p

    需要注意的是,该命令与熟悉的 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 副本来使实际状态与期望状态保持一致。这一特性功能强大,使得服务在面对节点宕机等问题时具有自愈能力。

    1) 查看服务

    使用 docker service ls 命令可以查看 Swarm 中所有运行中的服务。

    $ docker service ls
    ID NAME MODE REPLICAS IMAGE PORTS
    z7o...uw web-fe replicated 5/5 nigel...ci:latest *:8080->8080/tcp

    输出显示有一个运行中的服务及其相关状态信息。比如,可以了解服务的名称,以及 5 个期望的副本(容器)中有 5 个是运行状态。

    如果在部署服务后立即执行该命令,则可能并非所有的副本都处于运行状态。这通常取决于各个节点拉取镜像的时间。

    执行 docker service ps 命令可以查看服务副本列表及各副本的状态。

    $ docker service ps web-fe
    ID NAME IMAGE NODE DESIRED CURRENT
    817...f6z web-fe.1 nigelpoulton/... mgr2 Running Running 2 mins
    a1d...mzn web-fe.2 nigelpoulton/... wrk1 Running Running 2 mins
    cc0...ar0 web-fe.3 nigelpoulton/... wrk2 Running Running 2 mins
    6f0...azu web-fe.4 nigelpoulton/... mgr3 Running Running 2 mins
    dyl...p3e web-fe.5 nigelpoulton/... mgr1 Running Running 2 mins

    此命令格式为 docker service ps <service-name or serviceid>。每一个副本会作为一行输出,其中显示了各副本分别运行在 Swarm 的哪个节点上,以及期望的状态和实际状态。

    关于服务更为详细的信息可以使用 docker service inspect 命令查看。

    $ docker service inspect --pretty web-fe
    ID: z7ovearqmruwk0u2vc5o7ql0p
    Name: Service
    Mode: Replicated
    Replicas: 5
    Placement:
    UpdateConfig:
    Parallelism: 1
    On failure: pause
    Monitoring Period: 5s
    Max failure ratio: 0
    Update order: stop-first
    RollbackConfig:
    Parallelism: 1
    On failure: pause
    Monitoring Period: 5s
    Max failure ratio: 0
    Rollback order: stop-first
    ContainerSpec:
    Image: nigelpoulton/pluralsight-docker-ci:latest@sha256:7a6b01...d8d3d
    Resources: Endpoint
    Mode: vip Ports:
    PublishedPort = 8080
    Protocol = tcp
    TargetPort = 8080
    PublishMode = ingress

    以上例子使用了 --pretty 参数,限制输出中仅包含最感兴趣的内容,并以易于阅读的格式打印出来。

    不加 --pretty 的话会给出更加详尽的输出。建议大家通读 docker inspect 命令的输出内容,其中不仅包含大量信息,也是了解底层运行机制的途径。

    2) 副本服务 vs 全局服务

    服务的默认复制模式(Replication Mode)是副本模式(replicated)。

    这种模式会部署期望数量的服务副本,并尽可能均匀地将各个副本分布在整个集群中。

    另一种模式是全局模式(global),在这种模式下,每个节点上仅运行一个副本。可以通过给 docker service create 命令传递 --mode global 参数来部署一个全局服务。

    3) 服务的扩缩容

    服务的另一个强大特性是能够方便地进行扩缩容。

    假设业务呈爆发式增长,则 Web 前端服务接收到双倍的流量压力。所幸通过一个简单的 docker service scale 命令即可对 web-fe 服务进行扩容。

    $ docker service scale web-fe=10
    web-fe scaled to 10

    该命令会将服务副本数由 5 个增加到 10 个。后台会将服务的期望状态从 5 个增加到 10 个。

    运行 docker service ls 命令来检查操作是否成功。

    $ docker service ls
    ID NAME NODE REPLICAS IMAGE PORTS
    z7o...uw web-fe replicated 10/10 nigel...ci:latest *:8080->8080/tcp

    执行 docker service ps 命令会显示服务副本在各个节点上是均衡分布的。

    $ docker service ps web-fe
    ID NAME IMAGE NODE DESIRED CURRENT
    nwf...tpn web-fe.1 nigelpoulton/... mgr1 Running Running 7 mins
    yb0...e3e web-fe.2 nigelpoulton/... wrk3 Running Running 7 mins
    mos...gf6 web-fe.3 nigelpoulton/... wrk2 Running Running 7 mins
    utn...6ak web-fe.4 nigelpoulton/... wrk3 Running Running 7 mins
    2ge...fyy web-fe.5 nigelpoulton/... mgr3 Running Running 7 mins
    64y...m49 web-fe.6 igelpoulton/... wrk3 Running Running about a min
    ild...51s web-fe.7 nigelpoulton/... mgr1 Running Running about a min
    vah...rjf web-fe.8 nigelpoulton/... wrk2 Running Running about a mins
    xe7...fvu web-fe.9 nigelpoulton/... mgr2 Running Running 45 seconds ago
    l7k...jkv web-fe.10 nigelpoulton/... mgr2 Running Running 46 seconds ago

    在底层实现上,Swarm 执行了一个调度算法,默认将副本尽量均衡分配给 Swarm 中的所有节点。

    各节点分配的副本数是平均分配的,并未将 CPU 负载等指标考虑在内。

    再次执行 docker service scale 命令将副本数从 10 个降为 5 个。

    $ docker service scale web-fe=5
    web-fe scaled to 5

    4) 删除服务

    删除一个服务的操作相对比较简单。

    如下 docker service rm 命令可用于删除之前部署的服务。

    $ docker service rm web-fe
    web-fe

    执行 docker service ls 命令以验证服务确实已被删除。

    $ docker service ls
    ID NAME MODE REPLICAS IMAGE PORTS

    请谨慎使用 docker service rm 命令,因为它在删除所有服务副本时并不会进行确认。

    5) 滚动升级

    对部署的应用进行滚动升级是常见的操作。长期以来,这一过程是令人痛苦的。我曾经牺牲了许多的周末时光来进行应用程序主版本的升级,而且再也不想这样做了。

    然而,多亏了 Docker 服务,对一个设计良好的应用来说,实施滚动升级已经变得简单多了!

    为了演示如何操作,下面将部署一个新的服务。但是在此之前,先创建一个新的覆盖网络(Overlay Network)给服务使用。

    这并非必须的操作,只是希望能够让大家了解如何创建网络并将服务接入网络。

    $ docker network create -d overlay uber-net
    43wfp6pzea470et4d57udn9ws

    该命令会创建一个名为 uber-net 的覆盖网络,接下来会将其与要创建的服务结合使用。覆盖网络是一个二层网络,容器可以接入该网络,并且所有接入的容器均可互相通信。

    即使这些容器所在的 Docker 主机位于不同的底层网络上,该覆盖网络依然是相通的。本质上说,覆盖网络是创建于底层异构网络之上的一个新的二层容器网络。

    如下图所示,两个底层网络通过一个三层交换机连接,而基于这两个网络之上是一个覆盖网络。

    两个底层网络通过一个三层交换机连接

更多...

加载中...