Docker Swarm群集配置实战(2)

前言:



这篇博文是基于docker Swarm群集环境之上,延伸了Docker Swarm的功能。

博文大纲:
一、Docker Swarm网络管理
二、二、Swarm的service管理及版本更新

这篇博文的环境还是基于上一篇博文中搭建的环境,具体可以参考博文:Docker Swarm群集配置实战(1) ,在进行接下来的操作之前,必须要保证访问docker Swarm的web UI时,可以看到以下界面:

一、Docker Swarm网络管理

Swarm群集会产生两种不同类型的流量:

  • 控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开Swarm,这种类型的流量总是被加密的。(涉及到集群内部的hostname、ip-address、subnet、gateway等);
  • 应用数据层面:包括容器与客户端的通信等。(涉及到防火墙、端口映射、网口映射、VIP等)

在Swarm service中有三个重要的网络概念:

  • overlay networks 管理Swarm中docker守护进程间的通信。可以将容器附加到一个或多个已存在的overlay网络上,使容器与容器之间能够通信;
  • ingress network 是一个特殊的 overlay 网络,用于服务节点间的负载均衡。当任何 Swarm 节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有IP地址,选择其中的一个,并通过 ingress 网络将请求路由到它;
    初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本允许你自定义。
  • docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。
    docker_gwbridge 网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。

查看docker01上面的默认网络,如下(注意其SCOPE列,确认其生效范围):

除了Swarm群集默认创建的两个网络以外,我们还可以自定义创建overlay网络,连接到此网络的容器,即可互相通信,但是需要注意,除了在docker01这个manager上可以查看创建的overlay网络外,其他节点在没有加入此网络前,执行“docker network ls”命令是查看不到的。

创建自定义overlay网络并验证

[[email protected] ~]# docker network create -d overlay --subnet 192.168.22.0/24 --gateway 192.168.22.1 --attachable my_net1
# 创建一个overlay网络,名字为my_net1;
# “--subnet”:指定其网段(可以不指定);“--gateway”:指定其网关(可以不指定);
# 但是在docker  Swarm群集中创建overlay网络时,必须添加“--attachable”选项
# 否则,其他节点的容器运行时,无法使用此网络

创建完成后,在其他docker节点上是查看不到这个新创建的overlay网络的,但是,可以使用此网络(在运行容器时,直接指定即可,等容器运行后,便可以查看到此网络了)

测试刚刚创建的overlay网络,是否可用,分别在docker01、docker02上基于创建的overlay网络运行一个容器,然后进行ping测试,确认可以ping通:

#docker01主机上基于overlay网络创建一个容器:
[[email protected] ~]# docker run -tid --network my_net1 --name test1 busybox
#同docker01的操作,在docker02上也创建一个:
[[email protected] ~]# docker run -tid --network my_net1 --name test2 busybox

在容器创建后,在docker02主机上,使用test2这个容器去ping容器test1,测试结果如下(由于是自定义网络,所以可以直接ping对端容器的容器名):

二、Swarm的service管理及版本更新

1、指定某个service运行在同一台docker服务器上

在第一篇的博文中测试过,如果Swarm群集中的manager下发一个service任务,那么,下发的任务将随机分布在群集中的docker服务器之上运行, 如果说,由于需要将自己的生产环境配置的统一、规范一些,某一台docker服务器,我就只运行web服务,另一台docker主机,我就只运行PHP服务,那么,怎么解决呢?

解决方案一:

[[email protected] ~]# docker service create --replicas 3 --constraint node.hostname==docker03 --name test nginx
#在docker03主机上,基于nginx镜像,运行3个名为test的容器

上述命令的执行后如下所示:

解决方案二:

[[email protected] ~]# docker node update --label-add mem=max docker02
#以键值对的方式给docker02主机打上标签“mem=max”,等号两边的内容是可以自定义的
[[email protected] ~]# docker service create --name test01 --replicas 3 --constraint ‘node.labels.mem==max‘ nginx
#基于nginx镜像在标签为“mem==max”的主机上运行3个名为test01的服务
[[email protected] ~]# docker node inspect docker02   #可以执行此命令查看dokcer02主机的标签
#标签相关的信息,在Spec{  }中

查看web UI界面进行确认:

2、更新某个service版本

1)准备要使用的镜像,并基于此镜像运行service

