什么是 Dockerfile

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植。

常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
命令 						作用
FROM image_name: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 						将本地文件夹或者其他容器的文件挂载到容器中

Dockerfile 构建 Eureka 镜像

在需要打包的微服务项目的pom里面引入springboot打包插件

<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

把需要部署的微服务,拖动到,idea的Terminal模块里边输入一下命令

1
mvn clear package

打包成功后会在该项目的taget文件夹中生成一个jar包 alt mvn打包成功 $\color{red}{注意:一定要先引入插件依赖,不然虽然构建成功,但是没把依赖也打包上去,会跑不起来}$
上传 jar 包到 linux
创建一个新目录

1
mkdir /usr/local/eureka

把 jar 包拷贝到/usr/local/eureka 目录下
在/usr/local/eureka 目录下创建 Dockerfile 文件

1
vi Dockerfile

内容如下:

1
2
3
FROM jdk1.8
ADD app.jar /app.jar EXPOSE 6868
ENTRYPOINT [“java”,”-jar”,”/app.jar”]

构建 eureka 镜像

1
docker build -t=’eureka’ .

$\color{red}{注意后面点要加上,代表当前目录下}$
镜像上传至私有仓库
先标记此镜像为私有仓库的镜像

1
docker tag eureka 192.168.184.133:5000/eureka

上传标记的镜像

1
docker push 192.168.184.133:5000/eureka

查看远程镜像

1
curl -X GET http://192.168.2.2:5000/v2/_catalog  |python -m json.tool

查看某个镜像的标签列表

1
curl -X GET http://192.168.2.2:5000/v2/eureka/tags/list |python -m json.tool

查看运行日志 ,在docker run之后运行

1
docker logs -f --tail=30 eureka

DockerMaven 插件自动发布 Eureka

微服务部署有两种方法:
手动部署:首先基于源码打包生成 jar 包(或 war 包),将 jar 包(或 war 包)上传至虚拟机并拷贝至 JDK 容器。
通过 Maven 插件自动部署。
对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。 Maven 插件自动部署步骤:
修改宿主机的 docker 配置,让其可以远程访问

1
vi /lib/systemd/system/docker.service

其中 ExecStart=后添加配置

1
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

修改后刷新重启

1
2
3
systemctl daemon-reload
systemctl restart docker
docker start registry

在xxx_eureka 工程 pom.xml 增加配置

<project>
<build>
        <finalName>app</finalName>
        <plugins>
            <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.2.2:5000/${project.artifactId}:${project.version}</imageName>
						<baseImage>ascdc/jdk8</baseImage>
                    <entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}
                            </directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <dockerHost>http://192.168.2.2:2375</dockerHost>
                </configuration>
            </plugin>
        </plugins>
    </build>
	</project>

以上配置会自动生成 Dockerfile

1
2
3
FROM jdk1.8
ADD app.jar /
ENTRYPOINT ["java","-jar","/app.jar"]

在 windows 的命令提示符下,进入 tensquare_eureka 工程所在的目录,输入以下命令,进行打包和上传镜像

1
mvn clean package docker:build -DpushImage

执行后,会有如下输出,代码正在上传
浏览器访问 http://192.168.2.2:5000/v2/_catalog ,输出
alt 代码上传 浏览器访问 http://192.168.2.2:5000/v2/_catalog ,输出

1
{"repositories":["tensquare_eureka"]}

进入宿主机 , 查看镜像

1
docker images

启动容器:

理解持续集成

什么是持续集成
持续集成 Continuous integration ,简称 CI
  随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发 的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile)在软件工 程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重 要。
  持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成 他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证, 包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。

持续集成的特点

  1. 它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
  2. 需要有专门的集成服务器来执行集成构建;
  3. 需要有代码托管工具支持

持续集成的作用

  1. 保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
  2. 持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;

什么是 Gogs

Gogs 是一款极易搭建的自助 Git 服务。
Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。使用 Go 语 言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包 括 Linux、Mac OS X、Windows 以及 ARM 平台。
地址:https://gitee.com/Unknown/gogs

Gogs 的安装与配置

下载镜像

1
docker pull gogs/gogs

创建容器

1
docker run -di --name=gogs -p 10022:22 -p 3000:3000 -v /var/gogsdata:/datagogs/gogs gogs/gogs

配置

