Docker部署Spring Boot

作者: AaronSimon | 来源:发表于2018-08-23 07:58 被阅读167次

    Docker技术的发展给微服务的部署带来了很大的便利,本文简单介绍一下使用Docker部署Spring Boot项目。

    一、构建一个简单的Spring Boot项目

    1. 启动类
    @SpringBootApplication
    public class DemoApplication {
      @RestController
      public class HelloSimonController{
        @RequestMapping("/hello")
        public String hello(){
          return "hello simon";
        }
      }
      public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
      }
    }
    
    1. pom依赖
    <?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>com.simon</groupId>
      <artifactId>demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>demo</name>
      <description>Demo project for Spring Boot</description>
    
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
      </parent>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    </project>
    

    启动这个demo,浏览器访问http://localhost:8080/hello,返回 “hello simon”,接口正常。

    二、添加Docker支持

    1. 添加Docker构建插件

      <!-- Docker maven plugin -->
            <plugin>
              <groupId>com.spotify</groupId>
              <artifactId>docker-maven-plugin</artifactId>
              <version>1.0.0</version>
              <configuration>
                <imageName>simon/${project.artifactId}:${project.version}</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>
      

      简要说明插件配置:

      • imageName:用于指定镜像名称,其中simon是仓库名称,${project.artifactId}是镜像名称,${project.version}是标签名称;
      • resources.resource.directory:用于指定需要复制的文件,${project.build.directory}表示target目录;
      • resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar
    2. 在目录src/main/docker下创建 Dockerfile 文件,Dockerfile 文件用来说明如何来构建镜像

      FROM openjdk:8-jdk-alpine
      VOLUME /tmp
      ADD demo-0.0.1-SNAPSHOT.jar app.jar
      ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
      
      • FROM: 表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
      • VOLUME: VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
      • ADD ,拷贝文件并且重命名
      • ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

    三、打包部署项目

    我们需要把demo这个项目上传到linux上进行打包部署。linux上需要安装jdk和maven(不讲述安装过程),还需要安装Docker环境,可以参考之前的文章Centos7 安装Docker

    • 构建镜像
      进入demo项目的根目录,执行下面的命令
    $ mvn package docker:build
    
    • 查看是否构建成功
    $ docker images
    
    [root@simon demo]# docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    ibase/demo                 0.0.1-SNAPSHOT      639e4a6f043d        6 seconds ago       119MB
    ibase/feign_upload_first   0.0.1-SNAPSHOT      3f8c202e53e7        38 minutes ago      119MB
    openjdk                    8-jdk-alpine        5801f7d008e5        6 weeks ago         103MB
    

    ibase/demo就是构建的镜像

    • 运行镜像
    $ docker run -p 8080:8080 -t ibase/demo:0.0.1-SNAPSHOT
    
    • 查看正在运行的镜像
    $ docker ps
    
    CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                    NAMES
    24a8d8d5b309        ibase/demo:0.0.1-SNAPSHOT   "java -Djava.secur..."   26 minutes ago      Up 26 minutes       0.0.0.0:8080->8080/tcp   adoring_johnson
    
    • 访问项目
      浏览器访问http://localhost:8080/hello,返回hello simon,部署成功。

    • 停止实例

    $ docker stop adoring_johnson
    

    相关文章

      网友评论

        本文标题:Docker部署Spring Boot

        本文链接:https://www.haomeiwen.com/subject/hbnyiftx.html