抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

微服务Docker打包

前言

​ 现在的微服务时代,你的代码没个微服务、分布式人家都会觉得低端,当然!对于我们开发人员来说,掌握这些技术意味着涨薪。

​ 而微服务的部署在当前流行的方式就是Docker部署,要是没有docker部署会累死你。

​ 由于本人主要做Java开发,今天就带给大家springboot项目直接打包发布到docker镜像仓库,这里的镜像仓库是指你自己的服务器安装的docker服务!

​ 平时我们springboot项目都可以直接打包为jar包,可以直接在有jre的环境运行启动服务,这里就不多说了,相信每一个Java开发人员都会。

docker安装

​ 如果你docker都还没有安装,那就先从安装一个docker服务开始吧!《docker安装教程》

​ 这里要说明一下的是,docker服务你随意安装在那一台服务器上都可以,你打包发布的环境不需要docker服务,比如你在你的个人windows电脑打包springboot项目到docker,不一定要把docker服务安装在这一台电脑上,你只需要指定目标docker服务器地址即可!

spotify插件打包

docker开启远程访问

CentOs7系统下按步骤执行命令

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

将ExecStart 加上 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

1
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock

:wq保存退出

重启docker
1
2
systemctl daemon-reload
service docker restart
测试

OK,然后访问地址确保docker远程访问开启成功 http://dockerhost:2375/version

配置服务docker插件

springboot项目打包docker镜像需要一个Maven插件

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-maven-plugin</artifactid>
</plugin>
<plugin>
<groupid>com.spotify</groupid>
<artifactid>docker-maven-plugin</artifactid>
<version>0.4.13</version>
</plugin>
</plugins>
</build>

​ 这里强调一下!!!不要使用什么IDEA插件打包docker镜像,请使用Maven!原因:如果你们公司或团队有的使用IDEA编辑器,有的使用eclipse,这就不统一了!所以我们使用Maven插件的方式!不管什么编辑器都通用!

docker 插件配置

父POM文件配置
1
2
3
4
5
6
7
8
9
10
11
12
13
<properties>
<!--docker 属性配置开始 -->
<docker.repostory>192.168.136.128:5000</docker.repostory>
<docker.image.prefix>springboot</docker.image.prefix>
<docker.image.host>http://192.168.136.128:2375</docker.image.host>
<docker.image.tag>latest</docker.image.tag>
<!--docker 属性配置结束 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-boot.version>2.2.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
服务加入配置
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
40
41
42
43
44
45
46
47
48
49
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定生成的镜像名-->
<imageName>${docker.repostory}/${docker.image.prefix}/${project.artifactId}</imageName>
<!--指定标签-->
<imageTags>
<imageTag>${docker.image.tag}</imageTag>
</imageTags>

<!-- 指定 Dockerfile 路径 ${project.basedir}:项目根路径下-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--指定远程 docker api地址-->
<dockerHost>${docker.image.host}</dockerHost>
<!-- 这里是复制 war 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>

其中dockerHost就是你的docker仓库地址,你需要把你的docker仓库开启远程访问,并且开放服务器的2375端口

创建DockerFile

在项目的目录下创建Dockerfile 文件,和pom文件保持同级目录

DockerFile内容
1
2
3
4
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xxx-server-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

该文件就是基于openjdk8 将编译后的jar改名为 app.jar 加入到docker容器,并通 java -jar 启动

打包

之前的一切都是环境配置准备,当配置完成后,你可以开始打包了,直接按照正常打包就可以

检查打包信息

打包完成后会自动进行发布

服务器测试

执行 docker images 命令查看docker镜像

1
docker images

启动测试
1
docker run -d -p 9999:9999 -name zuul-server 6d0346e8840b

查看docker 进程
1
docker ps

Jib插件打包

什么是Jib

Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。

​ Jib带来的是,它允许您通过简单地将插件添加到您选择的构建工具(Maven或Gradle)来创建容器,没有额外的文件,只需几行配置,它处理将应用程序打包到容器映像的所有步骤。

​ Jib是来自Google的开源Java容器,它允许Java开发人员使用他们所知道的Java工具构建容器,它不需要您编写Dockerfile或安装了docker,它直接集成到MavenGradle中

