微服务部署要完成下面4个步骤
(1)Dockerfile脚本完成镜像的构建
(2)完成Docker私有仓库的构建,能够运用Maven插件完成镜像的创建与上传
(3)能够完成Gogs 的安装与配置,完成代码的提交
(4)使用Jenkins完成代码的持续集成
网站架构演变过程:
传统架构—>分布式架构—>SOA架构—>微服务架构
传统架构:传统的SSH架构,分为三层架构 web控制层、业务逻辑层、数据库访问层,单点应用。
分布式架构:基于传统架构演变过来,将传统的单体项目以项目模块进行拆分。
SOA架构:面向与服务架构,也就是面向与业务逻辑层开发,将共同的业务逻辑抽取出来形成一个服务,服务与服务之间调用使用rpc远程技术。特点:使用XML方式实现通讯,在高并发情况下XML比较冗余会带来极大的响,微服务架构中采用JSON替代xml方式;架构的底层实现通过WebService和ESB实现,WebService底层采用soap协议进行通讯,soap协议就是Http或者是Https通道传输XML数据实现的协议。
微服务架构:从SOA架构演变过来,比SOA架构粒度会更加精细,让专业的人去做专业的事情,每个服务于服务之间互不影响,每个服务必须独立部署,互不影响,适合敏捷开发。特点:有独立、可配置、可运行和可微服务的子服务;服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯;数据交换格用json格式通讯
1.什么是Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个
新的镜像
作用:
(1)对于开发人员:可以为开发团队提供一个完全一致的开发环境;
(2)对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新
的镜像开始工作;
(3)对于运维人员:在部署时,可以实现应用的无缝移植
2.Dockerfile常用命令
FROM image_name:tag : 定义了使用哪个基础镜像启动构建流程 (tag是版本)
MAINTAINER user_name : 声明镜像的创建者
ENV key value : 设置环境变量 (可以写多条)
RUN command : 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file
dest_dir/file : 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file
dest_dir/file : 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir : 设置工作目录
EXPOSE port1 prot2 :用来指定端口,使容器内的应用可以通过端口和外界交互
CMD argument :在构建容器时使用,会被docker run 后的argument覆盖
ENTRYPOINT
argument :和CMD相似,但是并不会被docker run指定的参数覆盖
VOLUME :将本地文件夹或者其他容器的文件挂载到容器中
3.使用脚本创建镜像(创建JDK8镜像为例)
(1)创建目录
mkdir –p /usr/local/dockerjdk8 (也可以进入/usr/local该目录手动创建文件夹然后把压缩包拖进去)
(2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中
的/usr/local/dockerjdk8目录
(3)创建文件Dockerfile vi Dockerfile
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中 (ADD是既复制又解压)
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH
$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
(4),进入装jdk那个目录,比如我的是 cd /usr/local/dockerjdk8/ 。执行命令构建镜像
docker build -t='jdk1.8' . (注意后边的空格和点,不要省略,点表示当前目录)
(5)在该目录下查看镜像是否建立完成
docker images
(6),先回到根目录cd / ,创建容器
docker run -di --name=XXX_jdk jdk1.8
4.Docker私有仓库搭建
(1)拉取私有仓库镜像(如果已有 此步省略)
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://192.168.226.129:5000/v2/_catalog看
到{“repositories”:[]} 表示私有仓库搭建成功并且内容为空(192.168.226.129为我自己的ip)
(4)修改daemon.json
vi /etc/docker/daemon.json
添加以下内容,保存退出,此步用于让 docker信任私有仓库地址
{"insecure-registries":["192.168.226.129:5000"]} (我自己的ip,以下雷同)
(5)重启docker 服务
systemctl restart docker
镜像上传至私有仓库
(6)标记此镜像为私有仓库的镜像
docker tag jdk1.8 192.168.226.129:5000/jdk1.8
(7)再次启动私服容器
docker start registry
(8)上传标记的镜像
docker push 192.168.226.129:5000/jdk1.8
完事了,访问http://192.168.226.129:5000/v2/_catalog。可以出现jdk1.8了
5.DockerMaven插件部署,一步到位
微服务部署有两种方法:
手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
通过Maven插件自动部署。
Maven插件部署步骤:
(1)修改宿主机的docker配置,让其可以远程访问
vi /lib/systemd/system/docker.service
其中ExecStart=后添加配置
‐H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
0.0.0.0代表任何机子都可以访问
(2)刷新配置,重启服务
systemctl daemon‐reload (刷新配置)
systemctl restart docker
docker start registry
(3)在XXX_eureka工程pom.xml 增加配置
<!-- 基本每个项目下边这个都一样。可以直接拿来用-->
<build>
<!--给工程起个名称-->
<finalName>app</finalName>
<plugins>
<!-- 这个是springboot的maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.226.129:5000/${project.artifactId}:${project.version}</imageName>
<baseImage>jdk1.8</baseImage>
<!--打一个jar包,名称就是上面起的app-->
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<!-- 这是docker打包成镜像的固定规则-->
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}
</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--之前步骤有配有0.0.0.0:2375。意思是任意IP都能访问-->
<dockerHost>http://192.168.226.129:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
以上配置会自动生成Dockerfile
FROM jdk1.8
ADD app.jar /
ENTRYPOINT ["java","‐jar","/app.jar"]
(4)在windows的命令提示符下,进入XXX_config工程所在的目录(也就是有本地配置文件的工程,其余上传gitee了),输入以下命令,进行打包和上传镜像(IDEA直接选编辑器底下Terminal,默认目是父工程,直接拖动子工程就可以进入子工程目录来输入命令)
mvn clean package docker:build -DpushImage
docker:build:直接打包成镜像
-DpushImage:把它传到仓库
(5)docker images查看可以看到该服务已经打包成镜像,其余服务类似操作
(6)然后可以做成容器了
docker run -di --name=XXX_config -p 端口号(每个服务的端口号可以看配置文件):端口号 REPOSITORY:TAG(这两个看docker images里边对应列值)
比如我的是:
docker run -di --name=XXX_config -p 12000:12000 192.168.226.129:5000/XXX_config:1.0-SNAPSHOT
截图:
(7)测试浏览器输入 http://192.168.226.129:12000/base-dev.yml 看有没有码云的配置文件数据出来,出来则说明成功
8.什么是持续集成(CI)
每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
特点:
它是一个自动化的周期性的集成测试过程,无需人工干预;需要有专门的集成服务器来执行集成构建;需要有代码托管工具支持,比如Git(比gitee好用)以及可视化界面Gogs。
作用:
保证团队开发人员提交代码的质量,减轻了软件发布时的压力;任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量。
Jenkins简介:
一个开源的实现持续集成的软件工具。Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。