docker微服务部署之:五、利用DockerMaven插件自动构建镜像
一、 什么是RancherRancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
Rancher官网:https://rancher.com
二、Docker中下载Rancher镜像并运行#Rancher镜像下载$ sudo docker pull rancher/server$ sudo docker images | grep rancher/serverrancher/serverlatest aff17b0067db1 second ago 1.09GB#Rancher安装docker run -d --name=rancher -p 8080:8080 rancher/server在浏览器中输入:http://192.168.31.181:8080,如果能打开欢迎页,表示安装成功。(提示:rancher的启动会有点慢,可能需要等一会儿)
全是英文,看不懂?没关系,可以点击右下键的English,选择语言为简体中文。
三、Rancher环境管理Rancher的作用就是用来管理Docker容器的环境。可以通过Rancher的环境管理,来管理不同团队的Docker环境。每套Ranhcer环境之间,都是隔离的,相互之间没有影响。
3.1. 添加环境点击顶部导航栏的Default,点击环境管理
进入了环境管理界面,点击添加环境
打开了添加环境界面,输入相应名称和描述,并选择环境模板,最后点击创建,完成环境的添加。
在环境列表界面,可以看到已经创建好了一个名为test的环境,并且该环境已经完成了启动。
3.2.在环境中,管理docker中的微服务
首先切换到刚创建的test环境。点击顶部导航栏的Default,点击test
打开了test中的用户应用管理界面
四、配置主机
切换到了test环境,那个该环境,rancher需要管理哪台主机docker中的微服务呢?这就是这一步需要做的事情。
点击顶部导航栏中的基础架构,点击主机
进入了主机列表界面,点击添加主机
进入添加主机界面,(如果是新安装的rancher,没有进行过配置,可能会出现类似如下界面,看看当前站点地址是否为需要被管理的docker的主机的ip地址,如果是,直接点击下面的保存即可。)
进入了添加主机界面,在4处输入需要管理的docker的主机IP地址,然后点击5处的复制按钮,把复制之后的代码脚本,在填入的主机中执行,执行完成之后,点击关闭按钮,完成主机的添加操作。
复制的代码脚本是干嘛的呢?其实就是在docker主机中,安装rancher的代理,以便让rancher可以管理docker。
附上执行上面复制的代码脚本过程
$ sudo docker run -e CATTLE_AGENT_IP="192.168.31.181" --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.11 http://192.168.31.181:8080/v1/scripts/41FD60E2D772FF772A69:1546214400000:Z2mxv2DC4Id5S34xJIgZaokUpoYINFO: Running Agent Registration Process, CATTLE_URL=http://192.168.31.181:8080/v1INFO: Attempting to connect to: http://192.168.31.181:8080/v1INFO: http://192.168.31.181:8080/v1 is accessibleINFO: Configured Host Registration URL info: CATTLE_URL=http://192.168.31.181:8080/v1 ENV_URL=http://192.168.31.181:8080/v1INFO: Inspecting host capabilitiesINFO: Boot2Docker: falseINFO: Host writable: trueINFO: Token: xxxxxxxxINFO: Running registrationINFO: Printing EnvironmentINFO: ENV: CATTLE_ACCESS_KEY=A2ED98628633A662C191INFO: ENV: CATTLE_AGENT_IP=192.168.31.181INFO: ENV: CATTLE_HOME=/var/lib/cattleINFO: ENV: CATTLE_REGISTRATION_ACCESS_KEY=registrationTokenINFO: ENV: CATTLE_REGISTRATION_SECRET_KEY=xxxxxxxINFO: ENV: CATTLE_SECRET_KEY=xxxxxxxINFO: ENV: CATTLE_URL=http://192.168.31.181:8080/v1INFO: ENV: DETECTED_CATTLE_AGENT_IP=172.17.0.1INFO: ENV: RANCHER_AGENT_IMAGE=rancher/agent:v1.2.11INFO: Launched Rancher Agent: fea792c5f8413fece7c635f4feaf7127f62911cfb1ef44b38fe0aa5323aba473[root@localhost ~]# docker imagesREPOSITORYTAG IMAGE IDCREATED SIZEzuul latest ffed513f718832 hours ago642MBarticlelatest b80e1550a5ce32 hours ago651MBeurekalatest 9b410097b49e34 hours ago645MBjdk1.8latest 1f2578d93bd02 days ago 598MBcentoscentos7 9f38484d220f7 days ago 202MBcentos/mysql-57-centos7latest ee80146ff5125 weeks ago 453MBrancher/serverlatest aff17b0067db7 weeks ago 1.09GBrancher/scheduler v0.8.6 fbedeaddc3e98 weeks ago 248MBrancher/agent v1.2.11 1cc7591af4f57 months ago243MBrancher/netv0.13.17f170c38e37638 months ago311MBrancher/dnsv0.17.4 678bde0de4d28 months ago249MBrancher/healthcheckv0.3.8 ce78cf69cc0b8 months ago391MBrancher/metadata v0.10.4 02104eb6e2708 months ago251MBrancher/network-managerv0.7.22 13381626c5108 months ago256MBrancher/netholder 665d9f6e8cc123 months ago267MB点击关闭之后,可能需要等待一点点时间,就可以看到在主机列表界面,看到连上了我们刚添加的192.168.31.181主机。
可以看到主机已经出去可用状态(ACTIVE),并且可以看到主机的一些信息,如操作系统,ip地址,内存一级硬盘等等,还有容器中的服务,以及这些服务的状态。
五、往Docker主机中添加应用上面已经做了这么多,那么如何把自己的服务部署到docker中。
服务都是放在应用中,所以需要先创建一个应用。
创建应用的步骤如下:
首先,点击顶部导航栏中的应用,点击全部
打开应用列表管理界面,可以看到有4个应用,就是刚刚执行复制的代码脚本,在docker中运行了这4个应用。并且该4个应用最前面的图标都是绿色的,表示处于运行状态。
点击添加应用,给应用取个名字,并添加描述,然后点击创建,完成应用的添加操作
进入microservice服务管理界面
六、添加服务把自己的微服务都部署到相应的应用中,便于管理。下面演示如何添加服务到应用中。
=================================================================
提示:
由于下面要演示添加docker微服务部署前面的章节中的eureka、article、zuul服务,如果是按照前面章节一章一章操作的同学,可能现在docker中已经有正在运行的eureka、article和zuul服务。为了和下面要演示的内容有冲突,故需要把这三个服务停止掉,并删除,只保留镜像。 删除的步骤为:
先通过docker ps -a查看容器中的所有服务,在NAMES下查看是否有eureka等服务,STATUS为该服务对应的状态(UP为正在运行,Exited为已经停止)通过docker stop xx(xx为上一步中NAMES中的名称),停止正在运行的服务。最后通过docker rm xx(xx为第1步中NAMES的名称),删除服务。=================================================================
6.1 添加eureka服务添加第一个服务:eureka服务。
在上面的最后一个界面,也就是microservice应用的服务列表管理界面,点击添加服务,打开服务编辑界面
配置详解:
名称、描述,都是rancher中标识用的。
选择镜像输入eureka,因为名为eureka的镜像,已经在镜像本地仓库(docker images中可以查看到),所以取消创建前总是拉去镜像的勾选。
点击添加映射端口,第一个7000位主机公开端口,第二个7000位私有容器端口。
最后滚动到页面最下面,点击创建,完成eureka服务的创建。
回到microservice应用的服务列表管理界面,可以看到eureka已经启动。可点击最右边竖着的...,然后进行升级镜像,重启、停止、删除服务操作等。
可在浏览器中访问http://192.168.31.181:7000/访问eureka服务
6.2 添加aritcle服务
在microservice应用的服务列表管理界面,点击添加服务,打开服务编辑界面
配置详解:
名称、描述,都是rancher中标识用的。
选择镜像输入article,因为名为article的镜像,已经在镜像本地仓库(docker images中可以查看到),所以取消创建前总是拉去镜像的勾选。
点击添加映射端口,第一个9001位主机公开端口,第二个9001位私有容器端口。
最后滚动到页面最下面,点击创建,完成article服务的创建。
回到microservice应用的服务列表管理界面,可以看到article已经启动。(因为article中需要访问mysql,如果mysql服务没有部署,或者mysql中没有相应的数据库等,出启动报错,然后一直循环启动,如下图所示)
可点击服务名article,进入article服务详情页面,点击article的容器标签,在article的状态为Running状态下,点击右边竖着的...,然后点击查看日志,如图:
如果此时,你把上面的错误:“Communications link failure”和“The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server”,拿去百度一下,发现都是一堆让你修改Mysql的连接时间之类的,这些答案简直就是瞎扯。
原因很简单,就是因为mysql服务没有启动。(以上是为了演示当添加服务启动失败时,如何查看日志)。
$ sudo docker ps -aCONTAINER IDIMAGE COMMAND CREATED STATUSPORTSNAMES...652a36962b86centos/mysql-57-centos7"container-entrypoin…"3 days ago Exited (0) 31 hours agomysql...# 可以看到myql的STATUS为Exited(0)表示没有启动,下面启动mysql$ sudo docker start mysqlmysql此时再来microservice应用的服务列表管理界面,可以看到article已经启动成功了。
看看eureka管理界面中,article服务是否已经注册上来
也可通过浏览器访问article服务
6.3 添加zuul服务
在microservice应用的服务列表管理界面,点击添加服务,打开服务编辑界面
配置详解:
名称、描述,都是rancher中标识用的。
选择镜像输入zuul,应为名为zuul的镜像,已经在镜像本地仓库(docker images中可以查看到),所以取消创建前总是拉去镜像的勾选。
点击添加映射端口,第一个9001位主机公开端口,第二个9001位私有容器端口。
最后滚动到页面最下面,点击创建,完成zuul服务的创建。
回到microservice应用的服务列表管理界面,可以看到zuul已经启动。
看看eureka管理界面中,zuul服务是否已经注册上来
也可通过zuul的网关代理,来访问article服务
6.4 添加mysql服务(可选步骤,但推荐观看,学习下rancher中,添加服务时,如何配置环境变量,以及在容器中执行命令行)
上面我们已经把eureka、article、zuul三个服务,都移植到了通过rancher来管理。唯独剩下一个mysql服务,然后也在被rancher管理,但是没有放到rancher的某个应用中,如果是多数据源系统,则不同的应用需要不同的数据库。
刚说了mysql也被rancher管理,怎么没看到呢?其实就是在主机里,下面的独立容器中,可以看到mysql服务,该mysql服务,和应用中的服务是一样的,都可方便的进行操作,和查看日志等等。
那么如何把mysql也放到应用中呢?(目的是为了演示如何在添加服务时,配置环境变量)
可以看到mysql当前处于启动状态,首先我们需要把该mysql服务停止并删除掉。注意:删除mysql之前,记得把mysql中的数据先导出来,备份一下(可使用Navicat工具,连接数据库,导出结构和数据)。
可通过点击上图中mysql后面竖着的三点来选择停止和删除,也可通过如下命令进行停止和删除。
$ sudo docker stop mysql$ sudo docker rm mysql
然后点击顶部导航栏中的应用,选择全部,回到全部应用列表管理界面
可点击添加服务,(和点击microservice进入microservice应用的服务列表管理界面,再点击添加服务,效果是一样的)
进入添加服务界面
配置详解:
名称、描述,都是rancher中标识用的。
选择镜像输入centos/mysql-57-centos7,因为我pull下来的不是名为mysql的镜像,而是pull的一个名为centos/mysql-57-centos7的mysql镜像。而且该centos/mysql-57-centos7的镜像,已经在镜像本地仓库(docker images中可以查看到),所以取消创建前总是拉去镜像的勾选。
点击添加映射端口,第一个3306位主机公开端口,第二个3306位私有容器端口。
在命令标签页,环境变量处,点击添加环境变量,把MYSQL_ROOT_PASSWORD=123456粘贴进去。
最后点击创建,完成mysql服务的创建。
回到microservice应用的服务列表管理界面,可以看到mysql已经启动。
如果我们此时再访问article服务,会发现访问不了,出现500错误。
我们点击article进入article服务,查看article运行日志,可以看到原来是无法连接docker数据库
通过Naticat软件,是可以连接到该mysql服务的,但是该数据库里,却没了我们的数据库docker,以及相关的表和数据(这也就是为什么让大家在删除前先备份的原因)。
我们通过Naticat新建一个数据库docker,字符集为utf8,排序规则为utf8_general_ci,创建好数据库之后。在数据库docker下,在表上右键,选择运行SQL文件,在打开的窗口中,选择前面备份的docker.sql文件,然后点击开始即可。推荐使用这种外部工具导入的方式,回复数据库中数据。
除上诉方式外,也可通过点击mysql服务,选择容器标签,然后点击后面竖着的三点,点击执行命令行(该中方式会有问题,具体什么问题,接着往下看)
然后在打开的黑乎乎的命令行界面,执行如下命令:
mysql -u root -p#在出现Enter password:时,按回车,连接mysql数据库,进入mysql>命令行模式#查看当前所有数据库,发现并没有一个名为docker的数据库show databases;#创建docker数据库,指定字符集和排序规则create database docker default character set utf8 collate utf8_general_ci;#选择docker数据库use docker;#创建tb_article表CREATE TABLE `tb_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `content` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, `author` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `add_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE = MyISAM AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;#插入数据INSERT INTO `tb_article` VALUES (1, 'docker', '部署微服务', 'tom', '2019-03-20 08:00:00');
界面如下图所示:
注意:该命令行模式,不支持中文输入,所以,上面的insert语句中的content字段的内容“部署微服务”,被自动替换为空。以上演示,主要是告诉大家如何在rancher中使用命令行,以及需要注意的地方。
到此,docker数据库已经创建好了,并有了相应数据,此时,我们再来刷新article服务看看:
好了,到此,把手动创建服务,改造成在rancher中创建服务,已经完成。
docker微服务部署之:七、Rancher进行微服务扩容和缩容