Docker+Rancher构建部署流水线
工作多年,在项目部署方面,
1:以前用ftp或者rz上传更新的,每次更新算上打包、目录切换、更新遗漏、备份、出错还原、启动等工作都得搞上一来小时甚至更长,要是多两台服务器那心都凉了;
2:后来有用svn或者git的,服务器上拉取的是编译后的包或目录;
3:再到现在用jenkins实施自动化构建部署的,配置好jenkins的流水线之后,以后每次代码提交后只需要点击一个按钮即可;
方式3个人感觉已经很不错了,很方便,还有jenkins+docker的方式等等,这里不做对比,记录目前使用的部署方式:Dockerfile
流程介绍
1、准备alpine镜像,制作带jdk、mvn环境 以及项目lib包,mvn本地仓库依赖、系统插件等,制作出基础镜像
2、使用阿里云容器镜像服务,上传基础镜像,设置构建规则
3、项目代码中加入Dockerfile,逻辑是复制源码到基础镜像生成的容器,执行mvn编译打包,移动项目启动包到指定路径,此处可使用多阶段构建减少镜像体积,最后设置容器启动的脚本
准备工作
//安装docker
yum -y install docker-io //启动
service docker start //设置开机启动
chkconfig docker on
{
"registry-mirrors": [""]
}登录阿里云 容器镜像服务->镜像加速器-->加速器地址
文件地址 /etc/docker/daemon.json
重启服务即可
首先说一下docker部署项目的好处:
1、隔离性,安全性(无需担心外界对容器系统的影响,当然也有比较特殊的情况,后面会说到)
那么隔离性的优势在实际项目中体现在哪里呢?
:在分布式环境中,一个服务器中可能存在多个相同的服务(端口相同),或者多个不同环境的服务(比如jdk7,jdk8,php,python等)存在于同一个服务器中,隔离性使他们之间不会出现冲突!
:因为隔离,所以单个容器的崩溃不会影响其他服务的运行,每个容器可分配合适的系统资源(包括CPU、内存和磁盘空间)
2、移植性
windows、linux都能跑,其他的环境还没用到就不列出来了
3、版本控制和持续集成
结合其他插件,可以轻松做好整一个项目部署流程,包括编译、打包、更新发布、回滚等等
4、成本低
正式因为上述的好处以及docker在资源分配上的优势,使用docker成本低,效果好
那么使用docker要提前考虑那些或者是注意那些方面的事情呢:
1、镜像的大小问题:像springboot这种项目的运行需要基于jdk环境的linux或者windows系统,那么这个基础镜像的大小就是一个大问题了
linux系统我们使用alpine,带jdk环境的我使用dockerhub上面处理好的 https://hub.docker.com/r/anapsix/alpine-java ,也可以自己根据官网镜像加工处理
2、编译打包的问题:我直接在制作镜像的时候给系统安装maven,使用mvn完成编译打包
3、最后最关键的是管理工具的问题:优秀的管理工具能减少我们90%的工作量,我使用Rancher,默认自带cattle,当然还有其他编排工具 可使用k8s
这里介绍两个管理工具Portainer和Rancher,单机版小项目或者测试可以试一下前者,生产环境我用的是Rancher
Docker界面化管理Portainer(我这里是在Win10系统上的操作)
docker pull portainer/portainer //启动
docker run -d -p : --restart=always --name prtainer-test portainer/portainer
注意:在win10上安装的docker处于虚拟机的环境,所以需要选择remote的方式进行连接,首先打开2375端口

输入命令测试
Test-NetConnection -ComputerName localhost -Port 2375
测试通过

浏览器访问http://127.0.0.1:9000
创建用户后,选择remote环境,填写Endpoint URL docker.for.win.localhost:2375,

如下所示就是正常的

对容器或镜像的操注意别把portainer相关的删了

由于我在使用自建带密码的Registries时无法通过验证,只能放弃Portainer,Shipyard网上评价比较高,但是停止维护了,在作者的github的首页有推荐Rancher、dockerui和Portainer
那下面我就切换到Rancher
docker pull rancher/server docker run -d --restart=always -p 8089:8080 rancher/server
容器已启动,大概要等几十秒才能访问http://localhost:8089
第一步配置用户

然后改一下主机注册地址,不要用localhost或者127.0.0.1 改成内网ip,保存

接着添加主机


第4步 我填的是内网IP,目前生产环境用宿主机内网IP一切正常, (或许用公网IP能有其他用处,比如跨外网的容器连接,我还没试)
第5步按提示操作即可,


