有关于在Intellij Idea中使用Docker的文章有很多,但大都是以下的方式

    1. 使用web应用(war包)进行部署的

    2. 在同一个项目下使用Dockerfile

    3. 配置pom.xml将jar文件到报道Dockerfile目录下

但实际项目中

    1. 更多的是使用jar包

    2. 希望现有项目能更方便的进行Docker部署,但又不想在原有项目上进行改动

所以,本文基于实际情况,进行一次探索,看看是否可以满足以上的要求

--------------------------------------------我是分割线----------------------------------------------------

运行环境

Docker for Windows (Windows 10)


第一步:在Intellij Idea中安装Docker Plugin

这步在很多文章中都有介绍,此处不详细说明,附图一张,设置路径为 File->settings

第二步:构想应用模式

基于“希望现有项目能更方便的进行Docker部署,但又不想在原有项目上进行改动”,我们需要创建2个项目,

一个Springboot项目,我们暂时命名为“spring-boot-maker”,

一个Docker项目,暂时命名为“docker-maker”。

spring-boot-maker项目进行自己的应用开发,不涉及任何docker相关的内容

docker-maker项目,将spring-boot-maker项目做成docker镜像(image),并以docker的方式启动运行。

两个项目是互相独立的,无法互相访问到。


第三步:创建springboot项目

创建springboot项目spring-boot-maker

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>docker</groupId>
    <artifactId>spring-boot-maker</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>

注意:<build>块必须要写,不然打包出的jar无法运行

SpringBootMakerApplication.java (启动类,很简单的一个)

package docker.spring.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootMakerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMakerApplication.class, args);
    }
}

SpringBootMakerController.java (controller类)

package docker.spring.boot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/spring/boot")
public class SpringBootMakerController {

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
    @ResponseBody
    public String hello(@PathVariable String name) {
        return "hello " + name;
    }
    
}

项目创建完毕,我们启动,并在浏览器中试验一下,确保应用可以访问。


第四步:创建Docker项目

spring-boot项目是一个maven项目,而Docker项目就是一个目录。

我们在项目下创建目录spring-boot-maker,以表明这是创建给spring-boot-maker项目的。

在spring-boot-maker目录下创建文件Dockerfile

由于Dockerfile中的ADD和COPY命令只支持相对路径,所以无法使用绝对路径进行操作。

而修改spring-boot-maker项目中的pom.xml文件,将jar文件直接打包到Dockerfile所在目录下,不符合我们”不修改原项目“的初衷。

所以思路是:将spring-boot-maker项目编译好后打包,将打好包的jar文件Copy到Dockerfile所在目录,这些由bat(批处理)文件执行,Dockerfile执行创建镜像(image)的操作。


docker.run.bat

cd /d D:\SourceCode\workspace\test-for-docker\spring-boot-maker
call mvn clean package -U -DskipTests
cd /d %~dp0
del *.jar
copy D:\SourceCode\workspace\test-for-docker\spring-boot-maker\target\spring-boot-maker-*.jar spring-boot-maker-*.jar
ren spring-boot-maker-*.jar spring-boot-maker.jar
docker build -t spring-boot-maker .
docker run -d -p 8080:8080 --name spring-boot-maker spring-boot-maker


Dockerfile

# From java image, version : 8
FROM java:8

# 挂载app目录
VOLUME /app

# COPY or ADD to image
COPY spring-boot-maker.jar app.jar

RUN bash -c "touch /app.jar"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

直接执行bat文件,启动容器成功。


在浏览器中访问,成功。



以上我们成功的实现了预想中的要求,在不影响原有应用的基础上完成了Docker化改造。

git地址: https://github.com/SimonZhang1980/docker4springboot


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