微服务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.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> <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> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <executions> <execution> <id>build-image</id> <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>
<dockerDirectory>${project.basedir}</dockerDirectory> <dockerHost>${docker.image.host}</dockerHost> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </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 run -d -p 9999:9999 -name zuul-server 6d0346e8840b
|
查看docker 进程
Jib插件打包
什么是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 应用程序容器化。
准备工作
配置文件提取
因为我们在开发中需要频繁修改application.yml
文件我们将配置项配置到pom
文件中打包时自动打到配置文件,这样可以用一个pom
文件控制多个不同的服务的配置文件项的修改
pom文件定义属性
我们需要在总pom
文件定义全局配置,例如nacos
、mysql
等配置
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 cloud: nacos: server-addr: @nacos.addr@ mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.heima.module.p
|
编译测试
配置完后编译项目后,可以进入target目录下查看编译后的配置文件
我们看到maven已经帮我们将配置编译进了配置文件中了
Horbor安装配置
Horbor安装参考 《Docker仓库》
设置Horbor用户权限
我们要将idea的微服务推送到Harbor,并且用baiyp
的用户,所有我们要设置我们的baiyp
用户是开发者
pom文件配置jib
对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin
公共属性配置
在properties中配置harbor
的共有配置
1 2 3 4 5 6 7 8 9 10
| <properties> <docker.registry.url>192.168.64.153</docker.registry.url> <docker.registry.name>library</docker.registry.name> <docker.registry.username>baiyp</docker.registry.username> <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> <image>openjdk:8-jdk-alpine</image> </from> <to> <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version} </image> <tags> <tag>${project.version}</tag> </tags> <auth> <username>${docker.registry.username}</username> <password>${docker.registry.password}</password> </auth> </to> <container>
<jvmFlags> <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag> </jvmFlags> <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> </plugins> </build>
|
执行构建
然后在项目根目录执行mvn clean compile jib:build
就可以了
我们看到已经推送成功了
harbor仓库中查看
通过域名访问harbor,我们看我们的library
里面的镜像仓库
点进去就可以看到我们刚刚推送的镜像
以及镜像的详细信息