Docker实践(六):Docker Swarm

环境说明:

主机名 操作系统版本 IP地址 docker版本 说明
manager Ubuntu 16.04.5 172.27.9.71 18.09.2 manager管理主机
work01 Ubuntu 16.04.5 172.27.9.75 18.09.2 worker主机01
work02 Ubuntu 16.04.5 172.27.9.76 18.09.2 worker主机02

本文所有测试都在Vmware虚拟机(版本为12.5.2)上完成
ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录
docker安装详见:Ubuntu16.04安装Docker
docker-machine安装详见:docker machine实践

一、简介

1.Swarm是Docker公司推出的用来管理docker集群的平台,基于GO语言实现,代码开源在https://github.com/docker/swarm, 其核心设计是将几台安装Docker的机器组成一个大的集群,相当于变成一个单一的虚拟主机,该集群提供给用户的管理集群所有容器的操作接口与使用一台Docker几乎相同。
?
2.作为容器集群管理器,Swarm最大的优势之一就是原生支持Docker API,给用户带来极大的便利。各种基于标准API的工具如Compose、Docker SDK、各种管理软件甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
?
3.Docker Swarm和Docker Compose一样,都是Docker官方容器编排项目,但不同的是Docker Compose是一个在单个服务器或主机上创建多个容器的工具,而Docker Swarm则可以在多个服务器或主机上创建容器集群服务
?
4.从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

二、基本概念

  • Swarm集群 ?Swarm集群(Cluster)为一组被统一管理起来的Docker主机。这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机作为管理节点(manager)响应外部的管理需求,其他主机作为工作节点(worker)来实际运行Docker容器
  • Node ?节点(Node)是Swarm集群的最小资源单位,每个节点实际上都是一台Docker主机。节点分为管理节点(manager node)和工作节点(worker node)
  • Service ?服务(Service)由多个Task(任务)组成,每个任务为某个具体的应用,Service的所有Task状态对等,Service定义了worker node上要执行的任务
  • Task ?任务(Task)是Swarm集群中最小的调度单位,任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点,一个任务包含了一个容器及其运行的命令

Node:

Service:

任务与调度:

replicated services和global services:

三、功能测试

1. 创建Swarm集群

在管理节点上执行如下命令创建Swarm集群

