Spring Boot demo系列(五):Docker部署
2021.2.24 更新
1 概述
本文讲述了如何使用Docker部署Spring Boot应用,首先介绍了Docker的安装过程,接着介绍了Docker的一些基础知识,最后讲述了Dockerfile的编写以及部署过程。
2 环境
- 服务器:
aarch64 CentOS8 JDK:OpenJDK 11Docker:19.03.9
3 Docker安装
(已安装了Docker可以跳过该部分)
由于大部分的教程都是针对x86架构的服务器的,这里笔者的服务器为aarch64架构,因此记录一下Docker的安装过程。
Docker安装方法主要有两种,一种是通过官网的脚本自动安装,一种是通过yum手动安装。
3.1 自动安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
或
curl -sSL https://get.daocloud.io/docker | sh
默认安装的是最新版本的,x86的一般都可以,但如果出现像笔者这样的错误:

表明containerd.io的版本过低,使用yum install containerd.io安装的话:

可以看到是1.2.0版本,并不符合安装的最低要求,解决这种问题有两个办法:
- 手动下载
rpm包安装 - 安装没那么新版本的
Docker
因此采用手动安装的方法,这里选择的是第一种方法,手动下载rpm包进行安装。
3.2 手动安装
3.2.1 下载rpm包
可以戳这里下载rpm包:

选择好版本即可,笔者选择的是:
containerd.io-1.2.13-3.2.el7.aarch64.rpmdocker-ce-19.03.9-3.el7.aarch64.rpmdocker-ce-cli-19.03.9-3.el7.aarch64.rpm
3.2.2 安装
上传到服务器后,安装即可:
yum install \
containerd.io-1.2.13-3.2.el7.aarch64.rpm \
docker-ce-19.03.9-3.el7.aarch64.rpm \
docker-ce-cli-19.03.9-3.el7.aarch64.rpm \
-y
3.3 测试
先开启服务:
systemctl start docker
版本查看:
docker version

运行Hello World:
docker run hello-world

