Docker系列-第七篇Docker构建SpringBoot应用

1.基于Dockerfile构建SpringBoot镜像

1.1准备工作

将SpringBoot项目通过maven打成jar包

mvn clean package #使用maven打包项目

1.2使用Dockerfile构建镜像

  • step1 在存放jar所在目录下创建Dockerfile文件

    touch Dockerfile
  • step2 编辑Dockerfile增加以下内容
    FROM java:8
    MAINTAINER  niugang<[email protected]>
    RUN mkdir -p /opt/springapp
    ADD   demo-0.0.1.jar  /opt/springapp
    EXPOSE 8088
    ENTRYPOINT ["java","-jar","/opt/springapp/demo-0.0.1.jar"]
  • step3 构建镜像
    docker build -t springbootdemo:1.0 .
  • step4 启动容器
    docker run -d  -p 8088:8088 --name sb springbootdemo:1.0 

    在启动容器是可以添加数据卷,程序日志映射到宿主机,方便后期排查问题

    注意:在启动过程中,一直起不起来,然后通过前台启动查看了日志。

    报了如下错误:

    WARNING: IPv4 forwarding is disabled. Networking will not work.

    解决:

    #需要做如下配置

    解决办法:

    vim/etc/sysctl.conf

    net.ipv4.ip_forward=1 #添加这段代码

    #重启network服务

    systemctl restart network && systemctl restart docker

    #查看是否修改成功 (备注:返回1,就是成功)

    [[email protected] ~]# sysctl net.ipv4.ip_forward
    net.ipv4.ip_forward = 1

  • step5 调用你的springboot应用,验证其是否正确

2.使用Maven插件构建Docker镜像

Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,以下几款Maven的Docker插件比较常用。
插件名称 官方地址
docker-maven-plugin https://github.com/spotify/docker-maven-plugin

上面插件可以从github看到此插件已经不再推荐了。推荐使用

https://github.com/spotify/dockerfile-maven 具体操作步骤上面有介绍

docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin

2.1直接配置方式

  • step 1

    在你的springboot应用的pom.xml中增加如下配置

     <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:3.0</imageName>
                        <!--用于指定基础镜像,类似于Dockerfile中的FROM指令。-->
                        <baseImage>java</baseImage>
                        <!--类似于Dockerfile的ENTRYPOINT指令-->
                        <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>l

    简要说明一下插件的配置:

    • imageName:用于指定镜像名称,其中niugang是仓库名称,springboot是镜像名称,3.0是标签名称
    • baseImage:用于指定基础镜像,类似于Dockerfile中的FROM指令。
    • entrypoint:类似于Dockerfile的ENTRYPOINT指令。
    • resources.resource.directory:用于指定需要复制的根目录,${project.build.directory}表示target目录。
    • resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。
  • step2 进入代码路径下,执行如下命令
    mvn clean package docker:build
  • step3 查看镜像

  • step4 启动容器
    docker run  -d -p 8088:8088 --name myspringboot niugang/springboot:3.0
  • step5 访问测试

2.2 读取Dockerfile进行构建

在2.1中只需要在pom.xm中配置,执行命令就可以生成docker镜像。在很多时候希望通过Dockerfile生成Docker镜像。

  • step1 在项目src/main/resources目录下新建docker文件夹,在文件夹下新建Dockerfile文件,增加如下内容:
FROM java:8
MAINTAINER niugang<[email protected]>
RUN  mkdir -p /docker/images
ADD demo-0.0.1-SNAPSHOT.jar /docker/images
ENTRYPOINT ["java","-jar","/docker/images/demo-0.0.1-SNAPSHOT.jar"]
  • step2 pom.xml修改为如下

     <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:4.0</imageName>             <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin> 

    可以看到,不再制定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在路径。即时指定了baseImage和entrypoint也将被忽略。

  • step2 进入代码路径下,执行如下命令
mvn clean package docker:build
  • 查看镜像
docker images

  • step4 启动容器

    docker run  -d -p 8088:8088 --name myspringboot niugang/springboot:4.0
  • step5 访问测试

2.3 将插件绑定在某个phase执行

很多场景下,我们有这样的需求,执行例如 mvn clean package 时,插件就自动为我们构建Docker镜像。要想实现这点,我们只需将插件的goal绑定在某个phase即可。
phase和goal可以这样理解:maven命令格式是: mvn phase:goal ,例如 mvnpackagedocker:build 。那么,package和docker都是phase,build则是goal。

  • step1 编辑pom.xml 内容如下

    <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                   <executions>
                       <execution>
                           <id>build-images</id>
                           <phase>package</phase>
                           <goals>
                               <goal>build</goal>
                           </goals>
                       </execution>
                   </executions>
                    <configuration>
                        <!--用于指定镜像名称-->
                        <imageName>niugang/springboot:5.0</imageName>                    <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
                        <resources>
                            <resource>
                                <!--将打包后的资源文件复制到该目录-->
                                <targetPath>/</targetPath>
                                <!--需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面-->
                                <directory>${project.build.directory}</directory>
                                <!--需要复制的文件,打包好的应用jar包。-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
  • step2进入代码路径下,执行如下命令
