Docker swarm搭建(2)

什么是docker swarm?

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。
Swarm的基本架构如下图所示:

Docker Swarm 优点

任何规模都有高性能表现 对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。 经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。

灵活的容器调度

Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。

服务的持续可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。 此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。

和 Docker API 及整合支持的兼容性

Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。

Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持

开发的 Compose 文件能(通过 docker-compose up )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。

一. 实验环境

主机 IP地址 服务
docker01 192.168.1.11 swarm+service+webUI+registry
docker02 192.168.1.13 docker
docker03 192.168.1.20 docker

三台主机都关闭防火墙,禁用selinux,修改主机名,时间同步,并添加域名解析。

docker版本必须是:v1.12版本开始(可使用docker version查看版本)

1.关闭防火墙,禁用selinux

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# hostnamectl set-hostname docker03
[[email protected] ~]# su -

2.时间同步

mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

3.修改主机名(三台都要)

[[email protected] ~]# hostnamectl set-hostname docker01
[[email protected] ~]# su -

4.添加域名解析

[[email protected] ~]# echo 192.168.1.11 docker01 >> /etc/hosts
[[email protected] ~]# echo 192.168.1.13 docker02 >> /etc/hosts
[[email protected] ~]# echo 192.168.1.20 docker03 >> /etc/hosts

二. docker01 初始化集群

[[email protected] ~]# docker swarm init --advertise-addr 192.168.1.11

--advertise-addr:指定与其它docker通信的地址。

上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:

注意:token令牌只有24小时的有效期

如果想要添加manager节点:运行下面命令

三,docker02和docker03以worker加入集群

