Docker Swarm群集

Docker Swarm 是什么?node

Docker Swarm是一个用于建立Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操做集群,会使用户感受就像是在一台主机上进行操做linux

docker1.12集成了swarmkit, 使你能够不用安装额外的软件包, 使用简单的命令启动建立docker swarm集群。git

若是你在运行 Docker 1.12时,你就能够原生建立一个 Swarm 集群 .github

集成了swarm集群的安全特性, 集成了K-V存储, 你如今不须要额外部署etcd或者consulweb

Docker1.12版本中,一个大的功能点是swarm集群(基于swarmkit项目),经过Docker命令能够直接实现docker-engine相互发现,并组建成为一个容器集群docker

SwarmKit将节点分为两类:数据库

工做节点(Worker:负责经过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。apache

  (1)内建分布式存储,不要额外的数据库vim

  (2)支持Rolling update centos

  (3容器高可用

  (4)经过TLS保证了节点之间通信的安全

管理节点(Manager:负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户能够动态调整节点的角色,即在ManagerWorker之间转换。

以下图所示,这是一个典型的master-slave的架构。每一个节点都是运行着Docker EngineDocker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。

wKiom1mrwjCjvOMvAADAHVKu1T4591.png-wh_50


部署docker1.12 Swarm

实验环境:

这里选择三台主机运行Swarm,依次为:

node1   192.168.100.5

node2  192.168.100.6

node3  192.168.100.7

 

基本环境配置

3台主机确保时间一致 ntp

3台主机均关闭selinux,开启路由转发。 /ect/sysctl.conf

[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

4关闭selinux

[root@localhost ~]# setenforce 0

5 3台主机修改/etc/hosts文件

wKioL1mrwk6Tw4RBAAAJvJ4uGWE420.png-wh_50

Ping  连通性

wKiom1mrwrryIT9wAAAV0-_-RLE154.png-wh_50

开启宿主机之间的端口 

TCP端口2377集群管理端口

TCPUDP端口7946节点之间通信端口

TCPUDP端口4789 overlay网络通信端口

wKioL1mrwrDik1x-AAAycdfHzk4610.png-wh_50

配置全部节点密钥登陆.

配置所下节点密钥互信, node1能够免密码登陆各节点,只在node1上执行:

生成sshkey

[root@localhost ~]# ssh-keygen

发布sshkey到各个节点  ssh-copy-id node2  3 1

wKiom1mrwujBTAq7AAArrFBozmQ320.png-wh_50

测试密钥登陆

wKioL1mrwtvAwrKtAAAjRjRvsaM654.png-wh_50

安装docker 1.12  yum报错 rm -rf  /var/rum/yum.pid 删除pid  3台都须要安装

[root@localhost /]# yum -y install docker
[root@localhost /]# systemctl start docker

docker1.12 Swarm 模式简介

Docker Engine 1.12 集成了Swarm集群工具.

主要使用三个新的命令行工具建立一个swarm集群:

docker swarm 开启swarm模式; 加入Swarm集群; 配置集群参数

docker node 查询集群节点信息; 提高/移除一个管理节点; 管理swarm节点主机

docker service 建立管理 service

能够查看docker  --help

建立 Swarm集群

node1上初始化swram集群:

注意 你只须要在一个node1上初始化swarm集群, 其余node加入这个集群就好了, 因此如下命令只须要在node1上运行.

[root@localhost /]# docker swarm init --advertise-addr 192.168.100.5

wKiom1mrwyiyzxZtAAAjufiqens222.png-wh_50

1) 查看swarm集群node列表 

[root@localhost /]# docker node ls

wKioL1mrwzHAj5bhAAAQFQ193l4292.png-wh_50

咱们的其余节点服务器,worker角色加入swarm集群须要登陆到服务器运行以下命令:

[root@localhost /]# docker swarm  join-token  worker

1) 其余节点以worker加入集群使用上面查看到的命令加入集群(node二、node3上)

wKiom1mrw4nwYwpzAAAYnhZ4tFI360.png-wh_50

1) 查看集群节点状况,验证加入与否

wKioL1mrw3_wziR8AAAXmNDSaYE922.png-wh_50

1) 提高node2为管理 

