Docker Swarm

Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Swarm mode内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker原生的Swarm集群具备与Mesos、 Kubernetes 竞争的实力。

基本概念

Swarm 是使用SwarmKit构建的Docker引擎内置(原生)的集群管理和编排工具。

节点

运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的 Swarm 集群,这样这个运行Docker的主机就成为一个Swarm集群的节点 ( node ) 。节点分为管理节点和工作节点。

  • 管理节点用于Swarm集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行) 。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader ,leader通过raft协议实现。
  • 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。可以通过配置让服务只运行在管理节点。

任务

任务(Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务

服务 ( Services ) 是指一组任务的集合, 服务定义了任务的属性。服务有两种模式,两种模式通过 docker service create 的 --mode 参数指定。

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  • global services 每个工作节点上运行一个任务。

服务和任务的关系如下图所示

创建Swarm集群

初始化集群

使用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文件类似。

  • 其中image关键字是服务对象中唯一的必填项,docker stack和docker compose的区别是docker stack不支持构建,所有的镜像必须提前构建完成。
  • 在Docker Swarm中,虽然 --link 功能已被弃用,但可以通过使用服务发现机制来模拟 link 效果。给不同的服务指定相同的Overlay网络,就可以通过服务名实现互相访问。服务发现机制是自动的,无需手动配置。它使用DNS来解析容器名称,并在整个Overlay网络中实现容器之间的连接。例如下面的例子中,在bms服务中就可以通过bookmanage_db连接数据库。
# 部署服务命令
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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值