> 文档中心 > 一文学会 docker Swarm的使用(centOS7 )

一文学会 docker Swarm的使用(centOS7 )


docker Swarm

简介

Docker Swarm 一句话说明:提供 Docker 容器集群服务,
是 Docker 官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
注意:从Docker 1.12.0+ Swarm mode 已经内嵌入 Docker 引擎,成为了 docker 子命令 docker swarm,
现在已经开始使用 Swarm mode,Swarm作为一个单独项目已经不在持续开发了。
这里标题还是Docker三剑客之Swarm,但实质内容我们讲Docker内置的Swarm mode

基本概念

Swarm 是 Docker 引擎内置(原生)的集群管理和编排工具。
使用 Swarm 集群之前需要了解以下几个概念。

节点

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

管理节点用于 Swarm 集群的管理,
docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。
一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现。

工作节点是任务执行节点,工作节点执行的任务就是由管理节点下发的服务 (service)
管理节点默认也作为工作节点。
你也可以通过配置让服务只运行在管理节点。
在这里插入图片描述

服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  • global services 每个工作节点上运行一个任务
    两种模式通过 docker service create–mode 参数指定。
    在这里插入图片描述

创建 Swarm 集群

我们以创建一个包含一个管理节点和两个工作节点的最小 Swarm 集群为例子。
提前准备好三个主机。
192.168.175.100
192.168.175.101
192.168.175.102

初始化集群

我们使用 docker swarm init 在本机初始化一个 Swarm 集群。
避免防火墙在创建集群过程中干扰,建议关掉在实验。

  • 停止firewall
systemctl stop firewalld.service
  • 关闭SELINUX
setenforce 0    //临时关闭
  • 清空iptables规则
iptables -Fiptables-save
  • 关闭防火墙后需要重启Docker
service docker restart
初始化命令
docker swarm init --advertise-addr 192.168.175.100

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 –advertise-addr 指定 IP。
执行 docker swarm init 命令的节点自动成为管理节点。
在这里插入图片描述

增加工作节点

上一步我们在本机初始化了一个 Swarm 集群,拥有了一个管理节点,

  • 进入work1的主机:
docker swarm join --token SWMTKN-1-2u96vgmcla0oejr462depw06wngagw5u0qbo4bohzkelnyowmf-05ywvcknu1qdf1buy4k60y9ba 192.168.175.100:2377
  • 进入work2的主机:
 docker swarm join --token SWMTKN-1-2u96vgmcla0oejr462depw06wngagw5u0qbo4bohzkelnyowmf-05ywvcknu1qdf1buy4k60y9ba 192.168.175.100:2377
查看集群

经过上边的两步,我们已经拥有了一个最小的 Swarm 集群,包含一个管理节点和两个工作节点。
在管理节点使用 docker node ls 查看集群。

docker node ls    //只能在管理节点上执行

在这里插入图片描述

###部署服务
我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

新建服务
docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

现在我们使用浏览器,输入任意节点 IP ,即可看到 nginx 默认页面。
–replicas 3: 指定任务数量

查看服务

使用 docker service ls 来查看当前 Swarm 集群运行的服务。

 docker service ls

使用 docker service ps 来查看某个服务的详情。
使用 docker service logs 来查看某个服务的日志。

docker service logs nginx
删除服务

使用 docker service rm 来从 Swarm 集群移除某个服务。

docker service rm nginx

在 Swarm 集群中使用 compose 文件

使用 docker-compose.yml 来一次配置、启动多个容器,
Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。
当我们使用 docker service create 一次只能部署一个服务,
使用 docker-compose.yml 我们可以一次启动多个关联的服务。
我们以在 Swarm 集群中部署 WordPress 为例进行说明

version: "3.8"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:

其中

 deploy    # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm     endpoint_mode     # v3.3 版本中新增的功能, 指定服务暴露的方式  vip      # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址  dnsrr    # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表     labels  # 指定服务的标签,这些标签仅在服务上设置     mode    # 指定 deploy 的模式  global  # 每个集群节点都只有一个容器  replicated     # 用户可以指定集群中容器的数量(默认)     placement      # 控制容器部署是位置     replicas# deploy 的 mode 为 replicated 时, 指定容器副本的数量,说白了就是服务下运行几个容器     resources      # 资源限制  limits  # 设置容器的资源限制      cpus: "0.5"    # 设置该容器最多只能使用 50% 的 CPUmemory: 50M    # 设置该容器最多只能使用 50M 的内存空间   reservations   # 设置为容器预留的系统资源(随时可用)      cpus: "0.2"    # 为该容器保留 20% 的 CPU

Swarm 集群中使用 docker-compose.yml 我们用 docker stack 命令。

