10. Docker Swarm(一)

目录

1、前言

[2、Docker Swarm体系架构](#2、Docker Swarm体系架构)

2.1、简单介绍

2.2、体系架构

3、简单使用

3.1、环境准备

3.2、初始化master节点

3.3、建立worker节点

3.4、查看集群的节点信息

3.5、部署应用

3.5.1、创建Dockerfile文件

3.5.2、构建镜像

3.5.3、将镜像上传到Docker仓库

3.5.4、Swarm集群中部署应用

3.5.5、查看服务信息

3.5.6、访问地址

3.5.7、动态伸缩


1、前言

上篇文章中我们讲到了Docker Compose来作为服务编排的工具,而Docker Compose只是用于单个宿主机上创建多个容器而进行服务编排的工具;而实际大型集群项目中,会面临多个服务器或宿主机上创建容器,从而组成集群提供相应的服务,而这时候就需要另一个服务编排工具Docker Swarm。

2、Docker Swarm体系架构

2.1、简单介绍

Docker Swarm是Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 宿主机抽象为一个整体,并通过一个入口统一管理这些 Docker 宿主机上的各种 Docker 资源。

Docker Swarm和Kubernetes 比较类似,但是它更加轻量级,且有的功能较 Kubernetes 少一些。有了Docker Swarm 集群,便可以实现应用的负载均衡与失败迁移功能。

Dockere 1.12.0版本开始,已经将Docker Swarm集成了,因此要使用他无需单独安装。而Docker Swarm本身内置了服务发现功能,因此也无需进行服务发现配置。

2.2、体系架构

Docker Swarm 集群是一个主从架构。其中有一个Swarm Manager 节点用来管理集群中的容器资源。Swarm Manager 节点对外暴露操作的接口,外部的用户可以通过该接口来实现对集群的管理。用户也可以通过 Swarm Manager 节点向集群发出操作指令。对于较大规模的 Docker 集群,可以将 Swarm Manager 单独部署到一台服务器上,从而提高其性能。Swarm Node 节点从 Swarm Manager 节点接收命令,从而创建相应的容器来运行应用。但是,用户只能笼统地向集群发出指令,而不能具体分配某台服务器干什么(这是由Swarm Manager节点上的Scheduler调度器完成的)。

3、简单使用

3.1、环境准备

准备3台虚拟机:

  • Master:安装了Docker 1.13.1,IP地址为:192.168.74.132
  • Node1:安装了Docker 1.13.1,IP地址为:192.168.74.133
  • Node2:安装了Docker 1.13.1,IP地址为:192.168.74.134

3.2、初始化master节点

先在master节点上初始化集群:

复制代码
docker swarm init --listen-addr 192.168.74.132:8888 --advertise-addr 192.168.74.132
  • --listen-addr:集群暴露给外部调用的Http API的socket地址。
  • --advertise-addr:当宿主机有多网卡时,该参数用于指定绑定的网卡地址。

启动成功后,如上图所示。如果已经启动成功的,可以通过命令查看这部分信息:

复制代码
docker swarm join-token manager

3.3、建立worker节点

将Node1和Node2节点作为worker加入Swarm集群:

复制代码
docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888

这里需要用到master节点的token,IP地址,和端口。

建立过程中可能遇到的问题:

  1. 问题1、--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode

    [root@192 pengyaohuang]# docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888
    Error response from daemon: --cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode

解决办法:检查docker配置文件是否配置了远程访问或者注册中心等配置,删除即可。我这边是因为前面配置了zookeeper相关信息导致。

  1. 问题2、can't initialize raft node

    [root@192 pengyaohuang]# docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888
    Error response from daemon: can't initialize raft node: rpc error: code = 2 desc = could not connect to prospective new cluster member using its advertised address: rpc error: code = 14 desc = grpc: the connection is unavailable

解决办法:查看防火墙是否开启。关闭防火墙即可:

复制代码
systemctl stop firewalld

节点加入成功后的提示:

3.4、查看集群的节点信息

在master节点上查看集群节点信息:

复制代码
docker node ls

可以看到分别有3个节点,2个节点为Reachable状态,一个为Leader状态。而Leader状态的节点ID后带了*号,这个表示该节点为master节点。

这里需要注意的是,master节点也作为worker节点。因此这里总共是有1个master节点,3个worker节点。

到此基本的集群环境就已经构建完成了。

3.5、部署应用

集群环境构建完成后,我们开始部署应用。

3.5.1、创建Dockerfile文件

复制代码
[root@192 docker_swarm]# vim Dockerfile 
FROM nginx
RUN echo '<h1> My first Swarm demo, version: 1</h1>' > /usr/share/nginx/html/index.html

3.5.2、构建镜像

复制代码
# 1表示我们的版本号
# 等下要上传到我们的docker hub上,因此这里镜像加上我们的仓库名
docker build -t pengyaohuang/swarm_nginx_demo:1 .

3.5.3、将镜像上传到Docker仓库

登录Docker Hub。

复制代码
docker login

输入账号密码后,就提示登录成功。

将镜像上传到仓库中。

复制代码
docker push pengyaohuang/swarm_nginx_demo:1

这样,就上传成功啦。

而仓库上也有了我们刚推上去的镜像。

3.5.4、Swarm集群中部署应用

复制代码
docker service create -p 8080:80 --replicas 3 --name swarm_demo pengyaohuang/swarm_nginx_demo:1

这里参数表示:

  • -p: 端口映射,这里将容器80端口映射到宿主机8080端口
  • --replicas:副本数量,即启动的容器数量,这里启动3个
  • --name:容器名称

3.5.5、查看服务信息

复制代码
# 查看部署的服务列表
docker service ls

# 查看服务的详细信息
docker service ps

由于我这里集群错误了一个节点,因此这里只能看到2个副本。具体失败原因,还有待查看。

3.5.6、访问地址

浏览器访问地址:http://192.168.74.192:8080,查看效果:

可以看到,就算我们的Node2节点部署失败了,我们整个项目依然是可以正常访问。这也就说明了集群的高可用。

3.5.7、动态伸缩

使用docker swarm我们还可以动态的对我们的服务进行扩容和缩容。如以下命令,我需要将当前容器的副本改为5:

复制代码
docker service scale swarm_demo=5

也可以减少为1:

复制代码
docker service scale swarm_demo=1

还是很方便的。

相关推荐
Johny_Zhao22 分钟前
Docker + CentOS 部署 Zookeeper 集群 + Kubernetes Operator 自动化运维方案
linux·网络安全·docker·信息安全·zookeeper·kubernetes·云计算·系统运维
weixin_4723394627 分钟前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8501 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
zwjapple1 小时前
docker-compose一键部署全栈项目。springboot后端,react前端
前端·spring boot·docker
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
一心0922 小时前
ubuntu 20.04.6 sudo 源码包在线升级到1.9.17p1
运维·ubuntu·sudo·漏洞升级
好好学习啊天天向上2 小时前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
你想考研啊2 小时前
三、jenkins使用tomcat部署项目
运维·tomcat·jenkins
好奇的菜鸟3 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
tan180°3 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql