现在的微服务时代,你的代码没个微服务、分布式人家都会觉得低端,当然!对于我们开发人员来说,掌握这些技术意味着涨薪。
我们项目中用到了多个微服务,我们上一节课程打包用的是手动上传,但是很麻烦,有没有更好的方式呢,是有的,我们可以直接通过idea将我们的微服务打包成Docker镜像,并推送到Docker仓库中
这里我们采用jib-maven-plugin 来进行来构建容器化的spring boot应用程序,Jib可以让不写Dockerfile就能实现Docker打包
什么是Jib
Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。
Jib带来的是,它允许您通过简单地将插件添加到您选择的构建工具(Maven或Gradle)来创建容器,没有额外的文件,只需几行配置,它处理将应用程序打包到容器映像的所有步骤。
Jib是来自Google的开源Java容器,它允许Java开发人员使用他们所知道的Java工具构建容器,它不需要您编写Dockerfile或安装了docker,它直接集成到Maven和Gradle中。
和传统的插件区别
Docker 构建流程
在“传统”Java到Docker映像构建流程中,我们需要安装Dockerfile和docker守护进程,在Jib构建流程中,您只需要插件项目的构建文件。
Jib构建流程
通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤。它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。
准备工作
设置Horbor用户权限
我们要将idea的微服务推送到Harbor,并且用
itcast
的用户,所有我们要设置我们的itcast
用户是开发者
pom文件配置jib
对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin
公共属性配置
在properties中配置
harbor
的共有配置
<properties> | |
<!--harbor 仓库地址--> | |
<docker.registry.url>itcastharbor.com</docker.registry.url> | |
<!--harbor 的项目名称--> | |
<docker.registry.name>library</docker.registry.name> | |
<!--harbor账号--> | |
<docker.registry.username>itcast</docker.registry.username> | |
<!--harbor密码--> | |
<docker.registry.password>Qwert123</docker.registry.password> | |
</properties> |
编译配置插件配置
<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
就可以了
我们看到已经推送成功了
harbor仓库中查看
通过域名访问harbor,我们看我们的
library
里面的镜像仓库
点进去就可以看到我们刚刚推送的镜像
以及镜像的详细信息
其他的微服务上传
微服务打包
这里我们也将其他微服务上传到仓库,步骤同上
仓库中查看镜像
在我们的仓库中查看镜像,我们看到镜像都已经上传到仓库中了
harbor 测试
删除本地镜像
可以通过
docker rmi 镜像ID
删除本地镜像
docker rm -f learn-docker-storage | |
docker rmi 192.168.64.153/library/learn-docker-storage:0.0.3 |
运行harbor 中的镜像
我们把我们的所有微服务都上传到了仓库中,我们以一个完整的项目运行docker
运行learn-docker-storage服务
执行运行命令
docker run -d \ | |
-v /tmp/data/logs:/logs \ | |
--name learn-docker-storage \ | |
--network=learn-docker-network \ | |
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT |
因为我们是基于内部网络访问 不需要暴漏接口了
访问微服务测试
curl http://192.168.64.152:8080/userinfo/10001 | python -m json.tool |
运行learn-docker-web服务
执行运行命令
docker run -d \ | |
--name learn-docker-web \ | |
--network=learn-docker-network \ | |
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT |
该微服务也是内部服务不需要暴漏端口,并且没有配置日志输出所有不挂载日志路径
运行learn-docker-gateway服务
执行运行命令
docker run -d \ | |
-p 8888:8888 \ | |
--name learn-docker-gateway \ | |
--network=learn-docker-network \ | |
manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT |
因为网关对外需要暴漏端口,所有需要开放
8888
端口
查看nacos注册的微服务
我们发现我们的三个服务都已经注册进去了
访问测试微服务
因为我们存储服务的
8003
端口没有暴漏出来,无法访问,我们需要通过网关进行访问
curl http://192.168.64.153:8888/employeapi/find/10001| python -m json.tool |