和传统的插件区别

Docker 构建流程

在“传统”Java到Docker映像构建流程中,我们需要安装Dockerfile和docker守护进程,在Jib构建流程中,您只需要插件项目的构建文件。

img

Jib构建流程

​ 通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤。它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。

img

准备工作

配置文件提取

因为我们在开发中需要频繁修改application.yml文件我们将配置项配置到pom文件中打包时自动打到配置文件,这样可以用一个pom文件控制多个不同的服务的配置文件项的修改

pom文件定义属性

我们需要在总pom文件定义全局配置,例如nacosmysql等配置

1
2
3
4
<properties>
<mysql.addr>192.168.64.153:3306</mysql.addr>
<nacos.addr>192.168.64.153:8848</nacos.addr>
</properties>
配置编译选项

在子项目的pom文件的build构建配置中使用 <filtering>true</filtering>配置,这样就可以将我们的总pom中的配置编译进配置文件了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置文件配置

在子项目的application.yml配置文件中注意使用@xxx@占位符来配置编译占位配置,下面的配置就是用了@@占位符编译后会将pom中的配置编译到配置文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: @project.server.prot@
spring:
application:
name: learn-docker-storage
######################### 数据源连接池的配置信息 #################
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://@db.addr@/employees?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
initialSize: 10
minIdle: 20
maxActive: 100
maxWait: 60000
#### nacos 配置#######
cloud:
nacos:
server-addr: @nacos.addr@
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.heima.module.p
编译测试

配置完后编译项目后,可以进入target目录下查看编译后的配置文件

image-20210330172541492

我们看到maven已经帮我们将配置编译进了配置文件中了

Horbor安装配置

Horbor安装参考 《Docker仓库》

设置Horbor用户权限

我们要将idea的微服务推送到Harbor,并且用baiyp的用户,所有我们要设置我们的baiyp用户是开发者

image-20210401174452974

pom文件配置jib

对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin

公共属性配置

在properties中配置harbor的共有配置

1
2
3
4
5
6
7
8
9
10
<properties>
<!--harbor 仓库地址-->
<docker.registry.url>192.168.64.153</docker.registry.url>
<!--harbor 的项目名称-->
<docker.registry.name>library</docker.registry.name>
<!--harbor账号-->
<docker.registry.username>baiyp</docker.registry.username>
<!--harbor密码-->
<docker.registry.password>Qwert123</docker.registry.password>
</properties>
编译配置插件配置
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>

<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.8.0</version>
<configuration>
<allowInsecureRegistries>true</allowInsecureRegistries>
<!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
<from>
<!--使用openjdk官方镜像,tag是:8-jdk-alpine,表示镜像的操作系统是alpine,装好了jdk8-->
<image>openjdk:8-jdk-alpine</image>
</from>
<to>
<!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
<image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
</image>
<tags>
<!--版本号-->
<tag>${project.version}</tag>
</tags>
<!--harbor的认证信息-->
<auth>
<username>${docker.registry.username}</username>
<password>${docker.registry.password}</password>
</auth>
</to>
<!--容器相关的属性-->
<container>

<jvmFlags>
<!--一些启动参数-->
<jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
</jvmFlags>
<!--挂载volume的配置-->
<volumes>
<volume>/tmp</volume>
<volume>/logs</volume>
</volumes>
<ports>
<!--暴漏端口号-->
<port>8080</port>
</ports>
<!--微服务的启动类-->
<mainClass>com.heima.test.Application</mainClass>
<format>OCI</format>
<!--使用该参数将镜像的创建时间与系统时间对其-->
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
</container>
</configuration>
<executions>
<!--执行打包配置-->
<execution>
<id>jib-maven-plugin</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>

执行构建

然后在项目根目录执行mvn clean compile jib:build就可以了

image-20210331162200842

我们看到已经推送成功了

harbor仓库中查看

通过域名访问harbor,我们看我们的library里面的镜像仓库

image-20210401174555317

点进去就可以看到我们刚刚推送的镜像

image-20210401174628396

以及镜像的详细信息

image-20210401174656206

评论