[[email protected] ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377

docker01查看集群

[[email protected] ~]# docker node ls


*注意:这里的”****“代表的是当前所属的节点

四.设置manager node(docker01)不参加工作

[[email protected] ~]# docker node update docker01 --availability drain

设置主机docker01以后不运行容器,但已经运行的容器并不会停止
“--availability”选项后面共有三个选项可配置,如下:
“active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作

[[email protected] ~]# docker node ls

五. docker01部署一个图形化webUI界面

1.docker01 导入镜像

[[email protected]~]# docker pull dockersamples/visualizer

2.基于镜像启动一台容器

[[email protected] ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer  dockersamples/visualizer

3.通过浏览器访问验证http://192.168.1.11:8080/

如果访问不到网页,需开启路由转发

[[email protected] ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[[email protected] ~]# sysctl -p

六. Docker01部署一个私有仓库

Docker01部署

72 docker pull registry
//下载registry镜像

73 docker run -itd --name registry -p 5000:5000 --restart=always registry:latest
//基于registry镜像,启动一台容器

78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker

76 docker tag busybox:latest 192.168.1.11:5000/busybox:v1
//把容器重命名一个标签

77 docker ps

78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker

100 docker push 192.168.1.11:5000/busybox:v1
//上传容器到私有仓库

Docker02和docker03加入私有仓库

78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000  

80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker

99 docker pull 192.168.1.11/busybox:v1
//测试下载

七. 自定义镜像

要求:基于httpd镜像,更改访问界面内容。镜像tag版本为v1,v2,v3,对应主机面内容为v1,xgp666、v2,xgp666、v2,xgp666

[[email protected] ~]# docker pull httpd
//下载httpd镜像

创建三个测试目录

[[email protected] ~]# mkdir {v1,v2,v3}
//创建测试目录

docker01,v1目录操作

[[email protected] ~]# cd v1
[[email protected] v1]# echo v1,xgp666 > index.html
//创建测试网页

[[email protected] v1]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html

[[email protected] v1]# docker build -t 192.168.1.11:5000/httpd:v1 .
//基于dockerfile创建镜像

[[email protected] v1]# docker push  192.168.1.11:5000/httpd:v1
//上传刚刚创建镜像到私有仓库

docker01,v2目录操作

[[email protected] v1]# cd ../v2
[[email protected] v2]# echo v2,xgp666 > index.html

[[email protected] v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html

[[email protected] v2]# docker build -t 192.168.1.11:5000/httpd:v2 .
//基于dockerfile创建镜像

[[email protected] v2]# docker push  192.168.1.11:5000/httpd:v2
//上传刚刚创建镜像到私有仓库

docker01,v3目录操作

[[email protected] v1]# cd ../v3
[[email protected] v2]# echo v3,xgp666 > index.html

[[email protected] v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html

[[email protected] v2]# docker build -t 192.168.1.11:5000/httpd:v3 .
//基于dockerfile创建镜像

[[email protected] v2]# docker push  192.168.1.11:5000/httpd:v3
//上传刚刚创建镜像到私有仓库

八. 发布一个服务,基于上述镜像

要求:副本数量为3个。服务的名称为: bdqn

[[email protected] v3]# docker service create --replicas 3 --name bdqn  -p 80:80 192.168.1.11:5000/httpd:v1

查看一下网络

[[email protected] ~]# docker network ls

默认的Ingress网络,包括创建的自定义overlay网络, 为后端真正为用户提供服务的container,提供了一个统一的入口。

service 通过 ingress load balancing 来发布服务,且 swarm 集群中所有 node 都参与到 ingress 路由网格(ingress routing mesh) 中,访问任意一个 node+PublishedPort 即可访问到服务。

当访问任何节点上的端口80时,Docker将您的请求路由到活动容器。在群节点本身,端口80可能并不实际绑定,但路由网格知道如何路由流量,并防止任何端口冲突的发生。

路由网格在发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。

查看一下创建的副本

[[email protected] v3]# docker service ps bdqn

浏览器测试访问http://192.168.1.11:80,http://192.168.1.13:80,http://192.168.1.20:80

修改docker02和docker03测试网页内容

docker02

[[email protected] ~]# docker exec -it 388f3bd9dd33 /bin/bash
[email protected]:/usr/local/apache2# cd htdocs/
[email protected]:/usr/local/apache2/htdocs# echo 123 > index.html 

docker03

[[email protected] ~]# docker exec -it 281454867fac /bin/bash
[email protected]:/usr/local/apache2# echo 321 > htdocs/index.html 

测试访问(每一台都会显示,会负载均衡)

要求:副本数量为3个。服务的名称为:test

[[email protected] v3]# docker service create --replicas 3 --name test  -p 80  192.168.1.11:5000/httpd:v1

查看创建的服务映射端口

[[email protected] v3]# docker service ls

默认映射端口30000-32767

九. 服务的扩容与缩容

扩容

[[email protected] v3]# docker service scale bdqn=6

缩容

[[email protected] v3]# docker service scale bdqn=4

扩容与缩容直接直接通过scale进行设置副本数量。

十.服务的升级与回滚

(1)升级

docker service upadte 命令参数详解

--force 强制更新重启服务,无论是否配置或镜像改变都更新
--image <image:tag> 制定更新的镜像
--with-registry-auth 向 Swarm 代理发送 Registry 认证详细信息,私有仓库需要携带该参数

[[email protected] ~]# docker service update --image 192.168.1.11:5000/httpd:v2 bdqn
//把bdqn服务升级成v2的版本

测试访问一下

(2)平滑的更新

[[email protected] ~]# docker service update --image 192.168.1.11:5000/httpd:v3  --update-parallelism 2 --update-delay 1m bdqn
//两个服务一起更新,然后,隔一分钟,继续更新

默认情况下, swarm-次只更新-个副本,并且两个副本之间没有等待时间,我们可以通过
--update-parallelism;设置并行更新的副本数量。
--update-delay:指定滚动更新的时间间隔。

测试访问一下

(3) 回滚操作

[[email protected] ~]# docker service  rollback bdqn 

注意,docker swarm的回滚操作,默认只能回滚到上一-次操作的状态,并不能连续回滚到指定操作。

测试访问一下

十一,注意:

如果一台机器启用多个服务注意,合理分配cpu与内存资源,因tomcat在启动编译时会很吃内存,且docker是多线程启动的,所有最好是限定一下(设置resources.limits)否者会导致内存在同一时刻用光,某些服务启动失败当然也可是设置出错重启(restart_policy.condition:on-failure),另外设置resources.reservations要注意,不要超出总内存或cpu百分比,否者会导致后面服务无法获取cpu或内存资源出现“no suitable node (insufficien”错误(这个错误很奇怪,某个service不启动,也不输出日志,使用“docker stack ps [xxxx]”查看状态会显示此错误)无法启动

原文地址:https://blog.51cto.com/14320361/2462683

时间: 2024-11-08 13:42:24

Docker swarm搭建(2)的相关文章

使用Docker Swarm搭建分布式爬虫集群

在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况.此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新? 有时候爬虫只需要在一个服务器上面运行,有时候需要在200个服务器上面运行.你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?或者聪明一点,在Redis里面设置一个可以修改的标记,只有标记对应的服务器上面的爬虫运行? A爬虫已经在所有服务器上面部署了,现在又做了一个B爬虫,你是不是又得依次

Docker swarm搭建(1)

Docker swarm docker swarm集群:三剑客之一 一. Docker Swarm 的基本概念和原理 Docker Swarm 简介 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信.Swarm几乎全部

从零开始搭建Docker Swarm集群

从零开始搭建Docker Swarm集群 检查节点Docker配置 1. 打开Docker配置文件(示例是centos 7)vim /etc/sysconfig/docker 2. 添加-H tcp://0.0.0.0:2375到OPTIONSOPTIONS='-g /cutome-path/docker -H tcp://0.0.0.0:2375' 3. CentOS6.6 需要另外添加-H unix:///var/run/docker.sockOPTIONS='-g /mnt/docker 

Docker Swarm 环境搭建

Docker Swarm 环境搭建 swarm 使用前提 1.Docker版本1.12+ Docker升级教程:https://www.cnblogs.com/xiangsikai/p/9935894.html 2.集群节点之间保证如下端口通信: TCP 2377(管理节点与集群模式的通信manager与worker) TCP/UDP 7946(节点之前其他数据的传输) UDP 4789(overlay网络通信) 节点规划 系统:Centos 7.4 x64 应用版本:Docker 18.09.

Docker swarm 集群搭建

Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信.Swarm几乎全部用go语言来完成开发,上周五,4月17号,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来

Swarm搭建 Docker集群

一.环境准备 1.准备服务器如下: 172.19.230.69 node1 172.19.230.70 node2 172.19.230.64 node3 2.修改主机名: hostnamectl set-hostname node1 3.关闭防火墙 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动 4.修改docker监听端口 vi /lib/syste

Docker Swarm群集

Docker Swarm 是什么? Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操作集群,会使用户感觉就像是在一台主机上进行操作 docker1.12集成了swarmkit, 使你可以不用安装额外的软件包, 使用简单的命令启动创建docker swarm集群. 如果你在运行 Docker 1.12时,你就可以原生创建一个 Swarm 集群 . 集成了swarm集群的安全特性, 集成了K-V存储, 你现在不需要额外部署etcd

docker swarm集群及其UI部署

一.规划 ①swarm01作为manager节点,swarm02和swarm03作为worker节点. # cat /etc/hosts 127.0.0.1   localhost 192.168.139.175  swarm01  192.168.139.176  swarm02  192.168.139.177  swarm03 ②配置SSH免密登陆 # ssh-keygen -t rsa -P '' # ssh-copy-id -i .ssh/id_rsa.pub [email prote

(转) Docker swarm - 使用体验 1+2

背景 凭借敏捷开发部署理念的推行,相信对于很多人来说docker这项容器技术已经并不陌生,Docker 1.12引擎发布了快两个月,新引擎中包含了许多特性.诸如: Swarm模式,容器集群的健康检查,节点的身份加密,docker Service API调用,容器启动的过滤匹配方式(constraint), docker的内建路由,以及支持在多平台系统上运行docker(MAC.Windows.AWS.AZURE),以及一些插件升级等等. 特性之多,就连Docker 自己的产品经理也表示这次的新版