概念

Swam是使用SwarmKit构建的Docker引擎内置的集群管理和编排工具

Swam有几个重要的核心概念:

节点
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

集群中管理节点与工作节点的关系

服务和任务
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。

容器、任务、服务的关系

创建Swarm集群

这里为方便测试利用Docker Machine(负责在多种平台上快速安装Docker环境)创建Docker主机,也可直接部署在有docker环境的服务器

安装Docker Machine

下载二进制包到/usr/local/bin(https://github.com/docker/machine/releases

chmod +x /usr/local/bin/docker-machine

安装VirtualBox环境

vim /etc/yum.repos.d/virtualbox.repo

[virtualbox]
name=Oracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc

yum install -y VirtualBox-5.2

TIPs:

1.如果创建主机时产生以下错误,升级内核重启服务器即可

yum update kernel -y

2.如果docker machinr初始化太慢,可以采用以下方式

从https://github.com/boot2docker/boot2docker/releases/download/v19.03.12/boot2docker.iso下载(用迅雷下载github项目贼快),然后加上参数-virtualbox-boot2docker-url=/本地存放路径/boot2docker.iso

github地址

创建管理节点

docker-machine create manager -d virtualbox -virtualbox-boot2docker-url=/root/boot2docker.iso

初始化Swarm集群

docker -machine ssh manager
docker swarm init --advertise-addr 192.168.99.100

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。

增加工作节点(token在管理节点初始化时获取)

docker-machine create worker1 -d virtualbox -virtualbox-boot2docker-url=/root/boot2docker.iso
docker swarm join --token SWMTKN-1-49ifdd4k2786yoh266go501ru40e2kwo1huad4pjl4t4at0ysn-5p7k6zk5ljtrj9x9sua703l36 192.168.99.100:2377

docker-machine create worker2 -d virtualbox -virtualbox-boot2docker-url=/root/boot2docker.iso
docker swarm join --token SWMTKN-1-49ifdd4k2786yoh266go501ru40e2kwo1huad4pjl4t4at0ysn-5p7k6zk5ljtrj9x9sua703l36 192.168.99.100:2377

管理节点查看集群状态

docker node ls

部署服务

docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

在集群中部署nginx服务

查看swarm集群运行服务

docker service ls

查看服务详情

docker service ps nginx

查看服务日志

docker service logs

服务伸缩

我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。
当业务处于高峰期时,我们需要扩展服务运行的容器数量。

当业务平稳时,我们需要减少服务运行的容器数量。

删除服务

docker service rm nginx

结合Compose使用

结合指令deploy使用(下面实例为在Swarm集群中部署WordPress)

version: "3"

services:
  wordpress:
    image: wordpress
    ports:
      - 80:80
    networks:
      - overlay
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    deploy:
      mode: replicated
      replicas: 3

  db:
    image: mysql
    networks:
       - overlay
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    deploy:
      placement:
        constraints: [node.role == manager]

  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]

volumes:
  db-data:
networks:
  overlay:

在 Swarm 集群管理节点新建该文件,其中的 visualizer 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点

部署服务

docker stack deploy -c docker-compose.yml wordpress

查看服务

docker stack ls

移除服务

docker stack down wordpress

管理密钥

在动态的、大规模的分布式集群上,管理和分发 密码、证书 等敏感信息是极其重要的工作。传统的密钥分发方式(如密钥放入镜像中,设置环境变量,volume 动态挂载等)都存在着潜在的巨大的安全风险。Docker 目前已经提供了 secrets 管理功能,用户可以在 Swarm 集群中安全地管理密码、密钥证书等敏感数据,并允许在多个 Docker 容器实例之间共享访问指定的敏感数据

创建secret

openssl rand -base64 20 | docker secret create 密钥名 -

查看secret

docker secret ls

引用secret

openssl rand -base64 20 | docker secret create mysql_password -
openssl rand -base64 20 | docker secret create mysql_root_password -
docker service create \
     --name mysql \
     --replicas 1 \
     --network mysql_private \
     --mount type=volume,source=mydata,destination=/var/lib/mysql \
     --secret source=mysql_root_password,target=mysql_root_password \
     --secret source=mysql_password,target=mysql_password \
     -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
     -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
     -e MYSQL_USER="wordpress" \
     -e MYSQL_DATABASE="wordpress" \
     mysql:latest

滚动升级

docker service update 服务名

服务回退

docker service rollback 服务名