4 打包
新建一个Demo工程,启动类如下:
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/test")
public String test()
{
return "success";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
接着使用Maven/Gradle打成JAR包:


5 Dockerfile
5.1 关于Dockerfile
Dockerfile是一个用于组合镜像的文本文件,Docker通过读取Dockerfile的内容自动生成镜像,一般分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动指令
更多的内容请参考其他博客或者官网,下面给出一个Demo。
5.2 Dockerfile示例
本Demo采用的Dockerfile如下:
FROM adoptopenjdk/openjdk11:aarch64-centos-jdk-11.0.8_10
MAINTAINER XXXXX <XXX@XXX.com>
VOLUME /tmp
EXPOSE 8080
ADD demo.jar demo.jar
ENTRYPOINT ["java","-jar","demo.jar"]
下面逐行进行详细说明。
5.2.1 指定基础镜像
FROM adoptopenjdk/openjdk11:aarch64-centos-jdk-11.0.8_10
该命令指定基础镜像,adopt的aarch64架构的JDK11,注意如果服务器架构为x86需要对应修改,具体可以戳这里查看:

5.2.2 维护者
MAINTAINER XXXXX <XXX@XXX.com>
该命令指定了维护者的信息,可以只写名字或者只写邮箱,组合的话需要加上<>。
5.2.3 持久化目录
VOLUME /tmp
该命令指定了持久化目录,准确来说,volume是卷的意思,这是指定卷的位置,一般来说如果需要数据持久化则需要数据卷。
5.2.4 暴露端口
EXPOSE 8080
该命令暴露的是8080端口,因为Spring Boot应用默认运行在8080上,如果修改了application.yaml或者application.properties请对应修改端口。
5.2.5 添加命令
ADD demo.jar demo.jar
将本地文件添加到容器中,tar类型文件会自动解压,这里是将demo.jar添加
5.2.6 运行容器
ENTRYPOINT ["java","-jar","demo.jar"]
该命令用于配置容器的运行命令。
6 制作镜像
6.1 基本操作
先说一下容器的基本操作:
docker run:创建一个新容器并运行docker start/stop/restart:启动/停止/重启容器docker rm:删除容器docker create:创建容器但不启动docker ps:列出容器
镜像基本操作:
docker build:创建镜像docker rmi:删除镜像docker images:列出镜像
这里简单说一下镜像和容器的区别:
- 镜像相当于一个模板,可以从一个镜像创建出多个容器
- 用面向对象的思想比如,就是,镜像相当于一个类,而容器相当于一个类实例,也就是对象
知道了一些基础命令后就可以来制作镜像了。
6.2 创建镜像
上传Dockerfile以及JAR包,新建一个目录把JAR以及Dockerfile放在同一个文件夹下,并进入该文件夹,接着创建镜像:
build build -t demo .
创建完成后可以查看镜像:
docker images
6.3 运行
docker run -d -p 8888:8080 demo
该命令表示从镜像demo创建一个容器并运行,将8080端口映射到8888端口上,主要防火墙需要开启8888端口,服务器记得配置安全组。
6.4 测试
直接输入ip:端口/test即可访问:

7 源码
Java版:
Kotlin版:
Spring Boot demo系列(五):Docker部署的更多相关文章
- Spring Boot demo系列(二):简单三层架构Web应用
2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...
- Spring Boot demo系列(九):Jasypt
2021.2.24 更新 1 概述 Jasypt是一个加密库,Github上有一个集成了Jasypt的Spring Boot库,叫jasypt-spring-boot,本文演示了如何使用该库对配置文件 ...
- Spring Boot demo系列(六):HTTPS
2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...
- Spring Boot demo系列(十):Redis缓存
1 概述 本文演示了如何在Spring Boot中将Redis作为缓存使用,具体的内容包括: 环境搭建 项目搭建 测试 2 环境 Redis MySQL MyBatis Plus 3 Redis安装 ...
- Spring Boot demo系列(四):Spring Web+Validation
2021.2.24 更新 1 概述 本文主要讲述了如何使用Hibernate Validator以及@Valid/@Validate注解. 2 校验 对于一个普通的Spring Boot应用,经常可以 ...
- Spring Boot demo系列(一):Hello World
2021.2.24 更新 1 新建工程 打开IDEA选择新建工程并选择Spring Initializer: 可以在Project JDK处选择JDK版本,下一步是选择包名,语言,构建工具以及打包工具 ...
- Spring Boot demo系列(三):Spring Web+MyBatis Plus
2021.2.24 更新 1 概述 Spring Web+MyBatis Plus的一个Demo,内容和上一篇类似,因此重点放在MyBatis Plus这里. 2 dao层 MyBatis Plus相 ...
- Spring Boot demo系列(八):Swagger
2021.2.24 更新 1 概述 Swagger主要用于生成API文档,本文演示了如何使用目前最新的OpenAPI3以及Swagger来进行接口文档的生成. 2 依赖 <dependency& ...
- Spring Boot干货系列:(五)开发Web应用JSP篇
Spring Boot干货系列:(五)开发Web应用JSP篇 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 上一篇介绍了Spring Boot中使用Thymeleaf模板引擎,今天 ...
随机推荐
- 微服务学习.net5+consul
趁着刚过完年,还没有开始做业务的时候,学习下consul 概念自己去官网看,这里只讲下具体实现 官网下载https://www.consul.io/downloads 我下载的是Windows版本 启 ...
- Linux+Tomcat+Jdk1.8+jenkins环境搭建
1.下载jdk的rpm安装包,这里以jdk-8u191-linux-x64.rpm为例进行说明 下载地址:https://www.oracle.com/technetwork/java/javase/ ...
- 谈一下hashMap中put是如何实现的?
源码: Hash(key):计算出key的hash值. put方法详解: 1.如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组.数组的长度为 ...
- SpringCloud(四):服务注册中心Eureka Eureka高可用集群搭建 Eureka自我保护机制
第四章:服务注册中心 Eureka 4-1. Eureka 注册中心高可用集群概述在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性 问题,不能有单点故障,由于注册中心 eurek ...
- React源码 commit阶段详解
转: React源码 commit阶段详解 点击进入React源码调试仓库. 当render阶段完成后,意味着在内存中构建的workInProgress树所有更新工作已经完成,这包括树中fiber节点 ...
- 剑指 Offer 55 - II. 平衡二叉树 + 平衡二叉树(AVL)的判断
剑指 Offer 55 - II. 平衡二叉树 Offer_55_2 题目描述 方法一:使用后序遍历+边遍历边判断 package com.walegarrett.offer; /** * @Auth ...
- 2020年12月-第02阶段-前端基础-Day06
CSS Day06 定位(position) 理解 能说出为什么要用定位 能说出定位的4种分类 能说出四种定位的各自特点 能说出我们为什么常用子绝父相布局 应用 能写出淘宝轮播图布局 1. CSS 布 ...
- python爬取考研专业信息
伴随着2021考研成绩的公布,2021考研国家线也即将到来.大家是否有过考研的想法了?如果想考研我们就需要了解很多的信息,但是百度的上有太多信息需要我们去一一的鉴别,是比较浪费时间的.所以我们可以学习 ...
- 【数据结构与算法】——链表(Linked List)
链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下: 链表是以节点的方式来存储的,是链式存储. 每个节点包含data域,next域:指向下一个节点. 如图:链表的各个节点不 ...
- 【关系抽取-R-BERT】加载数据集
认识数据集 Component-Whole(e2,e1) The system as described above has its greatest application in an arraye ...