[[email protected] aa]# cat html/index.html    #准备网页文件
127.0.0.1
[[email protected] aa]# cat Dockerfile
#基于nginx容器,将当前目录下的html目录挂载为nginx的网页根目录
FROM nginx
ADD html /usr/share/nginx/html
[[email protected] aa]# docker build -t 192.168.20.6:5000/testnginx:1.0 .     #生成一个镜像
[[email protected] aa]# docker push 192.168.20.6:5000/testnginx:1.0
#将新生成的镜像上传至私有仓库
[[email protected] aa]# docker service create --name newnginx -p 80:80 --replicas 3  192.168.20.6:5000/testnginx:1.0
#基于上传到私有仓库的镜像,运行三个service,并映射到本地80端口
#当上面的命令执行成功后,只要docker主机上运行着那个service,就可以通过它的80端口访问到nginx服务

运行后,web UI界面显示如下:

可以看到,每个节点都运行了那个service,也就是说,访问哪个节点的80端口,都可以看到一样的页面,如下:

在docker01上查看service的详细信息,如下:

[[email protected] aa]# docker service ps newnginx    #查看service的详细信息

命令执行的结果(需要注意的是其镜像标签,也就是说注意其是基于哪个镜像运行的):

2)准备该镜像的2.0版本(模拟在线版本升级):

[[email protected] aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:2.0
#准备2.0版本的镜像
[[email protected] aa]# docker push 192.168.20.6:5000/testnginx:2.0
#上传到私有仓库
[[email protected] aa]# docker service update --image 192.168.20.6:5000/testnginx:2.0 newnginx
#将newnginx服务的镜像升级到2.0
[[email protected] aa]# docker service ps newnginx    #再次查看service的详细信息

命令执行的结果如下,发现基于1.0镜像运行的newnginx的service状态已经变成了shutdown,而基于2.0运行的service变为了running,如下:

此时,若再次访问其web页面,就变为了nginx的默认首页(因为我们的2.0镜像只是更改了下nginx镜像的标签,并没有修改其文件),如下:

其web UI界面可以查看到该service的最后一次升级的时间。

3)升级2.0到3.0(升级时,对其进行精细的控制)

[[email protected] aa]# docker tag nginx:latest 192.168.20.6:5000/testnginx:3.0
#准备3.0版本的镜像
[[email protected] aa]# docker push 192.168.20.6:5000/testnginx:3.0
#上传到私有仓库
[[email protected] ~]# docker service update --replicas 6 --image 192.168.20.6:5000/testnginx:3.0 --update-parallelism 3 --update-delay 1m newnginx
#上述选项的含义如下:
# “--replicas 6”:更新后的service数量为6个(原本是3个)
# “ --update-parallelism 2 ”:设置并行更新的副本数。
# “ --update-delay 1m ”:指定滚动更新的时间间隔为1分钟
[[email protected] ~]# docker service ps newnginx    #自行对比newnginx服务的详细信息

4)版本回滚操作

当我们升级到新的版本后,发现新版本的镜像有些问题,而不得不返回之前运行的版本,那么可以执行下面的操作:

[[email protected] ~]# docker service update --rollback newnginx   #将newnginx的service回滚到前一个版本
[[email protected] ~]# docker service ps newnginx   #自行查看

执行回滚命令后,回滚过程如下:

回滚成功后,我这里就从原来的3.0变回了2.0,虽然在升级3.0的时候,指定的service数量是6个,但是之前只有3个,所以在执行回滚操作后,service数量也将变回3个。

注意:当我们执行回滚操作的时候,默认是回滚到上一次操作的版本,并且不可以连续回滚。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/14154700/2446621

时间: 2024-10-27 13:44:05

Docker Swarm群集配置实战(2)的相关文章

Docker Swarm群集配置实战

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合. 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要

Docker Swarm群集项目案例

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

Docker Swarm群集

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

部署Docker swarm集群(一)

一.Docker swarm简介 Docker swarm与docker-compose一样,都是docker官方推出的docker容器的编排工具.但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合. Docker swarm:其作用就是把若干个Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各

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系列(十四):Docker Swarm集群

一.Swarm简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Kubernetes比较类似,但是更加轻便,具有的功能也较kubernetes更少一些. Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm 是 Do

docker Swarm集群配置

前言: Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合. 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们

centos7 docker宿主机配置桥接物理网络终极实战

1.停止docker daemon,并删除docker0 systemctl stop docker.service ip link set dev docker0 down brctl delbr docker0 2.创建桥接物理网络: 2.1.思路整理 (1)新建br0桥接网络,brctl show可以查看(需安装bridge-utils) (2)将宿主机物理网卡IP.掩码.网关.dns(或者dhcp)配置到br0上 (3)删除宿主机物理网卡IP.掩码.网关.dns(或者dhcp)配置 (4

Docker Swarm集群部署实战

基本概念: Swarm介绍:Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in Go, docker_py,docker等)均可以直接与Swarm通信.Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可