mvn clean package
  • step3 查看镜像

由配置可知,我们只需添加如下配置:

<executions>
  <execution>
    <id>build-image</id>
    <phase>package</phase>
    <goals>
      <goal>build</goal>
    </goals>
  </execution>
</executions>

就可将插件绑定在package这个phase上。也就是说,用户只需执行 mvn package ,就会自动执行 mvn docker:build 。当然,读者也可按照需求,将插件绑定到其他的phase。

微信公众号


JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。

原文地址:https://www.cnblogs.com/niugang0920/p/12187060.html

时间: 2024-08-03 12:57:02

Docker系列-第七篇Docker构建SpringBoot应用的相关文章

Docker系列-第八篇Docker常用安装

一.总体步骤 1.搜索镜像 2.拉取镜像 3.查看镜像 4.启动镜像 5.停止容器 6.移除容器 二.安装Tomcat 2.1 docker push方式安装tomcat https://hub.docker.com/_/tomcat docker hub上每个镜像怎么使用,都有对应的说明,这个说明对于每个镜像的安装和使用都很有帮助 2.1.1.docker hub上面查找tomcat镜像 2.1.2.从docker hub上拉取tomcat镜像到本地 2.1.3.docker images查看

Docker系列-第五篇Docker容器数据卷

1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data Volumes ) : 容器内数据直接映射到本地主机环境: 数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷. 一句话:有点类似我们Redis里面的rdb和aof文件 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的

Docker系列-第四篇Docker镜像

1.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 1.1UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层.轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single

【Docker系列教程之三】Docker容器是如何工作的

在上一篇的文章中,我给大家主要介绍了一下 Docker 环境的搭建,简单的讲解了一下 Docker 架构,以及用 Docker 命令简单演示了一下如何拉去一个 images 镜像.本篇我们将剖析一下 Docker 容器是如何工作的,学习好Docker容器工作的原理,我们就可以自己去管理我们的容器了. Docker架构 在上一篇文章的学习中,我们简单地讲解了Docker的基本架构.了解到了 Docker 使用的是 C/S 结构,即客户端/服务器体系结构.明白了 Docker 客户端与 Docker

SpringBoot之旅第七篇-Docker

一.引言 记得上大三时,要给微机房电脑安装系统,除了原生的操作系统外,还要另外安装一些必要的开发软件,如果每台电脑都重新去安装的话工作量就很大了,这个时候就使用了windows镜像系统,我们将要安装的软件装好打包成一个镜像,其他电脑只要装这个镜像就可以了,这样工作量就减少了很多.Docker跟这个镜像并不是一回事,但是思想是相同的. 我们在一台服务器中下载.安装.配置好Mysql,在另外一台服务器中又得重新下载.安装.配置,这样很麻烦也容易出现一些错误. 这个时候Docker就派上用场了,我们可

Docker系列-第六篇DockerFile解析

1.手动编写一个dockerfile文件,当然必须要符合file的规则 2.有了这个文件,直接docker build命令执行,获得一个自定义的镜像 3.run 1.是什么 Dockerfle 是一个文本格式的配置文件, 用户可以使用 Dockerfle 来快速创建自定义的镜像. Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1.1三步骤 编写Dockerfile文件 docker build docker run 2.DockerFile构建过程解

Docker系列:入门篇-安装docker

Docker 提供了两个版本:社区版 (CE) 和企业版 (EE). Docker 社区版 (CE) 是开发人员和小型团队开始使用 Docker 并尝试使用基于容器的应用的理想之选,所以这里我们来说一下Docker社区版的安装 操作系统要求 64位 CentOS 这里只说明centos上的安装方法 卸载旧版本 Docker 的早期版本称为 docker 或 docker-engine.如果安装了这些版本,请卸载它们及关联的依赖资源. $ sudo yum remove docker docker

docker系列之一:初见docker

什么是docker? docker是目前linux最流行的容器技术,Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容器.程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样 优点:占用资源小,启动快,体积也小 docker容器与虚拟机有什么区别? 虚拟机(virtual machine)就是带环境安装的一种解决方案,本质上是一个文件夹 虚拟机运行的时候独占系统资源,因为它运行的环境是一个完整的操作系统,我们在运行之前会给虚拟机提前配置相应的物理机的

8天入门docker系列 —— 第七天 让你的container实现跨主机访问

当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你 借助docker自带的overlay网络模型了. 一: overlay网络模型 要想快速的搭建overlay网络,你可以通过docker默认的swarm集群给你默认生成的名ingress的overlay网络,这样会默认开放一些端口供底层机器内的访问,比如: UDP 4789 是用于overlay network 流量传输的,作为开发角