Docker swarm 模式初体验

本文介绍了Docker Swarm模式的基础概念,如Swarm、节点、服务和任务,并通过实际操作展示了如何创建Swarm、添加节点、部署服务、伸缩服务、进行滚动更新以及管理节点的上下线。内容涵盖Docker Swarm的初始化、服务部署、负载均衡和故障恢复等关键步骤。
摘要由CSDN通过智能技术生成

Docker swarm 模式初体验

本教程将介绍 Docker Engine Swarm 模式。先介绍 swarm 模式几个关键的概念,然后通过动手实践带你体验一下 swarm 模式。

几个关键概念

Swarm

Docker Engline 中集成的集群管理和编排功能都是基于 SwarmKit 实现。参与到集群中的 Docker Engine 会进入 swarm 模式。比如初始化一个 swarm 或加入已有的 swarm。

一个 swarm 就是个一个 Docker Engine 集群,你可以在上面部署服务。Docker Engine CLI 提供了用于 swarm 管理的命令,比如添加或移除一个节点。同样还提供了用于部署服务到 swarm 和管理服务编排的命令。

当 Docker Engine 运行在 swarm 模式时,你管理容器。当 Docker Engine 运行在 swarm 模式时,你编排服务。

节点

每个参与到 swarm 中的 Docker Engine 都称之为一个节点。

将服务的定义提交到管理节点即可将应用部署到 swarm。然后管理节点将叫作任务的工作单元分发到工作节点。

为了维持 swarm 的目标状态,管理节点还将承当编排和集群管理的功能。一般有多个管理节点,它们之间会选出一个领导来进行编排任务。

工作节点接收并执行来自管理节点分发的任务。默认情况下,管理节点也是工作节点,你可以把它配置成只当管理节点。代理通知管理节点已分配任务的当前状态,以便管理节点维护所需的状态。

服务和任务

服务定义了需要在工作节点上执行的任务。它是 swarm 系统的中心结构,也是用户和 swarm 交互的主要根源。

服务包括要使用的容器镜像,以及在容器中执行的指令。

对于复制服务,管理节点根据服务的规模和目标状态将一定数量的任务副本分发到各节点上。

对于全局服务,每个节点上都将分发一个任务副本。

任务包含一个容器和需要在容器中执行的指令。它是 swarm 原子调度单位。管理节点根据服务规模中定义的副本数量将任务分配给工作节点。一旦某个任务被分配到某个节点,就不能再移动到其他节点。它只能在分配的节点上运行或者失败。

负载均衡

swarm 管理节点使用 入口负载均衡 的方式暴露你想要让外部访问的服务。Swarm 管理节点可以自动将一个服务分配到某个 发布端口,或者你可以为服务指定一个发布端口。你可以指定任意未使用的端口。如果你没指定端口,swarm 管理节点将为服务指定一个 30000-32757 之间的端口。

外部组件,比如云负载均衡器,可以通过集群中的任意节点访问发布端口上的服务,不管当前节点上是否有服务对应的任务在运行,swarm 中的所有节点都会将进入连接路由到正在运行任务的实例上。

Swarm 模式有一个内置的 DNS 组件,它会自动给 swarm 中的每个服务分配一个 DNS 条目。Swarm 管理器使用internal load balancing 基于服务对应的 DNS 名称在服务之间分发请求。

开始实践

本教程将指导你完成以下任务:

  • 在 Docker Engline swarm 模式下初始化一个集群
  • 添加节点到 swarm
  • 部署服务到 swarm
  • 在一切就绪后管理 swarm

准备工作

在开始本教程之前,你需要准备一下几样东西:

  • 三台通过网络连接的主机
  • 每台主机安装 Docker Engine 1.12 或更新版本
  • 充当管理节点的主机 IP
  • 主机之间开发下面提到的端口

主机之间端口开放

主机之间的以下端口必须是开放。某些环境下,这些端口默认是允许的:

  • TCP 端口 2377 用于集群管理通信(管理节点)
  • TCP 和 UDP 端口 7946 用于节点间通信(所有节点)
  • TCP 和 UDP 端口 4789 用于 overlay 网络流量(所有节点)

