工做多年,在项目部署方面,php
1:之前用ftp或者rz上传更新的,每次更新算上打包、目录切换、更新遗漏、备份、出错还原、启动等工做都得搞上一来小时甚至更长,要是多两台服务器那心都凉了;java
2:后来有用svn或者git的,服务器上拉取的是编译后的包或目录;python
3:再到如今用jenkins实施自动化构建部署的,配置好jenkins的流水线以后,之后每次代码提交后只须要点击一个按钮便可;linux
方式3我的感受已经很不错了,很方便,还有jenkins+docker的方式等等,这里不作对比,记录目前使用的部署方式:Dockerfile
git
一、准备alpine镜像,制做带jdk、mvn环境 以及项目lib包,mvn本地仓库依赖、系统插件等,制做出基础镜像github
二、使用阿里云容器镜像服务,上传基础镜像,设置构建规则redis
三、项目代码中加入Dockerfile,逻辑是复制源码到基础镜像生成的容器,执行mvn编译打包,移动项目启动包到指定路径,此处可以使用多阶段构建减小镜像体积,最后设置容器启动的脚本spring
//安装docker yum -y install docker-io //启动 service docker start //设置开机启动 chkconfig docker on
{
"registry-mirrors": [""]
}docker登陆阿里云 容器镜像服务->镜像加速器-->加速器地址json
文件地址 /etc/docker/daemon.json
重启服务便可
一、隔离性,安全性(无需担忧外界对容器系统的影响,固然也有比较特殊的状况,后面会说到)
那么隔离性的优点在实际项目中体如今哪里呢?
:在分布式环境中,一个服务器中可能存在多个相同的服务(端口相同),或者多个不一样环境的服务(好比jdk7,jdk8,php,python等)存在于同一个服务器中,隔离性使他们之间不会出现冲突!
:由于隔离,因此单个容器的崩溃不会影响其余服务的运行,每一个容器可分配合适的系统资源(包括CPU、内存和磁盘空间)
二、移植性
windows、linux都能跑,其余的环境还没用到就不列出来了
三、版本控制和持续集成
结合其余插件,能够轻松作好整一个项目部署流程,包括编译、打包、更新发布、回滚等等
四、成本低
正式由于上述的好处以及docker在资源分配上的优点,使用docker成本低,效果好
一、镜像的大小问题:像springboot这种项目的运行须要基于jdk环境的linux或者windows系统,那么这个基础镜像的大小就是一个大问题了
linux系统咱们使用alpine,带jdk环境的我使用dockerhub上面处理好的 https://hub.docker.com/r/anapsix/alpine-java ,也能够本身根据官网镜像加工处理
二、编译打包的问题:我直接在制做镜像的时候给系统安装maven,使用mvn完成编译打包
三、最后最关键的是管理工具的问题:优秀的管理工具能减小咱们90%的工做量,我使用Rancher,默认自带cattle,固然还有其余编排工具 可以使用k8s
docker pull portainer/portainer //启动 docker run -d -p 9000:9000 --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
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/
一、若是Dockerfile中RUN mvn编译项目出现如下错误:
unmappable character (0xE4) for encoding US-ASCII
解决办法:
在Dockerfile中加上
ENV LANG en_US.utf8
二、Dockerfile 作的镜像带CMD启动脚本的状况 一启动就关闭
CMD执行脚本 本质上是用了 /bin/sh -c,由于这是容器的主进程,因此当脚本执行完以后容器就会退出。那么能够在脚本的最后加上tail -f /dev/null
三、Alpine安装配置jdk没法成功
网友表示Alpine缺乏glibc,我没有去深刻研究,而是直接用dockerhub上面已经处理好的镜像,后来在处理其它容器环境的时候也遇到这个问题
#alpine 安装gcc apk add --no-cache gcc g++ #其余经常使用库 apk add jpeg-dev zlib-dev
四、镜像体积优化
使用多阶段构建方法
五、注意看Rancher的文档
好比网络模式注意要选择“托管” 才能使用到大部分的功能,标签的合理使用,负载均衡的扩展数量限制问题,默认网段10.42.0.0/16 等等
六、容器之间通讯失败
看 healthcheck那几个系统服务是否有正常运行,通常正常的话就不会有问题。
另外有几点要注意:
阿里云文档表示同一个安全组内网互通;
同一安全组内网、不一样主机之间的访问,rancher负载均衡的端口不须要在防火墙上打开,而宿主机上的应用(好比redis)却须要在防火墙上打开;
七、这是一个神坑,当防火墙改动后,容器与容器之间、宿主机与容器之间没法通讯(正式环境千万别在白天使用期间尝试),不知道是Rancher的问题仍是docker的问题(后面还发现有台服务器中了挖矿病毒,,)
解决办法:重启docker服务,反正有一些奇怪的错误出现时能够试试重启docker服务,另外检查下是否是主机的问题!
八、屡次测试感受,在rancher的负载均衡下,配置高的主机优先级会很高,重启低配置主机的时候系统几乎感受不到卡顿,反过来就不同了
九、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/