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
测试:
故事凌 明天能否加个鸡腿! 喜欢作者