[root@node1 /]# docker node promote node2

wKiom1mrw7vRpdP3AAAYJieaYyQ176.png-wh_50

docker  swarm:集群管理,子命令主要有下面几个。

docker swarm init命令用于初始化一个集群

dockerswarm join命令用于加入一个现有集群

dockerswarm leave命令因为离开集群

有了Docker Swarm集群咱们如何把咱们的应用跑在Swarm集群上呢?

很简单, 基本上原来咱们使用docker run的命令建立容器, 把前面替换成docker service create就好了.

建议搭建一个registry,为所的docker主机提供镜像下载,不然你须要在每一个docker主机本地存在容器镜像。

因此搭建一个私有仓库,由私有仓库提供所须要的镜像,

本实验环境中用node1同时做为registry

拉取本地私有仓库registry查看registry镜像wKioL1mrw9nBDK62AAAX33zcGpI317.png-wh_50

上传registry2.tar

wKiom1mrw9bSFZcWAAAgjeklmR4979.png-wh_50

运行容器(端口映射、随docker启动时容器亦启动、路径映射、名字)

[root@node1 src]# mkdir -p /opt/data/registry
[root@node1 src]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry/:/var/lib/registry --name registry2 registry:2

wKioL1mrw-nQ3Xx0AAAX33zcGpI085.png-wh_50

查看私有仓库(能够看到仓库为空)

[root@node1 src]# curl 192.168.100.5:5000/v2/_catalog

1. 全部节点指向registry服务器:

中止docker服务

[root@node1 src]# vim /usr/lib/systemd/system/docker.service

wKioL1mrxNPg_HtPAAAW-TKPj40708.png-wh_50

[root@node1 src]# systemctl daemon-reload 
[root@node1 src]# systemctl start docker

1. 推送镜像并验证

node2上传镜像

[root@node2 src]# docker load < centos7.tar

node2配置Dockerfile

[root@node2 apache]# vim dockerfile 
FROM docker.io/centos:latest
RUN yum -y install httpd net-tools
RUN sed 's/#ServerName /ServerName /g' -i /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD  ["/usr/sbin/httpd","-DFOREGROUND"]

node2构建

[root@node2 apache]# docker build -t 192.168.100.5:5000/centos:httpd .

node2上传镜像到registry

查看registry中镜像

[root@node2 apache]# curl 192.168.100.5:5000/v2/_catalog

node三、node1测试从registry下载镜像  nond3 测试

wKiom1mrxVehKZ3VAAAivWU--P4490.png-wh_50

wKioL1mrxTyQ6TKMAAARo9ikvdA304.png-wh_50

overlay网络

解决了镜像构建问题, 为了让应用跑在swram集群,咱们还须要解决容器间的网络访问问题.

单台服务器的时候咱们应用全部的容器都跑在一台主机上, 因此容器之间的网络是互通的. 如今咱们的集群有3台主机, 因此docker应用的服务会分布在这3台主机上.

如何保证不一样主机上的容器网络互通呢?

swarm集群已经帮咱们解决了这个问题了,就是只用overlay network.

docker 1.12之前, swarm集群须要一个额外的key-value存储(consul, etcd). 来同步网络配置, 保证全部容器在同一个网段中.

docker 1.12已经内置了这个存储, 集成了overlay networks的支持.

下面咱们演示下如何建立一个 overlay network:

注:swarm上默认已有一个名为ingressoverlay 网络, 能够直接使用, 但本文会建立一个新的

为咱们的docker应用建立一个名为dockercoinsoverlay network

1. node2上建立overlay network

