Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
Swarm mode内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker原生的Swarm集群具备与Mesos、 Kubernetes 竞争的实力。
Swarm 是使用SwarmKit构建的Docker引擎内置(原生)的集群管理和编排工具。
运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的 Swarm 集群,这样这个运行Docker的主机就成为一个Swarm集群的节点 ( node ) 。节点分为管理节点和工作节点。

任务(Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 ( Services ) 是指一组任务的集合, 服务定义了任务的属性。服务有两种模式,两种模式通过 docker service create 的 --mode 参数指定。
服务和任务的关系如下图所示

使用docker swarm init命令。如果Docker主机有多个网卡,拥有多个IP,必须使用--advertise-addr指定IP。执行docker swarm init命令的节点自动成为管理节点。
- $ docker swarm init --advertise-addr 192.168.222.128
- Swarm initialized: current node (ni1omlgyo0vw1h8e93e124srk) is now a manager.
-
- To add a worker to this swarm, run the following command:
-
- docker swarm join \
- --token SWMTKN-1-47jtzmzdyej3ey59gsgckk54gbt0cqe28gjvh9gg4j6uweccst-eugtpcgbm34370ljz1bvre6jy \
- 192.168.222.128:2377
-
- To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
使用docker swarm join命令加入到集群中。使用docker node ls查看集群。
- # 加入集群
- $ docker swarm join \
- --token SWMTKN-1-2dqppg075l4xoozwsp8hts1v1ro750fhiawa28y8u9fpo0t0tf-74c7t1eglegf0h1z7jr6g6rjj \
- 192.168.222.128:2377
-
- # 查看集群
- $ docker node ls
-
- # 将worker节点提升为manager节点,在manager节点执行如下命令:
- docker node promote 节点名称|节点ID
-
- # 将manager节点降低为worker节点,在manager节点执行如下命令:
- docker node demote 节点名称|节点ID
-
- # 在要脱离集群的节点上使用以下命令, 主动离开集群,让节点处于down状态,才能删除
- docker swarm leave
-
- # 节点脱离集群后,才能删除节点,删除节点使用如下命令
- docker node rm 节点名称|节点ID
-
- # 强制删除集群
- $ docker swarm leave --force
使用docker service命令来管理Swarm集群中的服务,该命令只能在管理节点运行。
- # 创建服务
- docker service create --replicas 3 -p 3306:3306 --name db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=sql_test \
- -e MYSQL_USER=myuser -e MYSQL_PASSWORD=userpassword mysql
-
- # 查看服务
- docker service ls 查看当前Swarm集群运行的服务
- docker service ps db 查看容器状态
- docker service logs db 查看服务日志
- docker service inspect nginx 查看服务的详细信息
-
- # 删除服务
- docker service rm db
-
- # 更新服务
- docker service update --image nginx:alpine nginx
-
- # 减少服务实例(这比直接删除服务要好)
- docker service scale nginx=0
-
- # 增加服务实例
- docker service scale nginx=5
使用docker stack命令在集群中部署多个服务,docker stack文件内容和docker compose文件类似。
- # 部署服务命令
- docker stack deploy -c docker-compose.yml boomanage
-
- # 删除服务命令
- docker stack rm boomanage
-
- # 查看容器状态
- docker stack ps boomanage
yml文件内容如下:
- version: "3"
- services:
- db:
- image: mysql
- networks:
- - overlay
- ports:
- - "3306:3306"
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: sql_test
- MYSQL_USER: myuser
- MYSQL_PASSWORD: userpassword
- volumes:
- - /home/gowork/src/composebms/db/data:/var/lib/mysql
- deploy:
- placement:
- constraints: [node.role == manager]
-
- bms:
- image: ubuntu:bms
- command: bookmanger
- networks:
- - overlay
- ports:
- - "8999:8999"
- deploy:
- mode: replicated
- replicas: 3
-
- networks:
- overlay: