Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)

1.开篇


我们都知道SpringBoot项目在完成之后,可以进行打包,打包的方式一般有两种:jarwar

听大牛讲授:未来jar包的方式将会是主流,因为越来越多的开发模式都转成了前后端分离这种技术,也就是说,我们后端开发工程师面对的全是Java后端代码,一个jar包不会出现任何的前端页面代码,我们需要交付给前端H5工程师的只是RESTful接口,他们拿到这些接口去测试就可以了。

那么war包这种形式,更多的就是采用jsp页面实现,讲jspJava代码耦合到一起,也就是说前后端都混在了一起,这种开发模式在效率、性能上自然比不上前后端分离的这种模式。

所以这里使用Dockerfile构建SpringBoot项目,我只做了将SpringBoot项目打jar包的步骤,war包我就不再做了。

2.案例详解


2.1 SpringBoot代码部分

首先是pom依赖,可以添加这个 <packaging>jar</packaging>,不添加也没事,默认就是打jar包。

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
    </build>

下面分别是核心配置文件、实体类、mapper接口/映射文件、servicecontroller

server.port=8001
server.servlet.context-path=/springboot-docker
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.40.130:3306/db01?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=12345678
package com.szh.springboot.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
 *
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo implements Serializable {
    private static final long serialVersionUID = -791207650334505838L;
    private Integer id;
    private String name;
    private Integer age;
}
package com.szh.springboot.mapper;
import com.szh.springboot.domain.UserInfo;
import org.apache.ibatis.annotations.Param;
/**
 *
 */
public interface UserInfoMapper {
    UserInfo selectByPrimaryKey(@Param("id") Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.szh.springboot.mapper.UserInfoMapper">
    <!-- 使用insert、update、delete、select标签编写sql语句 -->
    <resultMap id="BaseResultMap" type="com.szh.springboot.domain.UserInfo">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, name, age
    </sql>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap">
        select <include refid="Base_Column_List"/>
        from userinfo
        where id=#{id}
    </select>
</mapper>
package com.szh.springboot.service;
import com.szh.springboot.domain.UserInfo;
/**
 *
 */
public interface UserInfoService {
    UserInfo queryByPrimaryKey(Integer id);
}
package com.szh.springboot.service.impl;
import com.szh.springboot.domain.UserInfo;
import com.szh.springboot.mapper.UserInfoMapper;
import com.szh.springboot.service.UserInfoService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 *
 */
@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Resource
    private UserInfoMapper userInfoMapper;
    @Override
    public UserInfo queryByPrimaryKey(Integer id) {
        return userInfoMapper.selectByPrimaryKey(id);
    }
}
package com.szh.springboot.controller;
import com.szh.springboot.service.UserInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
 *
 */
@RestController
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;
    @GetMapping(value = "/queryUser/{id}")
    public Object queryUser(@PathVariable("id") Integer id) {
        System.out.println("SpringBoot项目打jar包部署Docker成功!!!");
        return userInfoService.queryByPrimaryKey(id);
    }
}

以上就是SpringBoot项目的全部后端代码,因为这里的数据库我采用的是:dockermysql镜像运行生产的容器实例,所以,要想测试,这里首先将docker服务启动、mysql镜像启动。


2.2 Docker实操部分


上面我已经将mysql镜像启动,对应的mysql容器实例也已经跑起来了,之后我使用Navicat工具连接上docker中的mysql,同时完成建库、建表等操作。


此时我们的mysql启动了,数据也添加了,可以先启动一下这个SpringBoot项目,看看运行能否成功,见下图:👇👇👇

成功之后,我们进行打包操作。


maven打包操作,这里直接package就不再多说了。


打包完成之后,我在根目录下创建了一个springboot-for-docker 目录,专门存放打包后的jar包以及Dockerfile文件。

rz命令直接将打好的jar包上传到linux,然后编写Dockerfile


我们这里打包是jar,所以基础镜像肯定是 jdk;如果是war包,则基础镜像就是tomcatADD这里将该jar包复制并且构建、同时重命名为 app.jar;对外暴露的端口号对应application.properties核心配置文件中的 server.port;最后的ENTRYPOINTCMD表示容器启动时需要运行的命令。


Dockerfile文件编写完成,下面就是docker build以该文件为基础构建新的镜像。因为当前构建的目录就是Dockerfile所在的目录,所以命令中的 -f Dockerfile 可以省略,-t 表示新构建镜像的名称,最后的. 表示当前目录。

构建完成,docker images即可查看。


最后一步docker run运行,这里docker映射该springboot项目的端口号为8001-d 这里后台启动。

启动完成,docker ps 可以看到当前正在运行的容器实例,一个是前面提到的mysql,另一个是springboot项目。


此时就可以到浏览器中访问,这里不再是localhost,而是虚拟机的ip


访问一次之后,可以使用 docker logs -f 查看指定容器的日志信息,在其中能够看到这里打印出了 controller 请求中System.out.println的那句话。


至此,使用Dockerfile构建SpringBoot项目(打包 + 部署 + 运行)就全部完成了!!!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
27天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
32 5
|
27天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
60 4
|
26天前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
30 2
|
1月前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
43 3
|
1月前
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
50 0
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
52 0
|
18天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
161 77
|
5天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
22 4