从阿里云拉取镜像,首先在镜像库配置账号信息,然后新建容器,注意“选择镜像”填的是阿里云镜像服务中“公网地址:镜像版本号”,如果是同地域的可以用专用网络或者经典网络地址
大项目用Rancher,功能非常强大,服务编排、升级、回滚、扩容、调度,如同神器
附上文档地址:https://rancher.com/docs/rancher/v1.6/zh/
我遇到需要注意的问题
1、如果Dockerfile中RUN mvn编译项目出现以下错误:
unmappable character (0xE4) for encoding US-ASCII
解决办法:
在Dockerfile中加上
ENV LANG en_US.utf8
2、Dockerfile 做的镜像带CMD启动脚本的情况 一启动就关闭
CMD执行脚本 本质上是用了 /bin/sh -c,因为这是容器的主进程,所以当脚本执行完之后容器就会退出。那么可以在脚本的最后加上tail -f /dev/null
3、Alpine安装配置jdk无法成功
网友表示Alpine缺少glibc,我没有去深入研究,而是直接用dockerhub上面已经处理好的镜像,后来在处理其它容器环境的时候也遇到这个问题
#alpine 安装gcc
apk add --no-cache gcc g++
#其他常用库
apk add jpeg-dev zlib-dev
4、镜像体积优化
使用多阶段构建方法
5、注意看Rancher的文档
比如网络模式注意要选择“托管” 才能使用到大部分的功能,标签的合理使用,负载均衡的扩展数量限制问题,默认网段10.42.0.0/16 等等
6、容器之间通信失败
看 healthcheck那几个系统服务是否有正常运行,一般正常的话就不会有问题。
另外有几点要注意:
阿里云文档表示同一个安全组内网互通;
同一安全组内网、不同主机之间的访问,rancher负载均衡的端口不需要在防火墙上打开,而宿主机上的应用(比如redis)却需要在防火墙上打开;
7、这是一个神坑,当防火墙改动后,容器与容器之间、宿主机与容器之间无法通信(正式环境千万别在白天使用期间尝试),不知道是Rancher的问题还是docker的问题(后面还发现有台服务器中了挖矿病毒,,)
解决办法:重启docker服务,反正有一些奇怪的错误出现时可以试试重启docker服务,另外检查下是不是主机的问题!
8、多次测试感觉,在rancher的负载均衡下,配置高的主机优先级会很高,重启低配置主机的时候系统几乎感觉不到卡顿,反过来就不一样了
9、rancher代理冲突问题:如果你用包含rancher代理的镜像安装到另一台主机上,那么原本的主机 '执行命令行' 会一直在 '连接中' 的状态,需要重新走代理注册的命令
最后再记录一下测试通信问题的命令
//alpine安装telnet
//加速
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
//安装
apk add busybox-extras telnet xxx
//什么都没显示一般都是通的 apk add curl //查看外网IP
curl ipinfo.io/ip
转载请注明博客出处:http://www.cnblogs.com/cjh-notes/
Docker+Rancher构建部署流水线的更多相关文章
- openshift 持续集成与部署 -- 构建部署流水线
Jenkins持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.j跟svn.git能无缝集成,也支持直接与知名源代码托管网站,比如github.bitbucket ...
- docker微服务部署之:七、Rancher进行微服务扩容和缩容
docker微服务部署之:六.Rancher管理部署微服务 Rancher有两个特色用起来很方便,那就是扩容和缩容. 一.扩容前的准备工作 为了能直观的查看效果,需要修改下demo_article项目 ...
- docker微服务部署之:六、Rancher管理部署微服务
docker微服务部署之:五.利用DockerMaven插件自动构建镜像 一. 什么是Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源 ...
- docker微服务部署之:五、利用DockerMaven插件自动构建镜像
docker微服务部署之:四.安装docker.docker中安装mysql和jdk1.8.手动构建镜像.部署项目 在上一篇文章中,我们是手动构建镜像,即: 4.1.2.5.1.2.6.1.2中的将d ...
- 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了
部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...
- 使用Docker+Jenkins自动构建部署
环境 Windows 10 Docker Version 18.06.1-ce-win73 (19507) 运行jenkins 运行jenkins 容器 docker run -d --name ln ...
- docker微服务部署之:四、安装docker、docker中安装mysql和jdk1.8、手动构建镜像、部署项目
docker微服务部署之:三,搭建Zuul微服务项目 1.Centos7安装Docker 详见:Centos7安装Docker 2.Docker中安装jdk1.8 详见:使用Docker构建jdk1. ...
- Docker学习笔记_04 Rancher的部署安装(编排选用K8S)
原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...
- 使用Kubeflow构建机器学习流水线
在此前的文章中,我已经向你介绍了Kubeflow,这是一个为团队设置的机器学习平台,需要构建机器学习流水线. 在本文中,我们将了解如何采用现有的机器学习详细并将其变成Kubeflow的机器学习流水线, ...
随机推荐
- vue项目在IE浏览器和360兼容模式下页面不显示问题,亲测有效
解决方法:安装 "babel-polyfill" 1.命令:cnpm install --save-dev babel-polyfill 2.在入口main.js文件引入:impo ...
- 行级安全(Row
通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...
- debian设置limits.conf
最近已经把自己的游戏框架主要功能完成得差不多了,决定将自己的开发环境从debian7升级到debian9,不然太多第三方依赖都跟不上了.debian10刚出来,MongoDB还没适配,所以暂不考虑. ...
- Image Processing and Analysis_8_Edge Detection:Multiresolution edge detection techniques ——1995
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- Ajax返回数据却一直进入error(已经解决)
做asp.net项目 使用ajax $.ajax({ url: '../Music/Default2.aspx?Types=' + type + '&texts=' + text + '', ...
- nodejs建站+github page 建站问题总结
本文介绍 昨天吃晚饭的时候,在B站偶然看到一个关于搭建自己博客的视频,过程讲的很详细,于是就有了自己想尝试一下的冲动,所以,在晚上的时候,尝试了下,但是,过程并没有视频中说的那么顺利,看了网上很多帖子 ...
- java——OOM内存泄漏
资料: 一.什么是OOM OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个erro ...
- Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
一.摘要 本篇博文将介绍如何借助BeautifulReport和HTML模版,生成HTML测试报告的BeautifulReport 源码Clone地址为 https://github.com/Test ...
- Python&Selenium 数据驱动【unittest+ddt+json+HTMLTestRunner】
一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt模块使用json文件作为数据文件作为测试输入,最后借助著名的HTMLTestRunner.p ...
- marquee标签实现跑马灯效果--无缝滚动
今天在做微信端的大转盘抽奖时,想把所有用户的抽奖记录做成无缝滚动的效果,无奈我的js功底太差,一时想不出实现的方法,便百度各种相似效果.但无意中发现了一个html标签——<marquee> ...