使用 docker 引擎的模式是 v1.12.0 版本以后的新特性,我们使用 docker cli 创建一个 swarm,部署和管理应用服务集群。
swarm 集群特色
默认自带集群服务的管理工具,不需要额外的工具。
部署 docker 时不区分节点角色,当启动时根据不同角色使用不同参数。docker 引擎分为管理器和工作程序 ,这就意味着你可以使用一个磁盘构建一个完整集群。
docker 引擎可以让你在海量应用服务里面,给服务定义你想要状态。例如:你可以描述一个程序服务集群包括消息队列服务,数据库后端,web 前端组成。
对于你想要运行的每个服务你可以声明想要运行的任务数。当你批量启动和停止服务时,swarm 集群管理器自动适应添加和移除任务来达到你想要维护的服务状态
swarm 管理器通过不断的监控集群状态,让集群从现实状态不断接近你期望的状态。例如:你现在需要运行 10 个容器副本,并且其中两个容器副本 worker 机器崩溃了,这个 swarm manager 将创建两个容器副本来替换崩溃的这两个副本。
你可以创建容器指定一个覆盖型网络。swarm 管理器初始化或更新应用程序时,会自动为覆盖网络上的容器分配地址。
swarm 管理器节点会分配给每个服务唯一 dns 容器名并负载均各个容器。您可以通过嵌入在 swarm 中的 DNS 服务器查询在群中运行的每个容器。
你可以使用容器暴露的端口使用外部应用进行负载均衡,在内部你可以使用 swarm 指定如何在节点之间分发服务容器。
每个 swarm 的节点里强制使用 TLS 双向认证和加密传输,以保证本机和其它节点间通讯安全。这里你可以使用自签名的证书或者自定义 CA 的证书。
在升级时你可以渐进的升级(滚动升级),swarm 管理器可以控制多同节点间的调度部署升级的延时,一旦出现问题你可以回退到之前版本。
下面是 swarm 的重要概念和教程:
在 docker 引擎 v1.12 集成了 swarmkit,主要包含了集群管理,编排功能。所以 docker 可以使用 swarm 模式创建一个集群或者加入一个现有集群。
swarm 内分为 service(服务) 和 node(节点) 管理。
swarm 节点分为两个角色:manager 节点和 Worker 节点.
manager 模式:任务的分派,执行编排,集群管理(集群状态,任务数维持).
Worker 模式: 接受并执行 manager 节点分派任务. 默认情况下,manager 节点还将服务作为 Worker 节点运行,当你把它配置为 manager-only 的时候就可以为独占管理器了。agent 在每个 worker 节点上运行,并报告分配给它的任务。Worker 节点向 manager 节点通知其分配的任务的当前状态,使得 manager 可以维持每个 Worker 的期望状态。
这里 swarm 为了方便管理,使用了分片的概念,每个容器为一个分片,就像 Elasticsearch 的数据分片有点类似。如下图:
下面介绍下 swarm 的入门示例:
创建集下面几步:
1. 在 swarm 模式下初始化一组 docker 引擎
2. 添加节点到集群
3. 部署应用服务到集群
4. 通过 swarm 管理任何运行的东西
准备资源:
三个节点
docker>=1.12 版本
管理主机 ip 地址
互相之间端口开放
集群管理节点需要使用 tcp 2377 端口
普通节点通讯使用 tcp 和 udp 的 7946 端口
覆盖型网络流量端口 tcp 和 udp 的 4789,50 端口
--advertise-addr 192.168.9.100 #发布对外服务地址,manage 角色。
下面输出的内容是加入集群的方法。节点将作为 manager 或 Worker 加入,具体取决于 --token 标志的值。
- [
- salt]# docker swarm init --advertise-addr 192.168.198.116
- Swarm
- initialized: current node (2pzv4kzc2p8f7c4wqlfupp9h9) is now a manager.
- To add a
- worker to this swarm, run the following command:
- docker swarm join --token
- SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy
- 192.168.198.116:2377
- To add a
- manager to this swarm, run 'docker swarm join-token manager' and follow the
- instructions.
- [
- salt]# docker swarm join-token worker
- To add a worker to
- this swarm, run the following command:
- docker swarm join --token
- SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy
- 192.168.198.116:2377
- [
- salt]# docker swarm join > --token
- SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy
- > 192.168.198.116:2377
- This node joined a
- swarm as a worker.
#加入一个节点
- [
- salt]# docker swarm join > --token
- SWMTKN-1-4gempr5ydp6d332n5ygsmnf0c25u46mp78aptbl9gda5fw8l71-83ugwkfczgkwmj919lqbqsjfy
- > 192.168.198.116:2377
- This node joined a
- swarm as a worke
- [
- salt]# docker info
- Containers: 12
- Running: 0
- Paused: 0
- Stopped: 12
- Images: 54
- Server Version:
- 1.13.0
- …………..
- Logging Driver:
- json-file
- Cgroup Driver:
- cgroupfs
- Plugins:
- Volume: local
- Network: bridge host macvlan null overlay
- Swarm:
- active
- NodeID: 2pzv4kzc2p8f7c4wqlfupp9h9
- Is Manager: true
- ClusterID: lndygvfpz9mk09to8iw56s6bb
- Managers: 1
- Nodes: 3
- Orchestration:
- Task History Retention Limit: 5
- Raft:
- Snapshot Interval: 10000
- Number of Old Snapshots to Retain: 0
- Heartbeat Tick: 1
- Election Tick: 3
- Dispatcher:
- Heartbeat Period: 5 seconds
- CA Configuration:
- Expiry Duration: 3 months
- Node Address: 192.168.198.116
- Manager Addresses:
- 192.168.198.116:2377
- Runtimes: runc
- ………
下面的 "*" 代表你连接的节点。
- [
- salt]# docker node ls
- ID HOSTNAME STATUS
- AVAILABILITY MANAGER STATUS
- 2pzv4kzc2p8f7c4wqlfupp9h9
- * salt-node1 Ready
- Active Leader
- g36lvv23ypjd8v7ovlst2n3yt salt-node3
- Ready Active
- h14re9viizbs5yj3zunuo9zo8 salt-node2
- Ready Active
连接到 manager 节点创建一个服务,参数描述:
- --name指定helloworld 服务
- --replicas 1 指定生成一个容器分片
- --name helloworld 集群名称helloworld
- alpine 镜像名称,默认latest版本
- ping docker.com 执行命令
- [
- salt]# docker service create --replicas 1 --name helloworld alpine ping
- docker.com
- 091zwwscs8rjv58a6vpev9ztj
- [
- salt]# docker ps
- CONTAINER ID IMAGE
- COMMAND CREATED STATUS PORTS NAMES
- 17d5a5b9752b
- :nbsp; "ping docker.com" 5 seconds ago Up 2 seconds
- helloworld.1.tkqacb1kb0pftn5zaljff5g15
- docker service
- create --name my_web --replicas 3 --publish 8080:80 nginx
- 把容器的80端口暴露到本机的8080端口
- [
- salt]# docker service scale helloworld=5
- helloworld scaled to
- 5
- [
- salt]# docker service ls --filter name=redis3
- ID NAME MODE
- REPLICAS IMAGE
- ig4hg5e8233r redis3
- replicated 3/3
- registry.cn-hangzhou.aliyuncs.com/forker/redis:latest
- $ docker service
- create --mode global --name backend backend:latest
- b4g08uwuairexjub6ome6usqh
- $ docker service
- scale backend=10
- backend: scale can
- only be used with replicated mode
- [
- salt]# docker service inspect --pretty helloworld
- ID: 091zwwscs8rjv58a6vpev9ztj
- Name: helloworld
- Service
- Mode: Replicated
- Replicas: 5
- Placement:
- UpdateConfig:
- Parallelism: 1
- On
- failure: pause
- Max failure ratio: 0
- ContainerSpec:
- Image: alpine::dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8
- Args: ping
- docker.com
- Resources:
- Endpoint
- Mode: vip
- [
- salt]# docker service inspect --pretty helloworld
- ID: 091zwwscs8rjv58a6vpev9ztj
- Name: helloworld
- Service
- Mode: Replicated
- Replicas: 1
- Placement:
- UpdateConfig:
- Parallelism: 1
- On
- failure: pause
- Max failure ratio: 0
- ContainerSpec:
- Image: alpine::dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8
- Args: ping
- docker.com
- Resources:
- Endpoint
- Mode: vip
来源: