docker 3剑客

时间:2019-11-21
本文章向大家介绍docker 3剑客,主要包括docker 3剑客使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.Swarm 集群

Swarm 集群( Cluster )为 组被统一管理起来的 Docker 主机 集群是 Swarm 所管理的对象 这些主机通过 Docker 引擎的 Swarm 模式相互沟通,其中部分主机可能作为管理节点(manager )响应外部的管理请求,其他主机作为工作节点( worker )来实际运行 Docker 容器。当然,同一个主机也可以即作为管理节点,同时作为工作节点。

当用户使用 Swarm 集群时,首先定义 个服务(指定状态、复制个数、网络、存储、暴露端口等),然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。

 

2.节点

节点(Node )是 Swarm 集群的最小资源单位 每个节点实际上都是一台 Docker 主机。

Swarm 集群中节点分为两种:

第一种:管理节点(manager node ):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点 同时,多个管理节点之间通过 Raft 协议构成共识 一般推荐每个集群设置5个或 7个管理节点;

第二种:工作节点( worker node ):负责执行管理节点安排的具体任务 默认情况下,管理节点自身也同时是工作节点 每个工作节点上运行代理( agent )来汇报任务完成情况。用户可以通过 docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote 命令来将一个管理节点降级为工作节点

 

3.服务

服务( Se ice )是 Docker 支持复杂多容器协作场景的利器。一个服务可以由若干个任务组成,每个任务为某个具体的应用 服务还包括对应的存储、网络、端口映射、副本个数、访问配置、升级配置等附加参数。

一般来说,服务需要面向特定的场景,例如一个典型的 Web 服务可能包括前端应用、后端应用,以及数据库等,这些应用都属于该服务的管理范畴。

Swarm 集群中服务类型也分为两种(可以通过-mode 指定):

第一种:复制服务( replicated services )模式:默认模式,每个任务在集群中会存在若干副本,

这些副本会被管理节点按照调度策略分发到集群中的工作节点上,此模式下可以使用–replicas 参数设置副本数量。

第二种:全局服务( global services )模式 调度器将在每个可用节点都执行一个相同的任务。该模式适合运行节点的检查,如监控应用等

 

4.任务

任务是 Swarm 集群中最小的调度单位,即一个指定的应用容器。例如仅仅运行前端业务的前端容器 任务从生命周期上将可能处于创建( NEW)、等待( PENDING)、分配( ASSIGNED )、接受( ACCEPTED )、准备( PREPARING )、开始( STARTING )、运行(RUNNING)、完成(COMPLETE )、失败(FAILED )、关闭( SHUTDOWN)、 拒绝(REJECTED)、孤立(ORPHANED )等不同状态。

Swarm 集群中的管理节点会按照调度要求将任务分配到工作节点上。例如指定副本为2时,可能会被分配到两个不同的工作节点上。一旦当某个任务被分配到 一个工作节点,将无法被转移到另外的 作节点,即 Swarm 中的任务不支持迁移。

 

5.服务的外部访问

Swarm 集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。

Swarm 中支持入口负载均衡( ingress load baancing )的映射模式,该模式下,每个服务都会被分配一个公开端口( PublishedPort ),该端口在集群中任意节点上都可以访问到,并被保留给该服务。

当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。

 

使用 Swarm

 

用户在安装 Docker 1.12 更新的版本后 ,即可直接尝试 Swarm 模式的相关功能。假定分别准备两个 Linux 主机,作为管理节点(实际上也同时具备 作节点功能)和工作节点。

下面来演示 Swarm 集群的主要操作,包括:

  1. swarm init :            在管理节点上 建一个集群;
  2. node list :                  列出集群中的节点信息;
  3. swarm join                加入一个新的节点到已有集群中;
  4. swarm update :     更新一个 Swar 集群;
  5. swarm leave :         离开 Swarm 集群

此外,还可以使用 docker service 命令部署 Docker 应用服务到集群中;

1.创建集群

[root@ken1 ~]# docker swarm init  --advertise-addr 192.168.64.4
Swarm initialized: current node (70k014efwg9fiwsy8x83qm5g2) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0uunq2g8r48b2bm47b9x5xqmkhmzesoi9grwjroh4y3w5q9yek-5jalfma30b0bx36lyxs09ppw8 192.168.64.4:2377

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

 

注意返回的 token 串,这是集群的唯 id 加人集群的各个节点将需要这个信息。另外,默认的管理服务端口为 2377 ,需要能被工作节点访问到;另外,为了支持集群的成员发现和外部服务映射,还需要再所有节点上开启 7946 TCP/UDP 端口和 4789 UDP 端口。

 

2.查看集群信息

 

[root@ken1 ~]# docker info
...
 Swarm: active
  NodeID: 70k014efwg9fiwsy8x83qm5g2
  Is Manager: true
  ClusterID: l7dgzb3ec2uwcpimjktv5gs33
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
...

 

还可以查看集群中已经加入的节点情况,此时只有 个管理节点:

