Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操作集群,会使用户感觉就像是在一台主机上进行操作
docker1.12集成了swarmkit, 使你可以不用安装额外的软件包, 使用简单的命令启动创建docker swarm集群。
如果你在运行 Docker 1.12时,你就可以原生创建一个 Swarm 集群 .
集成了swarm集群的安全特性, 集成了K-V存储, 你现在不需要额外部署etcd或者consul。
在Docker1.12版本中,一个大的功能点是swarm集群(基于swarmkit项目),通过Docker命令可以直接实现docker-engine相互发现,并组建成为一个容器集群。
SwarmKit将节点分为两类:
工作节点(Worker):负责通过执行容器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。
(1)内建分布式存储,不要额外的数据库
(2)支持Rolling update
(3)容器高可用
(4)通过TLS保证了节点之间通讯的安全
管理节点(Manager):负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在Manager和Worker之间转换。
如下图所示,这是一个典型的master-slave的架构。每个节点都是运行着Docker Engine的Docker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。
部署docker1.12 Swarm
实验环境:
这里选择三台主机运行Swarm,依次为:
node1 192.168.1.107 时间同步服务器 系统CentOS7
node2 192.168.1.129
node3 192.168.1.130
基本环境配置
为了3台主机确保时间一致在node1上面配置ntp服务器
[root@node1 ~]# yum -y install ntp [root@node1 ~]# vim /etc/ntp.conf
添加下面两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@node1 ~]# systemctl restart ntpd [root@node1 ~]# firewall-cmd --permanent --add-port=123/udp [root@node1 ~]# firewall-cmd --reload
node2和node3两台节点服务器进行时间同步
[root@node2 ~]# /usr/sbin/ntpdate 192.168.1.107
21 Aug 15:31:23 ntpdate[4304]: step time server 192.168.1.107 offset 0.621419 se
[root@node3 ~]# /usr/sbin/ntpdate 192.168.1.107
21 Aug 15:31:52 ntpdate[4239]: adjust time server 192.168.1.107 offset -0.004892 sec
关闭selinux,开启路由转发3台配置一样
[root@node1 ~]# setenforce 0 [root@node1 ~]# vim /etc/sysctl.conf
添加
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
net.ipv4.ip_forward = 1
修改主机名3台方法一样
以node1 为例子:
[root@node1 ~]# vim /etc/hostname
node1
系统环境准备
准备系统环境, 配置host列表
3台主机都修改/etc/hosts文件,添加所有主机的ip地址和主机名的映射记录
以node1 为例子:
[root@node1 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.107 node1
192.168.1.129 node2
192.168.1.130 node3
开启宿主机之间的端口 3台同样配置
TCP端口2377集群管理端口
TCP与UDP端口7946节点之间通讯端口
TCP与UDP端口4789 overlay网络通讯端口
[root@node1 ~]# firewall-cmd --permanent --add-port=2377/tcp [root@node1 ~]# firewall-cmd --permanent --add-port=2377/udp [root@node1 ~]# firewall-cmd --permanent --add-port=7946/tcp [root@node1 ~]# firewall-cmd --permanent --add-port=7946/udp [root@node1 ~]# firewall-cmd --permanent --add-port=4789/tcp [root@node1 ~]# firewall-cmd --permanent --add-port=4789/udp [root@node1 ~]# firewall-cmd --reload
配置所有节点密钥登录.
配置所下节点密钥互信, 在node1可以免密码登录各节点,只在node1上执行:
生成sshkey
[root@node1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
44:ce:a9:46:24:60:d8:06:60:d9:df:5d:b4:33:1b:03 root@node1
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
|+==.. . .E.. |
|ooo. o + .... |
| . . o * .* |
| o + . * |
| o S . |
| . |
| |
| |
| |
+-----------------+
发布sshkey到各个节点
[root@node1 ~]# ssh-copy-id node1 [root@node1 ~]# ssh-copy-id node2 [root@node1 ~]# ssh-copy-id node3
测试密钥登录
[root@node1 ~]# for N in $(seq 1 3); do ssh node$N hostname; done ;
node1
node2
node3
在所有节点上安装docker 1.12:
以下命令请在所有节点上执行.
安装docker
[root@node1 ~]# yum -y install docker
设为开机自启动并启动docker
[root@node1 ~]# systemctl enable docker [root@node1 ~]# systemctl start docker
检查docker版本
[root@node1 ~]# docker -v
Docker version 1.12.6, build 88a4867/1.12.6
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@node1 ~]# docker swarm init --advertise-addr 192.168.1.107
Swarm initialized: current node (9boy0msaa19b67z4ssp8yc32d) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2fmdoue8fnqf26yp5m3quoxav33nxrjwbogwhcftpnlpjgoy16-7c3tgluhurunkdy9y9fc0ei65 \
192.168.1.107:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
查看端口号监听情况
[root@node1 ~]# netstat -anpt | grep docker
tcp 0 0 192.168.1.107:32853 192.168.1.107:2377 ESTABLISHED 6259/dockerd-curren
tcp 0 0 127.0.0.1:54831 127.0.0.1:2377 ESTABLISHED 6259/dockerd-curren
tcp6 0 0 :::2377 :::* LISTEN 6259/dockerd-curren
tcp6 0 0 :::7946 :::* LISTEN 6259/dockerd-curren
tcp6 0 0 192.168.1.107:2377 192.168.1.107:32853 ESTABLISHED 6259/dockerd-curren
tcp6 0 0 127.0.0.1:2377 127.0.0.1:54831 ESTABLISHED 6259/dockerd-curren
检查node1 docker swarm mode信息:
[root@node1 ~]# docker info
查看主要内容
Swarm: active #活跃
NodeID: 9boy0msaa19b67z4ssp8yc32d
Is Manager: true #管理角色
ClusterID: 4536wglalec5c489ul0gd8dhn
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
查看swarm集群node列表
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
9boy0msaa19b67z4ssp8yc32d * node1 Ready Active Leader
可以看到,我们的swarm集群中只有一个节点.现在我们把其他节点加入我们的集群中:
把其他节点加入集群中:
方法一:在node1通过ssh, 在node2-node3上执行上面的加入集群命令:
本次不用此方法:
方法二: 如果你不记得方法一提示的加入swarm集群的命令和密钥可以使用如下方式查看worker节点和manager节点的加入命令
本次使用:将node2和node3使用worker节点方式加入swarm集群
首先在node1上面查询集群的命令和密钥
[root@node1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2fmdoue8fnqf26yp5m3quoxav33nxrjwbogwhcftpnlpjgoy16-7c3tgluhurunkdy9y9fc0ei65 \
192.168.1.107:2377
在node2和node3上面执行(直接将红色代码复制粘贴到节点服务器即可)
[root@node2 ~]#docker swarm join \
> --token SWMTKN-1-2fmdoue8fnqf26yp5m3quoxav33nxrjwbogwhcftpnlpjgoy16-7c3tgluhurunkdy9y9fc0ei65 \
> 192.168.1.107:2377
This node joined a swarm as a worker.
[root@node3 ~]# docker swarm join \
> --token SWMTKN-1-2fmdoue8fnqf26yp5m3quoxav33nxrjwbogwhcftpnlpjgoy16-7c3tgluhurunkdy9y9fc0ei65 \
> 192.168.1.107:2377
This node joined a swarm as a worker.
如果想让服务器以manager节点加入swar集群在node1上面查询(直接将红色代码复制粘贴到节点服务器即可)
[root@node1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2fmdoue8fnqf26yp5m3quoxav33nxrjwbogwhcftpnlpjgoy16-agvz0l10lykt66kd4a27fgegq \
192.168.1.107:2377
再次检查集群节点列表, 我们可以看到所有的服务器都已经加入swarm集群了
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8s3cxo00phorkfjb1qhr9iu05 node2 Ready Active
9boy0msaa19b67z4ssp8yc32d * node1 Ready Active Leader
cigtp3x969rcsjzlh5cp2g7s7 node3 Ready Active
不过现在集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 我们希望建立多个manager节点集群.
只需要通过如下命令, 将node2worker节点提升成为manager节点:
[root@node1 ~]# docker node promote node2
Node node2 promoted to a manager in the swarm.
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8s3cxo00phorkfjb1qhr9iu05 node2 Ready Active Reachable
9boy0msaa19b67z4ssp8yc32d * node1 Ready Active Leader
cigtp3x969rcsjzlh5cp2g7s7 node3 Ready Active
查看node2的docker info
[root@node2~]# docker info
查看主要内容
Swarm: active
NodeID: 8s3cxo00phorkfjb1qhr9iu05
Is Manager: true
ClusterID: 4536wglalec5c489ul0gd8dhn
Managers: 2
Nodes: 3
查看node3的docker info
[root@node3 ~]# docker info
查看主要内容
Swarm: active
NodeID: cigtp3x969rcsjzlh5cp2g7s7
Is Manager: false
Node Address: 192.168.1.130
现在我们可以看到, 已经有2个manager节点了, 一个Leader节点, 一个Reachable节点. 现在你也可以在node2上面管理整个swarm集群.
使用node2让node3下线
查看ID
[root@node2 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8s3cxo00phorkfjb1qhr9iu05 * node2 Ready Active Reachable
9boy0msaa19b67z4ssp8yc32d node1 Ready Active Leader
cigtp3x969rcsjzlh5cp2g7s7 node3 Ready Active
使用命令让node3下线
[root@node2 ~]# docker node update --availability drain cigtp3x969rcsjzlh5cp2g7s7
cigtp3x969rcsjzlh5cp2g7s7
[root@node2 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8s3cxo00phorkfjb1qhr9iu05 * node2 Ready Active Reachable
9boy0msaa19b67z4ssp8yc32d node1 Ready Active Leader
cigtp3x969rcsjzlh5cp2g7s7 node3 Ready Drain
使用命令让node3上线
[root@node2 ~]# docker node update --availability active cigtp3x969rcsjzlh5cp2g7s7
cigtp3x969rcsjzlh5cp2g7s7
[root@node2 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8s3cxo00phorkfjb1qhr9iu05 * node2 Ready Active Reachable
9boy0msaa19b67z4ssp8yc32d node1 Ready Active Leader
cigtp3x969rcsjzlh5cp2g7s7 node3 Ready Active
swarm集群就搭建完毕了
学习方法:
习惯使用docker命令帮助:docker<command> --help
总结:
docker swarm 集群管理,子命令主要有下面几个。
docker swarm init命令用于初始化一个集群
docker swarm join命令用于加入一个现有集群
docker swarm leave命令由于离开集群