12. Dokcer Swarm


12.1 Docker Swarm概述


Docker Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了

12.2 Docker Swarm体系架构


12.3 docker Swarm常用的概念


Swarm: 本身就是人群, 蜂群的意思, 这里指计算机集群, 在用Docker连接后的状态. docker swarm 命令可以创建, 加入, 离开一个集群

node: 指的是计算机节点, 也可以认为是Docker节点, Node分为两类: Manager和worker, 一个swarm至少要有一个manager, 部分管理命令只有在manager上才能使用, 两类node都可以运行service. 但只有manager上才能执行运行命令. 比如, 在manager上使用docker node命令可以查看, 配置, 删除node

stack: 是一组service, 和docker-compose类似. 默认情况下, 一个stack共用一个network, 相互可访问, 与其他stack网络隔绝, 这个概念只是为了编排的方便. docker stack 命令可以方便的操作一个stack, 而不用一个一个的操作service

service: 是一类容器, 对用户来说, service就是swarm交互的最核心内容. service有两种运行模式, 一是replicated, 指定一个service运行容器的数量; 二是global, 在所有符合运行条件的node上, 都运行一个这类容器. docker service命令可以操作swarm中的service

task: task就是运行一个容器的任务, 是swarm执行命令的最小单元, 要成功运行一个service, 需要执行一个或者多个task(取决于一个servce的容器数量), 确保每一个容器都顺利启动. 通常用户操作的是service, 而非task

load balancing: 即负载均衡, 也包含反向代理. swarm使用的是ingress的负载均衡, 即访问每个节点的某个published端口, 都可自动代理到真正的服务

12.4 构建swarm集群和节点


manager节点:

docker swarm init

可以使用

--listen-addr 1.1.1.1: 绑定ip地址

--advertise-add 1.1.1.1 r: 用于当有多张网卡的时候, 需要辨明是哪一张网卡

node节点:

这个命令是初始化swarm的时候, 生成的, 如上图所示

docker swarm join --token SWMTKN-1-01r79ev4rszb6k2jmds19uvdoro48m365hxyh7p7xp848i3ixm-808knqx25w05bq590rb4f3mre 192.168.65.3:2377
[root@manager ~]# docker node ls
ID                           HOSTNAME STATUS AVAILABILITY MANAGER STATUS
hmcwwwjd67gcpwjwna9r4x1lb   node2     Ready   Active        
n4rkdw24muuscoglz6ctt8mo7   node1     Ready   Active        
pjhwl7mj4tie9vu0qzszlmdgv * manager   Ready   Active       Leader

12.5 在swarm集群上部署应用


1. 构建自己的镜像

使用Dockerfile构建我们自己的镜像, 上传到Dockerhub中

Dockerfile

FROM nginx
RUN echo '<h1>Swarm:Version 1 <h1>' > /usr/share/nginx/html/index.html

需要保证每个节点都可以访问到这个镜像

docker login
docker build -t ajing/mynginx:v1 .
docker push ajing/mynginx:v1

2. 部署应用

将上面的镜像部署到集群中

docker service create -p 7788:80 --replicas 3 --name mydemo ajing/mynginx:v1

还可以使用swarm进行扩容

docker service scale mydemo=5

12.6 swarm集群的数据持久化


  • 为什么要进行数据持久化呢?

因为docker容器是一种无状态的服务

1. 数据卷方式

volume数据卷方式: 宿主机和容器之间共享数据

docker service create -p 7788:80 --replicas 3 --name myswarmtest --mount type=volume, src=myvolumn,dst=/usr/share/nginx/html ajing/mynginx:v1

2. 通过nfs实现(不推荐)

所有节点安装:

yum -y install nfs-utils
mount -t nfs 192.168.119.152:/nfs /mynfs
docker service create \
--replicas 3 \
--name my-nginx \
-p 7788:80 \
--mount 'type=volume,src=my-nfs-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=192.168.119.152:/nfs,"volume-opt=o=addr=192.168.119.152,vers=4,soft,timeo=180,bg,tcp,rw"' \
ajing/mynginx:v1

测试:

故事凌 明天能否加个鸡腿! 喜欢作者