您的位置:首页 > 运维架构 > Docker

在Intellij Idea中使用Docker运行spring-boot应用

2018-02-20 11:48 323 查看
有关于在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息