springboot项目中使用docker进行远程部署的实现

 更新时间:2025年01月08日 09:57:44   作者:jasnet_u  
本文主要介绍了在Spring Boot项目中使用Docker进行远程部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

springboot项目中使用docker进行远程部署,这个过程,其实就是先将项目打包为springboot的jar包,再远程连接到docker主机上将springboot的jar包构建为docker镜像。最后运行docker run [镜像名称] ,以docker容器方式运行我们的应用。 

方式一: idea中安装docker 集成插件,进行docker远程部署。 

安装完成后,重启idea。 在setting--》build,execution,deployment--》下找到docker ,添加/配置一个docker主机(可以是远程的docker主机)。当然,需要注意的是,远程主机上的必须有安装docker,并且开启了docker的远程访问。

新建一个简单的springboot项目 。new --》project --》spring initializr --》勾选 web ,devtool即可,项目名称填写为 docker-demo1 。

springboot启动类:

package com.tingcream.dockerdemo1;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
@SpringBootApplication
@RestController
public class DockerDemo1Application {
    @Value("${spring.application.name}")
    private  String applicationName;
    @Value("${server.port}")
    private  String port;
 
    public static void main(String[] args) {
        SpringApplication.run(DockerDemo1Application.class, args);
    }
 
    @RequestMapping("/")
    public String index(){
        String date= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        System.out.println("当前时间:"+date);
        return  "hello: "+applicationName+",端口为:"
                +port+",当前时间为:"+date;
    }
 
}

application.yml

server:
  port: 8081

spring:
  application:
    name: docker-demo1

#日志
logging:
  level:
    root: INFO
    org.springframework.web: INFO
    org.springframework.jdbc: debug
    com.tingcream: DEBUG
  file: /log/docker-demo1.log

在项目根目录中,创建一个Dockerfile文件,内容如下:

FROM    frolvlad/alpine-oraclejre8
VOLUME /tmp

# 配置环境变量
ENV LANG="en_US.UTF-8" \
    LANGUAGE="en_US:en"  \
    LC_ALL="en_US.UTF-8"


# 复制jar包
ADD target/docker-demo1.jar   /app.jar

# 修改容器时区为北京时间
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&\
    apk --no-cache add tzdata  && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

#声明要暴露的端口
EXPOSE 8081  5005

#入口
#ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","/app.jar"]

#入口,开启远程调试(5005端口)
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom",\
   "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-jar","/app.jar"]

在idea中,编辑一个configuration (run/debug--》edit configuration)  

完成后,我们编写好项目代码,先执行mvn clean package ,将项目打包,再找到docker-demo1 的运行选项 ,点击绿色三角启动按钮执行,即可将我们的springboot jar包,并自动构建docker镜像上传到我们的指定的docker主机上。

方式二 :pom中引入一个docker插件进行项目docker远程部署

1、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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.tingcream</groupId>
  <artifactId>docker-demo1</artifactId>
  <version>0.1</version>
  <name>docker-demo1</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <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-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>docker-demo1</finalName>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>

    <plugins>
       <!--springboot 打execute jar包-->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>

       <!--JDK8 编译-->
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <target>1.8</target>
        <source>1.8</source>
        <encoding>utf-8</encoding>
      </configuration>
      </plugin>



      <!--docker 的maven插件 -->
      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
          <version>0.4.13</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <!--docker主机的地址-->
          <dockerHost>http://192.168.11.10:2375</dockerHost>
          <!--打包的镜像名称-->
          <imageName>jellyflu/${project.build.finalName}:${version}</imageName>
          <!--Dockerfile所在的目录-->
           <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
        <!--<dockerDirectory>${project.basedir}</dockerDirectory>-->
         <resources>
            <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

    </plugins>
  </build>

</project>

如上,其中最主要的就是引入了一个docker 的maven插件包,该插件包会将我们的docker build命令绑定到maven的package执行阶段。

