......接上一篇文章
在Rancher通过界面方式添加容器的方式其实有两种,一种是在上面提到的管理主机,直接添加独立容器(独立于Rancher平台的容器,就算Rancher平台停了,容器还会在各自主机保留),另一种是下一节会讲到的,通过应用添加的方式添加容器(由Rancher平台管理,只要应用删除或Rancher没了,对应的容器也将失效)。
点击主机面板下的【添加容器】按钮,弹出添加容器界面,进行以下配置:
输入本主机唯一并能标识的容器名称,再输入镜像名,默认是ubuntu:14.04.3(即最新版本的基础镜像,就是最最干净Linux的包),关于镜像,可以通过docker search [镜像名] 去搜索:
也可以进入docer hub页面上去搜索,一搜就能搜出大量的公共镜像,并且能看到各个历史版本:
通过标示tag我们就能拉取指定版本的镜像,如tomcat:8.0-jre8,如果不加tag,就写tomcat,默认下载的是最新版本的镜像,即tomcat:latest
【创建前总是拉取镜像】在第一次时需要勾选,如果本地已有镜像,就不需要勾选了(避免反复拉取镜像浪费感情)。注意:如果你新建了一个本地镜像,想直接生成容器,也不要勾选这一项,否则到镜像库里是找不到你新建的本地镜像,就可能报错。
这一步很重要,因为要映射的端口要事先添加好,事后就无法添加端口了(事后添加新端口需要重建容器,即删除原有容器),但是公开端口可以事先修改(比如8080端口映射成80端口,以后发现80端口需要被其他应用占用,那么就可以将8080端口改成映射为8080端口)。如下所示,ganglia应用需要有大量的监控端口,就全列上:
基本不需要设置该面板,唯一比较常见的是要在容器中添加环境变量,比如开启SSL访问的容器应用,就需要添加如下环境变量,docker run命令中包含的变量格式为:
-eREGISTRY_HTTP_TLS_CERTIFICATE=/root/certs/domain.crt -eREGISTRY_HTTP_TLS_KEY=/root/certs/domain.key
那么对应到设置面板里就如下(直接复制粘贴,变量和值自动填入以下输入框):
一般也不需要设置该面板,但是卷的作用还是非常大,比如上面提到的安装Rancher的命令,通过设置卷就能让容器里的数据固化到主机上(类似于ln软链接的原理),避免容器删除时,一些数据也随着容器一起消亡,比如mysql数据服务。我们将上面Rancher的安装命令涉及到卷的部分,放到面板上设置,就如下所示:
格式说明:冒号前面是主机上的目录,冒号后面是容器里的目录。
标准的Docker其实只有四种模式,桥接、容器、主机、无,而且桥接Bridge是默认模式,这里的桥接和虚拟机的桥接类似但不是一个概念,虚拟机的LinuxBridge相当于是一个虚拟交换机,但Docker Bridge要复杂的多,同时具备有 veth pair,有网络命名空间, 还有 NAT的特性。而Rancher下却有五种网络模式,多了一个托管模式(Managed),而且还是默认模式,Managed网络是通过IPsec来建立起安全隧道来保障各service之间可达性的。相比于其他一些VPN技术,IPSec最大的优势在于其安全性;这种安全除了指业务数据加密传输外,还包括了一套秘钥交换的安全机制,这是诸如VXLAN之类的其他L3 VPN技术无法匹敌的。带来了安全,但却牺牲了网络性能,Managed网络表现出来的性能损耗较严重(当然这也与运行Rancher的主机配置有关),性能关系基本上按以下关系,大家可以权衡一下用不同的网络模式:
Host模式(安全性差) > Bridge模式(安全适中) > Managed模式(安全最高)
介绍一下五种网络模式(桥接、容器、主机、托管(默认模式)、无):
(1)[桥接Bridge]表示容器与主机是桥接关系(docker0网桥相当于是新路由器)
(2)[容器Container]表示与另一个容器共用一个虚拟网络
(3)[主机Host]表示让容器与主机共用一个网络(在容器里用ifconfig命令看到的结果与主机上一模一样,这种方式等于容器的隔离性没了,相当于成了宿主机上的一个进程服务)
(4)[托管Managed]表示容器与主机按照默认的网桥模式连接(相当于虚拟机的NAT模式,docker0网桥相当于是路由器)
(5)[无None]表示容器没有网卡设备,需要通过别的手段配置网卡(基本上没用到)
我们通常就只要用托管(Managed)模式或桥接(Bridge)模式,对于集群化环境或是对网络性能要求高一点的,建议采用桥接(Bridge)模式。比如想要频繁操作容器,用了桥接模式,CLI连接或命令行连接相对要稳定。
通过添加容器面板配置网络模式的选项如下所示:
另外我们通过ifconfig可以看出托管(Managed)模式下,容器的IP随机完全没有规律:
而桥接(Bridge)模式下,容器的IP网址生成比较有规律性(基本是0.2、0.3递增)
这一项基本上不用配置,除非你想对容器限制内存或CPU(默认不限制,就是完全共享主机的系统资源)、或者需要挂接外部设备,另外就是日志驱动的配置:
我们在使用Docker处理日志的时候多数是采用Dockerlogs 命令,因为docker默认采用的log-driver是json-file,所以Docker会捕捉每一个容器进程STDOUTS和STDERR,保存在磁盘文件.json.log中供Dockerlogs命令查询。日常调试按默认基本上够用,但是如果是要大规模集群化部署,还是需要有专业的日志系统,比如syslog + rsyslog + ELK(ElasticSearch、Logstash、Kibana)方案,可以通过Rancher的应用商店去部署日志集成系统,具体可以去网上找相关解决方案。
对于安全这块,有时候需要配置[主机完全访问权限],对应的docker run容器指令为--privileged=true,相当于是给容器扩权,配置项如下:
具体作用不明,密文将以指定的文件名映射到容器内的/run/secrets/的目录下。而且密文需要事先定义好才能在该配置模板选择设定。具体在【基础架构à密文à添加密文】。
对于健康检查,一般不用配置,由Rancher平台负责健康检查,如果需要对外提供容器健康检查的接口,就需要配置,包括TCP接口和HTTP接口两种方式,在下一节的添加和管理应用中,也可以通过添加外部服务来进行调取。
标签面板中,能添加容器的标签,通过添加标签(支持多个)来方便识别容器,基本上可以不用,但是如果是要构建负载均衡服务(在应用管理界面中添加),可以通过添加选择器规则,然后容器标签就能作为规则条件来识别具体要负责均衡的目标容器。
Rancher比较智能的一点,就是主机的智能调度,比如你要添加一个容器,Rancher会根据各个主机的空闲程度,自动分配一台机器来部署新的容器。
如果是在指定主机下,点击添加容器,那么默认调度的是本机。如果是要更改,可以通过选择在指定主机上运行,来设定不同的主机安装容器。
还有个功能是添加调度规则,这个在集群化部署中比较有用,就是在自动选择符合调度规则的主机时,我们可设定个规则,让它必须按我们的规则选择主机。比如按标签规则:
从这里也看出添加主机时,配置标签(Label)是多么重要,我们很多时候可能真需要通过标签来识别不同的主机,特别是在批量添加容器或应用时。
配置上以上这些配置项后,就可以点击【创建】来完成容器的创建了。
通过容器详细界面,可以看到容器的实时CPU、内存、网络、存储IO指标,可以看到容器的所属主机、容器IP、Docker ID、镜像、映射的端口、卷信息、网络模式、调度信息等等。
容器的管理的其实只有重启、停止、删除、编辑外部映射端口这几项有用,其他都没什么用,因为容器一旦创建,其生命周期就延续到消化删除,很少在使用过程中还需要做调整和更改的(注意:主机面板上的停止、删除容器操作其本上是针对独立容器,应用容器建议在应用面板上管理操作)。另一个最大的作业是执行命令行:
执行命令行,相当于是以界面的形式登录到容器内部环境,这个比较好用,相当于可以连接到容器内部,执行一些 Linux命令,进行一些常规操作,比如容器应用的修改配置文件。修改完还是需要重启容器才能生效(这一点比直接通过命令的方式操作要方便),但是涉及到容器与宿主机之间的文件对拷,还是需要通过Linux命令来完成,因为在容器中没有安装SSH并开放22端口的情况下,是无法直接连接容器上传文件的,常用交互命令:
# 往容器中拷贝文件:
docker cp /home/testfile 容器ID:/home/
# 将容器中文件拷出:
docker cp 容器ID:/home/testfile /home/
# 在容器中安装新的程序
docker run image_name apt-get install -y app_name
以[执行命令行]的方式进入容器的效果图如下:
对于网桥(Bridge)模式创建的容器,可以很方便的通过[执行命令行]进行入,而对于以托管(Managed)模式创建的容器,进入该窗口会不太稳定,会受Rancher自身网络的影响。
通过应用的方式部署和管理容器,是一种正确的思维,对于容器化来说,我们必须把应用程序进行拆解,降低维护管理的耦合性,而容器正是适应这种管理的最佳思维方式。就拿Rancher管理平台来说,就是一个完整的应用,包括Rancher-Server、Rancher-Agent、healthcheck、ipsec等服务,而每个服务对应的是一个容器或多个容器(比如一个mysql服务是一个容器,添加成4个容器,就变成了一个包含4个节点的mysql服务),那么这些容器服务组合在一起才能提供完整的应用服务。所以服务是我们对外提供访问的窗口,而应用是对外提供完整服务的集合,容器只是满足耦合性和轻量化部署管理的最小单元。
同样一个集群也可以包括多个应用,一个应用包含多个服务或容器,比如Jmeter工具构建的一个集群,包括Jmeter-Master、Jmeter-Slaves、grafana监控三大应用,而其中Jmeter-Slaves应用包含10个节点(即10个容器)、grafana监控包含grafana和influxdb容器,而一个集群也可以作为一个完整的应用对外服务。
所以我们提倡通过应用的方式来组织管理容器化集群,避免单个容器的管理过于零散和不可控(应用管理下的容器就算在主机中被停也会再次下发重建命令,所以我们要权衡好,毕竟独立容器不受制管理平台的启停,虽然弱管理但灵活性也更强)。
Rancher的应用包含两类,用户应用和基础应用,其中基础应用属于Rancher平台自带的我们不可动,用户应用才是我们要维护和管理的。
对于应用的管理界面,可以看到有添加应用(自定义应用)和从应用商店添加两个按钮,我们一般只用添加自定义应用,而应用商店里的应用类似于手机上的APP商店,都是一些成熟的应用,比如Hadoop+Yarn,一键安装部署你想要的集群环境。
在这里只介绍添加自定义应用:应用à用户à添加应用,包括手动添加服务和compose配置添加两种方式。
(1)手动添加服务
采用手动添加服务,只需要输入应用名,直接创建,然后在应用上点击【添加服务】按钮,默认添加的是普通服务(即容器)、另外还能选择添加负载均衡、服务别名、外部服务。
添加负载均衡:这个比较有用,通过配置一个对外的HTTP(支持多种协议)及端口,并选择一个服务(容器),或者通过选择器规则找到具体的服务(容器);具体的负载均衡配置可以参照:
https://blog.csdn.net/csdn_duomaomao/article/details/76216046
添加服务别名:这个不知道具体的用处,其实就相当于是添加了单个或多个服务的链接。
添加外部服务:就是将外部或第三方服务的接口封装成一个服务,如第四节第7小节提到的健康检查服务。
普通服务:普通服务就是跟上一节添加容器一样的,在这里就不细说了,但是这里可以实现添加一个容器和批量添加容器的功能(相当于拷贝复制同样的容器到不同的主机上,但这些容器都属于同一个服务下),另外还可以通过添加从容器的方式,来实现自己需要的容器拷贝复制方式(这里的主从容器也是在一个服务下的)。
在应用管理界面,手动点击一个服务,可以打开服务详情界面,这个界面可以看到该服务下所关联的容器,可以快捷管理和操作容器,另外还能快捷的添加容器:
说明:以上在一个服务下添加多个容器的方法,需要注意的是如果创建的规则是在同一个主机上添加容器,容易出现端口冲突及其他冲突性问题。
(2)Compose方式添加服务
这是我们比较提倡的一种添加服务(容器)的方式,我们可以选择手动编辑Compose文件,导入后就能自动创建一个应用或集群,也可以将当前的应用导出配置:
这个导出的配置是个compose.zip包,就相当是个备份,里面包含docker-compose.yml文件和rancher-compose.yml文件,下次重建应用的时候直接导入就行。
关于docker-compose如何配置是个技术活,格式有一点错误创建应用时就会报错,具体可以上网找相关教程。
也只有通过compose文件部署应用和服务,我们才可以真正实现集群的一键安装部署,虽然部署容器只有几秒种的事情,但如果是部署几十上百节点的应用集群(云计数环境下这都不算什么),一个个拉取镜像和创建容器也会让人崩溃的。
关于Docker的Compose认识及使用,参照网上文章:
https://www.cnblogs.com/52fhy/p/5991344.html
在应用界面我们可以看已添加的应用,可以在此基础上,继续添加应用下的服务,也可以进行应用的增删改阅操作。
(1)添加服务
我们可以在现有应用的基础上继续添加服务,操作见上面的手动添加服务。
(2)停止服务
这里的停止服务,可以停掉应用下的所有服务和容器,相当于批量停止容器,这就体现出管理工具的优势了,重启时也是一键重启。
(3)查看图形
这个功能在负载均衡下挺有用,一眼就能看出集群的拓扑图。
(4)查看配置
就是查看该应用的Compose配置,其实看多了各个应用的Compose配置,慢慢我们也会掌握编辑属于自己的Compose文件。
(5)导出配置
上面也提到了,可以将当前应用的Compose配置导出,作为备份,下回重建应用时,直接导入就能一键创建应用集群服务。
(6)删除
删除应用就能批量删除应用下的服务和容器。这也是最方便的地位。
(7)API查看和编辑:这两功能没什么用,基本是摆设。
未完待续......