[root@node2 apache]# docker network create --driver overlay dockercoins
[root@node2 apache]# docker network ls

wKiom1mrxbKjKKl9AAAnWiyX3Fk581.png-wh_50

1. node1上查看(worker节点看不到)

wKioL1mrxanDPn7yAAAdxNGAfr0100.png-wh_50

注:一旦新的任务被指定给这个节点,Overlay网络就会被按需建立。

swarm集群上运行docker应用

概念解释:service

Docker1.12 swarm引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器。

服务包括两种类型:

复制服务(replicated services):相似 k8s 中复制集的概念,保持必定数量的相同任务在集群中运行;

全局服务(global services):相似 k8s daemon 的概念,每一个工做节点上运行一个。

 

发布服务

manager上执行以下命令:

下面咱们能够使用以前push到本地镜像仓库的镜像启动服务, centos:http为例:

复制服务类型运行服务

manager上执行以下命令:

[root@node1 src]# docker service create --replicas 1 --network dockercoins --name web1 -p 8000:80 192.168.100.5:5000/centos:httpd
efd1jxmt3pthvwscgkt1n1hj6

wKiom1mrxfOSCUsUAAAjK7W-NGQ339.png-wh_50

浏览器验证:(三个节点ip:8000均可以访问)

wKioL1mrxeejb03wAABZmNNgzqA183.png-wh_50

如运行web2,俩个容器运行服务:

[root@node1 src]# docker service create --replicas 2 --network dockercoins --name web2 -p 8080:80 192.168.100.5:5000/centos:httpd
f2wh08sgy2q2wp5s63oczxk1t

wKioL1mrxgLQhfa5AAAxkH7KDtM294.png-wh_50

从上图能够看到web2名称的service2个副本分别运行在node2node3节点上

1. 以全局服务类型运行服务:

wKiom1mrxiySvC1aAAAROb4ALmY752.png-wh_50

从下图能够看到服务web4在每一个节点上都运行一个

wKioL1mrxiGQ1RNGAABIaTdq2ZI848.png-wh_50

下面咱们扩展旧的服务,从下图能够看到web1  service目前只有一个副本

[root@node1 /]# docker service scale web1=3

wKiom1mrxlez5I7TAAAcYTQsvY8071.png-wh_50

wKiom1mrxmTjtZF8AAAWhv15hD4392.png-wh_50

能够看到web1服务扩展到3个副本数。

3 缩减已有的服务副本数:

[root@node1 /]# docker service scale web1=2

wKioL1mrxmTyrx5fAAAVFv3byWY972.png-wh_50

能够看到web1服务缩减到2个副本数。

Swarm节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节点或容器宕掉,swarm engine就会尝试修复,下面咱们来具体看一下

自修复(self-healing

wKiom1mrxpOyHLVUAAApqHy2_Gw850.png-wh_50

能够看到:3个节点,运行8个任务(容器)。包含一个registry容器。

wKioL1mrxovxo3ZOAAAssES16NE652.png-wh_50

咱们模拟node3上的容器都宕掉或部分宕掉

[root@node3 /]# docker stop $(docker ps -aq)

wKioL1mrxrPgkspcAAAJ5CWAQv8348.png-wh_50

结果:

wKiom1mrxtjw44a1AAAg4LV8DSM415.png-wh_50

能够看到docker会在相同节点上启动1个不一样ID的容器。

Self-Organizing

如今咱们让node3整个宕掉,node3上的容器会自动在其它节点上启动。

manager节点上执行docker  server ps服务名

[root@node3 /]# systemctl stop docker

结果: node1 上

wKioL1mrxtnigVi3AAAu_Iyv4F4502.png-wh_50

node2

wKiom1mrxwKQB2ZXAAAmXpIu4oI806.png-wh_50

能够看到node3上的web2.2在node2上启动了;至于node3上的web4.0则由于是全局服务类型,故而node3中止服务后,会停掉。

相关文章
相关标签/搜索