[email protected]:~# docker swarm init --advertise-addr 172.27.9.71
Swarm initialized: current node (prgucud40k77t38uadcq4rboq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377

To add a manager to this swarm, run ‘docker swarm join-token manager‘ and follow the instructions.

默认情况下管理节点也是work节点,如果希望管理节点专用,即不作为work节点,可以使用‘--availability’参数:

[email protected]:~# docker swarm init --advertise-addr 172.27.9.71 --availability=drain

2. work node加入集群

2.1 查看加入命令

[email protected]:~# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377

加入命令可以通过在管理节点执行‘docker swarm join-token worker ’命令查看,也可以直接使用步骤1中创建集群时的命令提示。

2.2 加入集群

在两个work节点上分别执行如下命令

[email protected]:~# docker swarm join --token SWMTKN-1-3fcb2bna1livym0xvq6b4m4re9dewyxm51ie6su9plog7hr3xd-cutz7yabg6k28dsna83mzgwkt 172.27.9.71:2377
This node joined a swarm as a worker.

与join对应的是leave

[email protected]:~# docker swarm leave 

leave命令会离开集群,node上面的容器也会迁移到其他node

3. 查看集群信息

[email protected]:~# docker node ls
[email protected]:~# docker info

4. service创建和删除

4.1 创建service

[email protected]:~# docker service create --name web-service --replicas 3 nginx

创建service:web-service,参数‘--replicas’指定副本数量。
Swarm集群服务类型有两种:replicated servicesglobal services。默认为replicated services(复制服务)模式,通过--replicas参数指定副本数量;global service(全局服务)模式,在每个node上运行一个且最多一个副本。

4.2 查看service

[email protected]:~# docker service ls
[email protected]r:~# docker service ps web-service
[email protected]:~# docker service inspect web-service --pretty 


可以看到3个副本分布在三个节点上,参数‘--pretty’表示以适合阅读格式输出。

4.3 删除service

[email protected]:~# docker service rm web-service
web-service

5. service扩容与缩容

使用docker service scale命令可以对service进行扩容和缩容操作。

5.1 service扩容

将4.1中创建的service扩容至5个副本。

[email protected]:~# docker service scale web-service=5

节点manager和work02上分别新建副本4和副本5。

5.2 service缩容

[email protected]:~# docker service scale web-service=2

将service缩容至2个副本。

6. service灰度升级

6.1 新建service

新建service my-web,使用镜像httpd:2.4,副本数为6。httpd版本查看:https://hub.docker.com/_/httpd?tab=tags

[email protected]:~# docker service  create --name my-web --replicas 6  --update-delay 30s --update-parallelism 2  httpd:2.4


参数‘--update-delay’指定更新间隔,默认为0,‘--update-parallelism’指定并行更新副本数量,默认为1。

6.2 升级my-web

将my-web由2.4升级至2.4.39

[email protected]:~# docker service update --image httpd:2.4.39  my-web 




my-web升级至2.4.39,并且每次升级两个副本,间隔30s。

6.3 回滚

[email protected]:~# docker service rollback my-web 

使用docker service rollback命令可以将service回滚到上一个版本。这里的上一个版本指最近的一个版本,比如httpd服务由2.4升级至2.4.38再升级至2.4.39,第一次rollback会回退至2.4.38,第二次rollback则回退至上一个版本2.4.39而不是2.4,即不能无限回退。

7. 外部访问service

7.1 删除所有service

[email protected]:~# docker service rm $(docker service ls -q)

7.2 新建service my-httpd

[email protected]:~# docker service create --name my-httpd --replicas 3 --publish 8080:80 httpd

新建三副本的service:my-httpd,使用--publish参数配置容器NAT网络的端口映射。

7.3 service查看并进入容器

7.4 更新apt源

tee /etc/apt/sources.list <<-‘EOF‘
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
EOF

7.5 安装ping和ip命令

[email protected]:/usr/local/apache2#  apt-get install iproute2 -y
[email protected]:/usr/local/apache2# apt-get install iputils-ping -y

7.6 查看ip


eth0对应的是ingress network网络,用于容器之间访问;eth1对应的是docker_gwbridge,用于容器访问外网。

三个node节点上对应的eth0网卡ip分别为:10.255.0.6/7/8

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

7.7 ping测试


在manager节点上的容器中分别指定网卡eth0和eth1做ping测试,证实了7.6的结论:eth0用于容器间通讯;eth1用于访问外网。

7.8 RoutingMesh

分别修改三个节点的index.html主页内容

tee htdocs/index.html <<-‘EOF‘
<html><body><h1>manager node 172.27.9.71 !</h1></body></html>
EOF

主页内容为hostname+ip
访问service

[[email protected] ~]# for i in {1..10};do sleep 1; curl http://172.27.9.71:8080; done 


routing mesh会将我们对任何节点的8080端口的访问通过swarm内部的load balancer将请求以轮询方式转发给my-httpd中的每一个副本。
小结:

  • 1.通过端口映射方式实现外部对service访问;
  • 2.容器内的eth0用于容器间通讯,eth1用于容器访问外部网络;;
  • 3.routing mesh会将请求以轮询方式发送给每一个副本;

8. service间的访问

8.1 新建overlay network loong

[email protected]:~# docker network create -d overlay loong

需要相互通信的service必须属于同一个overlay网络,默认的overlay网络ingress不提供DNS服务,故创建一个新的overlay网络loong

8.2 新建service my-web

[email protected]:~# docker service create --name my-web --replicas 3 --network loong  httpd


新建service:my-web

8.3修改index.html

分别修改my-web三个副本的index.html:hostname+ip
参见7.8

8.4 新建service centos

[email protected]:~# docker service create --name centos --network loong centos sleep 100000

安装nslookup命令

8.5 service访问测试


小结:将service接入Overlay网络时,Swarm会给service分配一个VIP,VIP与一个包含service名称的DNS记录形成映射关系,这个service的所有container共享这条DNS记录,Swarm也会创建一个load balance将访问的VIP流量均衡到所有的副本上。

9. service logs

[email protected]:~# docker service logs my-web 


通过docker service logs获取某个服务或者task的日志信息。

10. failover

10.1 新建service mybusybox

[email protected]:~# docker service create --name mybusybox --replicas 3 busybox sleep 100000


新建三副本的service mybusybox,查看得知mybusybox分布在三个节点上。

10.2 设置节点work01不可用

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

设置节点work01状态为drain,即可不用

10.3 查看work01状态

[email protected]:~# docker node inspect work01 --pretty 


节点work01状态为不可用

10.4 查看service


可以看到原先在work01上的mybusybox.3处于shutdown状态,上面的task被迁移至work02

10.5 重置work01为可用

[email protected]:~# docker node update --availability active work01


重置work01为active状态,此时运行在work02的mybusybox.3不会回切

11. 节点角色互换

使用promote/demote命令可以对节点的角色进行管理,方便对Manager节点进行容灾处理。

11.1work节点升级为manager

[email protected]:~# docker node promote work01



将work01节点升级为manager,升级后节点work01可成功运行管理节点命令。

11.2 manager降级为work节点

[email protected]:~# docker node demote manager 


将主机manager运行的manager节点降级为work节点,此时该节点已无法运行管理节点命令

work01上查看节点状态,发现manager只有work01

12. service指定node部署

通过设置label,可以灵活描述node的属性,service可通过lable选择部署的节点。

12.1 设置lable

[email protected]:~# docker node update --label-add env=manager manager


分别设置节点manager、work01、work02的lable为tag=manager、tag=work01、tag=work02,‘tag=manager’等号两边都为自定义值。

12.2 指定节点新建service

[email protected]:~# docker service create  --name my_nginx --replicas 3 --constraint  ‘node.labels.tag == work01‘ nginx  


新建service my_nginx,指定node为work01

12.3 service节点迁移

[email protected]:~# docker service update --constraint-rm ‘node.labels.tag == work01‘ my_nginx
[email protected]:~# docker service update --constraint-add ‘node.labels.tag == work02‘ my_nginx


将my_nginx由节点work01迁移至work02

12.4 删除label

[email protected]:~# docker node update --label-add tag2=manager2 manager
[email protected]:~# docker node update --label-rm tag manager


一个node上可以有多个label,通过参数‘--label-rm’可以删除label

原文地址:https://blog.51cto.com/3241766/2385330

时间: 2024-10-07 14:28:05

Docker实践(六):Docker Swarm的相关文章

docker 实践六:dockerfile 详解

本篇开始来学习关于 dockerfile 的知识. 注:环境为 CentOS7,docker 19.03. dockerfile 是?个?本格式的配置?件, ?户可以使? dockerfile 来快速创建?定义的镜像. 指令系统 dockerfile 主要是通过一个指令来实现想要的功能的.dockerfile 支持的指令如下 ARG 定义创建镜像过程中使?的变量.格式为: ARG<name>[=<default value>] 在执?docker build时, 可以通过 -bui

Docker实践3: Docker常用命令(未完)

查看容器及运行进程 docker ps 查看容器内部信息 docker inspect container_id 进入容器 docker attach container_id 退出容器 docker kill container_id 查看日志 docker logs container_id

Docker 实践 01 Docker安装

ubuntu安装Docker 1.安装curl工具 copy #apt-get update   #apt-get install curl 2.通过脚本安装docker copy #curl -fsSL get.docker.com -o get-docker.sh   #sh get-docker.sh --mirror Aliyun 3.配置镜像加速器 #curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s htt

Docker(十六)-Docker的daemon.json的作用

docker安装后默认没有daemon.json这个配置文件,需要进行手动创建.配置文件的默认路径:/etc/docker/daemon.json 一般情况,配置文件 daemon.json中配置的项目参数,在启动参数中同样适用,有些可能不一样(具体可以查看官方文档),但需要注意的一点,配置文件中如果已经有某个配置项,则无法在启动参数中增加,会出现冲突的错误. 如果在daemon.json文件中进行配置,需要docker版本高于1.12.6(在这个版本上不生效,1.13.1以上是生效的) 参数 

基于IBM Bluemix的Docker实践教程

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文开始简单介绍了Docker以及IBM Bluemix,接下来阐述了如何通过Ubuntu14.04操作系统来配置IBM Bluemix的Docker容器与镜像的操作环境,并演示了在本地操作镜像push到Bluemix中并创建运行容器输出结果和在Bluemix上一些Docker相关命令操作. 操作系统: Ubuntu14.04 一.需要的准备工作 1.注册一个Bluemix账号 2.对

Docker实践

一.Docker是什么 docker直译为码头工人.当它成为一种技术时,做的也是码头工人的事.官网是这样描述它的:"Docker是一个开发的平台,用来为开发者和系统管理员构建.发布和运行分布式应用."也就是说,如果把你的应用比喻为货物,那么码头工人(Docker)就会迅速的用集装箱将它们装上船.快速.简单而有效率. 它是用Go语言写的,是程序运行的"容器"(Linux containers),实现了应用级别的隔离(沙箱).多个容器运行时互补影响,安全而稳定. 我喜欢

Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要实现技术.但目前技术还不够成熟,在生产实践中会遇到不少坑.本期参与小组交流的是国内较早采用 Docker 实践的公司. 参与嘉宾:沪江架构师黄凯.滴滴架构师田智伟.蘑菇街架构师张振华.蘑菇街运维架构师向靖.七牛技术总监袁晓沛.扇贝技术总监丁彦 第一轮:自由交流 沪江黄凯:大家好,我是来自沪江的 Ja

Docker实践(4)—network namespace与veth pair

network namespace 创建network namespace # ip netns add blue # ip netns list blue 添加网口到namespace 先创建veth # ip link add veth0 type veth peer name veth1 在当前namespace可以看到veth0和veth1 # ip link list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue stat

在(Docker里的)Jenkins里运行Docker实践

按照在(Docker里的)Jenkins里运行Docker( http://www.dockone.io/article/431)进行实践. 通过该文章,可以快速了解如何在一个容器(这里是Jenkins容器)里装载Docker sock以便创建其"兄弟"容器,有人称之为DooD(Docker-outside-of-Docker),以区别于DinD(Docker-in-Docker),后者是在容器中安装一个完整的隔离的Docker版本. 当然,也可以在Jenkins容器中使用Docker