也就是说,当我们在项目中执行mvn clean package 时,会先自动打包(springboot 包),再远程连接到docker主机上进行镜像的构建。

2、在项目根src/main中创建docker目录,里面再新建一个Dockerfile文件。

Dockerfile文件的内容如下: 

FROM    frolvlad/alpine-oraclejre8
VOLUME /tmp
 
ENV LANG="en_US.UTF-8" \
    LANGUAGE="en_US:en"  \
    LC_ALL="en_US.UTF-8"
 
#ENV LANG en_US.UTF-8
#ENV LANGUAGE en_US:en
#ENV LC_ALL en_US.UTF-8
 
ADD  docker-demo1.jar   /app.jar
 
# 修改容器时区为北京时间
RUN  sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories &&\
    apk --no-cache add tzdata  && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone
 
#声明要暴露的端口
EXPOSE 8081  5005
 
#入口
#ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","/app.jar"]
#入口,开启远程调试
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Djava.security.egd=file:/dev/./urandom",\
   "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005","-jar","/app.jar"]

3、编写好项目代码后,运行mvn clean package 即可自动将项目打包,并将springboot包构建为docker镜像。 注意这时镜像并没有自动run出一个容器,需要我们手动到docker主机上执行docker run命令,如

docker run -d -p 8081:8081 -p 5005:5005  -v /log:/log --name docker-demo1   jellyflu/docker-demo1:0.1 

查看容器运行日志 :

docker  logs -f  docker-demo1  或者 tail -f /log/docker-demo1.log  

附: docker主机上如何开启远程访问 

1、修改docker.service配置文件
 vi /usr/lib/systemd/system/docker.service 

[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

:x保存退出

2、重启docker的守护进程

systemctl daemon-reload
systemctl restart docker

到此这篇关于springboot项目中使用docker进行远程部署的实现的文章就介绍到这了,更多相关springboot docker远程部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java之递归求和的两种简单方法(推荐)

    Java之递归求和的两种简单方法(推荐)

    下面小编就为大家带来一篇Java之递归求和的两种简单方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Java自定义标签用法实例分析

    Java自定义标签用法实例分析

    这篇文章主要介绍了Java自定义标签用法,结合实例形式分析了java自定义标签的定义、使用方法与相关注意事项,需要的朋友可以参考下
    2017-11-11
  • java中final关键字使用示例详解

    java中final关键字使用示例详解

    Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例
    2014-01-01
  • Java编程实现用hash方法切割文件

    Java编程实现用hash方法切割文件

    这篇文章主要介绍了Java编程实现用hash方法切割文件,简单介绍了hash的概念,然后分享了使用方法示例,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • 详解OpenAPI开发如何动态的添加接口实现

    详解OpenAPI开发如何动态的添加接口实现

    这篇文章主要为大家介绍了OpenAPI开发如何动态的添加接口实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java中终止线程的方法详解

    Java中终止线程的方法详解

    这篇文章主要介绍了Java中终止线程的方法详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Spring缓存注解@Cacheable @CacheEvit @CachePut使用介绍

    Spring缓存注解@Cacheable @CacheEvit @CachePut使用介绍

    Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下
    2021-07-07
  • 浅谈Java中父类与子类的加载顺序详解

    浅谈Java中父类与子类的加载顺序详解

    本篇文章是对Java中父类与子类的加载顺序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Java8 Optional的详细使用教程

    Java8 Optional的详细使用教程

    这篇文章主要给大家介绍了关于Java8 Optional的详细使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 详解Java Map中三个冷门容器的使用

    详解Java Map中三个冷门容器的使用

    本篇文章主要讲解下Map家族中3个相对冷门的容器,分别是WeakHashMap、EnumMap、IdentityHashMap, 想必大家在平时的工作中也很少用到,或者压根不知道他们的特性以及适用场景,本篇文章就带你一探究竟
    2022-12-12

最新评论