• 使用 Docker 部署 Spring Boot 项目,带劲!!


    上一篇:年轻人的第一个 Docker 应用

    Docker 一次构建、处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程。

    本篇栈长主要介绍下如何通过 IntelliJ IDEA、Maven 来操作 Docker 部署 Spring Boot 项目,这也是我们 Java 程序员最关心的开发实战。

    一、Maven 插件配置

    首先在 Maven pom.xml 配置文件中加入 Docker 的 Maven 插件。

    我看网上很多人还在用 docker-maven-plugin 插件:

    <properties>
        <docker.image.prefix>docker</docker.image.prefix>
    </properties>
    
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    你们还在用这个插件吗?

    栈长从官方仓库看到,这个插件官方已经不维护了:

    所以这个插件我就不推荐大家使用了,而是推荐官方的另外一个插件:dockerfile-maven

    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <repository>javastack/${project.name}</repository>
                    <tag>${project.version}</tag>
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                    <dockerfile>src/main/docker/Dockerfile</dockerfile>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    这个插件使用简单,功能更强大。

    新插件地址:

    https://github.com/spotify/dockerfile-maven

    最新版插件的环境要求:

    • JDK 7+

    • Apache Maven 3.5.2+

    这个插件的牛逼之处在于:

    1、从插件名称就可以知道,这个插件是基于 Dockerfile 文件进行构建 Docker 项目的,专注 Dockerfile 文件,所以需要一个 Dockerfile 文件,Dockerfile 也是构建 Docker 项目的基石。

    2、把 Docker 的构建过程集成到了 Maven 的构建过程之中,如果使用默认的配置,使用 mvn package 命令就能打包成一个 Docker 镜像,使用 mvn deploy 命令就能推送到 Docker 仓库。

    3、使我们的构建目标更明确,如我们先使用 mvn dockerfile:build 然后再 mvn dockerfile:tag,然后再 mvn dockerfile:push,也可以满足同时构建再推送的场景,如: mvn dockerfile:build dockerfile:push,这都没问题的。

    4、与 Maven 构建集成,我们可以在一个项目中依赖另外一个项目的 Docker 镜像,Maven 将以正确的顺序构建项目。当我们运行涉及多个服务的集成测试用例时,这很有用的。

    二、Docker 配置

    Dockerfile 是创建 Docker 镜像的基本配置文件,本身是一个文本文件。

    插件默认加载位置为项目所在根目录,因为我在上面的 Maven 插件配置中指明了路径。所以,在 src/main/docker/ 目录下添加一个 Dockerfile 文件:

    # 添加 Java 8 镜像来源
    FROM java:8
    
    # 添加参数
    ARG JAR_FILE
    
    # 添加 Spring Boot 包
    ADD target/${JAR_FILE} app.jar
    
    # 执行启动命令
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    

    值得说一下的是,上面的 JAR_FILE 参数就是从 Docker Maven 插件中指定的构建参数,这也是这个插件的强大之处,可以翻到文章上面去看一下。

    具体的 Dockerfile 文件细节比较多,这里就不展开详细介绍了,后面我再开一篇单独介绍,关注公众号Java技术栈第一时间推送。

    三、添加测试接口

    添加一个测试接口,以便后面部署测试。

    package cn.javastack.springboot.docker;
    
    import org.springframework.boot.Banner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 微信公众号:Java技术栈
     */
    @RestController
    @SpringBootApplication
    public class DockerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DockerApplication.class);
        }
    
        @GetMapping("/docker/hello")
        public String helloDocker() {
            return "hello docker";
        }
    
    }
    

    Spring Boot 基础性的知识和搭建过程就不介绍了,不熟悉的可以关注公众号Java技术栈,在后台回复关键字 "boot" 阅读我之前写的系列教程。

    所有 Spring Boot 教程实战源码在下面个仓库:

    https://github.com/javastacks/spring-boot-best-practice

    本篇所有实战源码到时也会全部同步到上面,大家 Star 一下吧!

    四、构建 Docker 镜像

    配置了 Maven 插件和 Dockerfile 文件后就可以开始构建 Docker 镜像了。

    上面也说了,Docker 构建过程已经集成到了 Maven 的构建过程之中,那么可以直接使用 mvn package 就可以同时打包和构建 Docker 镜像了。

    在 IDEA 中可以直接点击插件对应的命令运行:

    插件会根据 Dockerfile 文件构建,文件中有多少条命令,就分为几个步骤构建,如果没问题就会构建成功。

    五、IDEA 怎么操作 Docker?

    一旦我们创建了 Dockerfile 文件,IDEA 就会自动识别并提示我们创建 Docker 连接,当然,我们也可以调出 Services 面板进行手动创建。

    打开 IDEA 中的 Services 面板:

    然后点击 Add service > Docker Connection 来添加一个 Docker 连接:

    创建完后会自动连接上,点击展开会显示 Docker 本地所有镜像和容器:

    如上图所示,就是我们刚构建的镜像。

    六、创建并运行容器

    右击上面的镜像,选择 "Create Container" 菜单来创建并运行一个容器。

    填写相应的运行参数,再点击运行按钮,容器即开始运行。

    然后在 Build Log 和 Log 面板中可以看到容器运行日志和应用程序运行日志:

    项目在 Docker 中运行起来了,然后再访问下上面写的测试接口:

    http://localhost:8080/docker/hello

    OK,到这里就部署并运行成功了。

    七、总结

    本文栈长使用 IntelliJ IDEA、Maven 用 Docker 部署了一个 Spring Boot 项目,虽然只是一个简单的示例,但同时为了配合写文章,全程硬是肝了几个小时。

    本文只是一个简单的示例,所以过程并不复杂,想要构建更加复杂的应用,我们需要学习 Dockerfile 文件的编写,这个下期再分享吧,关注公众号Java技术栈第一时间推送,不要走开。

    如果只是运行一个 Spring Boot 应用确实没有必要用到 Docker,本文也是为了演示而上了 Docker。

    但在实际工作中,Docker 就很有用了,Docker 一次将应用代码、JDK、环境变量、配置文件、以及其他配置信息都打包到一个镜像里面了,一次构建,处处运行,所以再也不用担心环境和配置问题了,开发测试运维都爽死。

    好了,本文就到这里了,后续栈长还会带来更多 Docker 实用性的教程,比如 Docker 私库的搭建及其他实用的玩法等,关注公众号Java技术栈第一时间推送。

    本文所有实战源码已上传到这个仓库:

    https://github.com/javastacks/spring-boot-best-practice

    觉得不错,在看、分享转发一下,写文章不易,需要你们的鼓励,感谢各位老铁们!

    版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。

    近期热文推荐:

    1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    4.吊打 Tomcat ,Undertow 性能很炸!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    转载:DIV+CSS有可能遇到的问题
    CSS3那些不为人知的高级属性
    php获取GET方式传入的全部变量名称与值:foreach用法
    转载:Erlang 资源
    Java工具类 Apache Commons:commons-lang
    PHP安装环境,服务器不支持curl_exec的解决办法
    2018年5月10日论文阅读
    C++ code:char pointers and char arrays(字符指针与字符数组)
    2018年5月9日论文阅读
    C++ code:More Loop Designs
  • 原文地址:https://www.cnblogs.com/javastack/p/14034812.html
Copyright © 2020-2023  润新知