如果你的这些端口没有打开,可以用iptables命令打开它们:

iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT

创建 swarm

创建一个 swarm

随意选择一个主机作为管理节点,在上面初始化一个 swarm:

chao@manager01:~$ docker swarm init --advertise-addr 192.168.59.128
Swarm initialized: current node (7ik7wqhe5wcag8k5tp816c7ck) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-0p0p5f96e1w4xblhw2eeookrv46spwf4yx7qmve2srxe9wec5g-ellbnyt4cwwvvdkssaj0cbtus \
    192.168.59.128:2377

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

--advertise-addr 标志配置了管理节点的 IP 地址。如果你的机器只有一个 IP 地址,可以省略--adbertise-addr选项,docker 会自动选择正确的 IP。上输出信息说明了怎样加入新的工作节点。也说明了执行docker swarm join-token manager 可以查询怎样加入新的管理节点。

执行docker info命令查看swarm的当前状态

~$ docker info
...
Swarm: active
 NodeID: 7ik7wqhe5wcag8k5tp816c7ck
 Is Manager: true
 ClusterID: 2scd04fv8c9mua1jiaq6n0370
 Managers: 1
 Nodes: 1
 ...

执行 docker node ls 命令查看节点信息

$ docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
7ik7wqhe5wcag8k5tp816c7ck *  manager01  Ready   Active        Leader

节点 id 后面的*表示你当前连接到了该节点。

添加节点到 swarm

添加两个工作节点到swarm

在第二台主机上,执行前面创建 swarmdocker swarm init 输出信息中命令创建工作节点并加入到 swarm

chao@worker01:~$ docker swarm join \
     --token SWMTKN-1-0p0p5f96e1w4xblhw2eeookrv46spwf4yx7qmve2srxe9wec5g-ellbnyt4cwwvvdkssaj0cbtus \
     192.168.59.128:2377
This node joined a swarm as a worker.

输出信息表示当前节点已是 swarm 中的一个工作节点了。如果你忘记了该命令,可以在管理节点上执行 docker swarm join-token worker 查询怎么加入。

~$ docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-3wi7tszkolocsbc7vopv1tfx2r2h1owtqegwevdqqdk3fj195u-ejpeq0afjvfmujlvzboux9zjs \
    192.168.59.128:2377

到第三台主机上,继续讲第三台主机加入到 swarm

chao@worker02:~$ docker swarm join \
     --token SWMTKN-1-0p0p5f96e1w4xblhw2eeookrv46spwf4yx7qmve2srxe9wec5g-ellbnyt4cwwvvdkssaj0cbtus \
     192.168.59.128:2377
This node joined a swarm as a worker.

查看所有节点的状态

在管理节点上

chao@manager01:~$ docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
4rkvaeauhftolat98u5ty01iz    worker02   Ready   Active        
7ik7wqhe5wcag8k5tp816c7ck *  manager01  Ready   Active        Leader
cashcvy4qzcq3lvtnix4trqu7    worker01   Ready   Active

输出信息第二行 id 后面的*表示当前连接到了该节点。HOSTNAME 栏输出节点的 hostname。MANAGER 用于指示 swarm中的管理节点,该栏值为 Leader 表示为管理节点,空值表示为工作节点。

部署一个服务到 swarm

创建服务

在管理节点上创建一个服务,每隔三秒输出一个 “hello world”:

chao@manager01:~$ docker service create --replicas 1 --name helloworld busybox:1.25.1-musl /bin/sh -c "while true; do echo hello world; sleep 3; done"
04a3iqg8zlhba84kpi2tatssf
  • docker service create 命令创建服务。
  • --name 标志将服务命名为helloworld
  • --replicas 标志指定了期望状态为 1 个运行示例。
  • 参数 busybox:1.25.1-musl /bin/sh -c "while true; do echo hello world; sleep 3; done 将服务定义为使用镜像busybox:1.25.1-musl 创建容器,并在里面执行 /bin/sh -c "while true; do echo hello world; sleep 3; done

查看服务列表

还是在管理节点上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值