部署服务

部署服务使用 docker stack deploy,其中 -c 参数指定 compose 文件名。

docker stack deploy -c docker-compose.yml wordpress

打开浏览器,输入任意节点的IP地址:8080,即可看到各节点运行状态。
在这里插入图片描述

在浏览器新的标签页输入 任一节点IP:80 即可看到 WordPress 安装界面,安装完成之后,输入 任一节点IP 即可看到 WordPress 页面。
在这里插入图片描述

查看服务
 docker stack ls
移除服务
docker stack down wordpress

该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm

在 Swarm 集群中管理敏感数据

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

我们可以用 docker secret 命令来管理敏感信息。
接下来我们在上面章节中创建好的 Swarm 集群中介绍该命令的使用。
这里我们以在 Swarm 集群中部署 mysqlwordpress 服务为例。

创建 secret
  • 通过文件创建
vi password通过docker secret create 名称 文件名rm -rf password
  • 通过管道的方式创建
echo 'admin123' | docker secret create mysql_root_password -echo 'admin123' | docker secret create mysql_password -echo 'admin123' | docker secret create wp_db_password -echo 'admin123' | docker secret create my-pw2 -
查看 secret

使用 docker secret ls 命令来查看 secret

docker secret ls
删除secret
docker secret rm my-pw2
创建服务的时候使用secret

secret 默认通过 tmpfs 文件系统挂载到容器的 /run/secrets 目录中,我们要用的时候,像下面的写就对了:
改造上面wordpress

version: "3.8"services:  wordpress:    image: wordpress    ports:      - 80:80    networks:      - overlay    environment:      WORDPRESS_DB_HOST: db:3306      WORDPRESS_DB_USER: wordpress      WORDPRESS_DB_PASSWORD_FILE: /run/secrets/wp_db_password    secrets:      - wp_db_password    deploy:      mode: replicated      replicas: 3   db:    image: mysql    networks:- overlay    volumes:      - db-data:/var/lib/mysql    environment:      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password      MYSQL_DATABASE: wordpress      MYSQL_USER: wordpress      MYSQL_PASSWORD_FILE: /run/secrets/mysql_password    secrets:      - mysql_password      - mysql_root_password    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:secrets:  mysql_password:    external: true  mysql_root_password:    external: true  wp_db_password:    external: true

还有一种用法:

docker service create  --name wordpress  --network mysql_net  \-p 30000:80 --secret source=mysql_password,target=wp_db_password  \-e WORDPRESS_DB_HOST="mysql:3306"  -e WORDPRESS_DB_NAME="wordpress" \-e WORDPRESS_DB_USER="wordpress"  \-e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password"   wordpress:latest

启动:docker stack deploy -c docker-compose.yml wordpress

  1. WORDPRESS_DB_HOST 指明 MySQL service 地址 mysql:3306,这里用到了 DNS。
  2. WORDPRESS_DB_NAME 指明 WordPress 的数据库为 wordpress,与前面 MYSQL_DATABASE 一致。
  3. WORDPRESS_DB_USER 指明连接 WordPress 数据库的用户为 wordpress,与前面 MYSQL_USER 一致。
  4. WORDPRESS_DB_PASSWORD_FILE 指明数据库的用户 wordpress 的密码,从 secret mysql_password 中获取。

在 Swarm 集群中管理配置数据

在动态的、大规模的分布式集群上,管理和分发配置文件也是很重要的工作。
传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性。
在 Docker 17.06 以上版本中,Docker 新增了 docker config 子命令来管理集群中的配置信息,
以后你无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。

注意:config 仅能在 Swarm 集群中使用。

这里我们以在 Swarm 集群中部署 redis 服务为例。
创建 config,新建 redis.conf 文件

port 6380

此项配置 Redis 监听 6380 端口

我们使用 docker config create 命令创建 config
docker config create redis.conf  redis.conf
查看 config

使用 docker config ls 命令来查看 config

docker config ls
创建 redis 服务
 docker service create \     --name redis \     --config redis.conf \  #也可以使用此方式 --config source=redis.conf,target=/etc/redis.conf \     -p 6379:6380 \--replicas 3  \     redis:latest \     redis-server /redis.conf

如果你没有在 target 中显式的指定路径时,默认的 redis.conftmpfs 文件系统挂载到容器的 /redis.conf。
经过测试,redis 可以正常使用。
以前我们通过监听主机目录来配置 Redis,就需要在集群的每个节点放置该文件,
如果采用 docker config 来管理服务的配置信息,我们只需在集群中的管理节点创建 config
当部署服务时,集群会自动的将配置文件分发到运行服务的各个节点中,大大降低了配置信息的管理和分发难度。