[root@ken1 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
70k014efwg9fiwsy8x83qm5g2 *   ken1                Ready               Active              Leader              19.03.2

 

3.加入集群

在所有要加入集群的普通节点上面执行 warm joi 口命令,表示把这台机器加入指定集群当中,例如,在工作节点上,将其加入刚创建的集群, 则可以通过:

[root@ken2 ~]# docker swarm join --token SWMTKN-1-0uunq2g8r48b2bm47b9x5xqmkhmzesoi9grwjroh4y3w5q9yek-5jalfma30b0bx36lyxs09ppw8 192.168.64.4:2377
This node joined a swarm as a worker.

 

此时,在管理节点上再次查看集群中节点情况,可以看到新加入的工作节点:

[root@ken1 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
70k014efwg9fiwsy8x83qm5g2 *   ken1                Ready               Active              Leader              19.03.2
2uah6pnxtntaim4kfyzal5enn     ken2                Ready               Active                                  19.03.2

 

4.使用集群服务

那么,怎么使用 Swarm 提供的服务呢?

实际上有两种方法,一种是使用 Docker 原来的客户端命令,只要指定使用 Swarm manager 务的监昕地址即可 例如, manager 服务监听的地址为 manager ip:2377 ,则可以通过指定–<manager ip >:2377 选项来继续使用 Docker 客户端,执行任意 Docker 命令,例如 ps、info、run等

另外一种方法,也是推荐的做法,是使用新的 docker ervice 命令,可以获得包括多主机网络等更高级的特性支持。

建好 Swarm 集群后,可以在管理节点上执行如下命令来快速创建一个应用服务,并制定服务的复制份数为2, 如下命令所示,默认会自动检查确认服务状态都正常:

[root@ken1 ~]# docker service create --replicas 2 --name busybox1 busybox  sleep 5000
xojgs96mpw17tgowr445t82p5
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 

 

1.查看服务

此时使用 service ls 查看集群中服务情况,会发现新创建的busybox1服务;

[root@ken1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xojgs96mpw17        busybox1            replicated          2/2                 busybox:latest     

 

还可通过service inspect 命令来查看服务的具体信息:

[root@ken1 ~]# docker inspect busybox1
[
    {
        "ID": "xojgs96mpw17tgowr445t82p5",
        "Version": {
            "Index": 16
        },
        "CreatedAt": "2019-09-17T14:46:57.080074484Z",
        "UpdatedAt": "2019-09-17T14:46:57.080074484Z",
        "Spec": {
            "Name": "busybox1",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "busybox:latest@sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e",
                    "Args": [
                        "sleep",
                        "5000"
                    ],
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "Architecture": "arm64",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "386",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "ppc64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "s390x",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 2
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        }
    }
]

 

同时 ,管理节点和工作节点上都运行了一个容器

[root@ken1 ~]# docker service ps busybox1
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
sbintlu2r2xv        busybox1.1          busybox:latest      ken2                Running             Running 2 minutes ago                       
fantjwn1sx5h        busybox1.2          busybox:latest      ken1                Running             Running 2 minutes ago        

 

2.扩展服务

用户还可以通过 docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>命令来对服务进行伸缩, 例如将服务复制个数从 改为 1:

[root@ken1 ~]# docker service scale busybox1=1
busybox1 scaled to 1
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

 

查看服务

[root@ken1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xojgs96mpw17        busybox1            replicated          1/1                 busybox:latest   

 

3.删除服务

服务使用完成后可以通过 docker service rm <SERVICE-ID> 命令来进行删除,服务命令更多的参数可以通过 docker service help 进行查看

[root@ken1 ~]# docker service rm busybox1
busybox1
[root@ken1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS

 

4.使用外部服务地址

Swarm 通过路由机制支持服务对外映射到指定端口,该端口可 以在集群中任意节点上进行访问,即使该节点上没有运行服务实例 需要在创建服务时使用–publish 参数:

[root@ken1 ~]# docker service create --name nginx --publish published=80,target=80 nginx
fwbclecrj9es6yu64ttflb7fa
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

 

查看服务

[root@ken1 ~]# docker service ps nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
s49uxbq8gxix        nginx.1             nginx:latest        ken1                Running             Running 47 seconds ago            

 

可以发现在ken1节点和ken2节点都开启了80端口,在浏览器可以指定任意一个节点IP都可以访问。

ken1节点

[root@ken1 ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::2377                                               :::*                  
LISTEN     0      128                                    :::7946                                               :::*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*         

 

ken2节点

[root@ken2 ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::7946                                               :::*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*  

 

之后,用户访问集群中任意节点的,都会被 Swarm 的负载均衡器代理到对应的服务实例。用户也可以配置独立的负载均衡服务,后端指向集群中各个节点对应的外部端口,获取高可用特性。

 

5.离开集群

节点可以在任何时候通过 warm leave 命令离开一个集群 命令格式为 docker swarm leave [OPT ONS ], 支持-f ,–force意味着强制离开集群.

 

使用服务命令

 

Swarm 提供了对应用服务的良好的支持,使用 Swarm 集群可以充分满足应用服务可扩展、高可用的需求。 Docker 通过 servic 命令来管理应用服务,主要包括 create,inspect,logs,ls,ps,rm,rollback scale,update 等若干子命令

 

总结

用户可以将若Docker 主机节点组成的集群当作一个大的虚拟 Docker 主机使用,并且,原先基于单机的Docker 应用,可以无缝地迁移到 Swarm 上来。通过使用服务, Swarm 集群可以支持多个应

用构建的复杂业务,并很容易对其进行升级等操作。在生产环境中, Swarm 管理节点要考虑高可用性和安全保护,一方面多个管理节点应该分配到不同的容灾区域,另一方面服务节点应该配合数字证书等手段限制访问。Swarm 功能已 经被无缝嵌入到了 Docker 1.12+版本中,用户今后可 直接使用 Docker命令来完成相关功能 配置,对 Swarm 集群的管理更加简便.

原文地址:https://www.cnblogs.com/itzhao/p/11903877.html