假设我的 centos 虚拟机 IP 为 192.168.2.2 完成以下步骤
在地址栏输入 http://192.168.2.2:3000 会进入首次运行安装程序页面,我们可以选择一种数据库作为 gogs 数据的存储,最简单的是选择 SQLite3。如果对于规模较大的公司,可以选择 MySQL

  1. 设置好数据库信息,点击安装gogs
  2. 新建一个仓库
  3. 连接idea
    • 在本地安装 git(Windows 版本)
    • 在 IDEA 中选择菜单 : File – settings , 在窗口中选择 Version Control – Git
      alt idea配置git
  4. 将十次方代码提交到 Git
    • 选择菜单 VCS –> Enable Version Control Integration..
    • 选择 Git
    • 设置远程地址: 右键点击工程选择菜单 Git –> Repository –>Remotes… –>添加git的地址
    • 右键点击工程选择菜单 Git –> Add
    • 右键点击工程选择菜单 Git –> Commit Directory…
    • 右键点击工程选择菜单 Git –> Repository –> Push …

运行 Jenkins 实现持续集成

Jenkins 简介

  Jenkins,原名 Hudson,2011 年改为现在的名字,它 是一个开源的实现持续集成的软件工 具。官方网站: http://jenkins-ci.org/
  Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的 形式形象地展示项目构建的趋势和稳定性。
特点:

易安装:

仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;

易配置:

提供友好的 GUI 配置界面;
变更支持:Jenkins 能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;

支持永久链接:

用户是通过 web 来访问 Jenkins 的,而这些 web 页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;

集成 E-Mail/RSS/IM:

当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);

JUnit/TestNG 测试报告:

也就是用以图表等形式提供详细的测试报表功能;

支持分布式构建:

Jenkins 可以把集成构建等工作分发到多台计算机中完成;

文件指纹信息:

Jenkins 会保存哪次集成构建产生了哪些 jars 文件,哪一次集成构建使用了哪个版本的 jars 文件等构建记录;

支持第三方插件:

使得 Jenkins 变得越来越强大

Jenkins 安装

安装jdk

将 jdk-8u171-linux-x64.rpm 上传至服务器(虚拟机)
执行安装命令

1
rpm ‐ivh jdk‐8u171‐linux‐x64.rpm

Jenkins 安装与启动

下载 jenkins

1
wget https://pkg.jenkins.io/redhat/jenkins-2.83-1.1.noarch.rpm

安装 jenkins

1
rpm -ivh jenkins-2.83-1.1.noarch.rpm

配置 jenkins

1
vi /etc/sysconfig/jenkins

修改用户和端口

1
2
JENKINS_USER="root"
JENKINS_PORT="8888"

启动服务

1
systemctl start jenkins

访问链接 http://192.168.2.2:8888
从/var/lib/jenkins/secrets/initialAdminPassword 中获取初始密码串
alt JEKINS密码

安装插件

![alt getting started](/img/getting started.png)
![alt getting started1](/img/getting started1.png)

jenkins忘记账号和密码操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1.编辑vim  /var/lib/jenkins/config.xml

删除下述配置语句

<useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>false</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>

2.重新启动jenkins服务 service jenkins restart 

Shutting down Jenkins                                [  OK  ]
Starting Jenkins                                           [  OK  ]
略微等待,发现再次访问网址,可直接进入登录后的页面
3.设置新密码

进入登录jenkins后的页面后,在左侧导航栏点击---系统管理---全局安全配置

勾选--启用安全

访问控制里,安全域勾选Jenkins专有用户数据库

授权策略里,选择登录用户可以做任何事

然后点击--保存

注意!!!!!!!!!点击保存后不要直接刷新页面,不然你还是不知道密码是什么

保存完成后,点击左上角---Jenkins---

回到初始界面,点击--系统管理--用户管理--

既可看到用户列表,点击列表中用户右侧的齿轮设置按钮,就可以设置新的密码了

完成后,保存  重新访问网址,就可以刚刚设置的用户及用户密码进行登录了

jenkins需要安装maven插件与git插件
  配置maven仓库指定setting配置文件
Linux需要下载maven以及mave仓库和git
  执行此步是为了以后在打包的时候不必重新下载,缩短打包的时间。

全局工具配置

指定jdk alt jenkins配置jdk
指定maven alt jenkins配置maven
手动发布 alt 手动发布
集成发布 alt 集成部署