Spring Boot + Docker + K8S 简单示例
前言
最近看了看kubernetes(k8s),感觉用这个管理docker确实比自己写一坨脚本进步太多了,简直不是一个次原的东西。
看着k8s的官方文档随手写了个小Demo,一个基于k8s的spring boot服务。
代码:https://github.com/csonezp/echo-service
前置条件
电脑已安装docker/k8s/jdk
建议安装Docker Desktop,并启用自带k8s。
https://docs.docker.com/docker-for-mac/install/
https://github.com/gotok8s/k8s-docker-desktop-for-mac
上面是Mac的安装方法,linux可以在链接里找到。
项目结构

根本上还是一个spring boot项目,只是添加了一些docker/k8s的配置文件,和一些编译、运行脚本。
Spring Boot服务构建
这就是一个最简单的spring boot服务,主要代码:
/**
* @author : zhangpeng
* @date : 2019/12/27 14:57
*/
@RestController
public class EchoController { @GetMapping("/echo")
public String echo(@RequestParam(required = false,defaultValue = "Hello World!") String data){
return data;
}
}
就提供一个rest接口用来表示服务已经启动了。
为了适配docker,pom文件做了一些修改:
<build>
<finalName>echo-service</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
标红的这一行,让spring boot打出来的jar包里不带版本号。实际上在生产中是不应该这样做的,这里就是为了简单方便。
Docker镜像构建
为了运行spring boot程序,我们需要一个带Java环境的基础镜像。
FROM centos:centos7
MAINTAINER "Zhang Peng <csonezp@gmail.com>"
LABEL description="Base Image Java 8" RUN yum -y install java-1.8.0-openjdk && mkdir /app
然后执行一下:
docker build -f centos7-openjdk8.Dockerfile -t openjdk8:v1 .
打出一个名为 openjdk8:v1的镜像。
这个Dockerfile意思就是镜像基于centos7,一开始会执行一下jdk的安装,并创建一个/app的目录供我们以后使用。
基础镜像有了,现在就要制作我们的服务镜像了
FROM openjdk8:v1
MAINTAINER "Zhang Peng <csonezp@gmail.com>"
LABEL description="Spring Boot Image"
WORKDIR /app
COPY target/echo-service.jar /app/app.jar
EXPOSE 8080
CMD java -jar /app/app.jar
docker build -f Dockerfile -t echo-service:0.0.1 .
这个Dockerfile会基于openjdk8:v1这个镜像构建,主要做的操作就是将我们spring boot打出来的jar包:echo-service.jar复制到/app/app.jar,然后再执行这个jar包。
k8s配置
docker镜像准备完毕,下面要编写一个k8s的配置文件,来告诉k8s该如何运行和管理我们的服务了。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: echo-service
spec:
replicas: 2 # tells deployment to run 2 pods matching the template
template: # create pods using pod definition in this template
metadata:
labels:
app: echo-service
spec:
containers:
- name: echo-service
image: echo-service:0.0.1
ports:
- containerPort: 8080
Deployment是k8s的一种常用控制器(点我),可以告诉k8s如何运行你的服务。
这个文件的意思就是会有一个服务,有两个分片,名字叫echo-service,使用的镜像是echo-service:0.0.1,会对外暴露8080的接口提供服务。
脚本部分
build-img.sh
#!/bin/bash
mvn package -Dmaven.test.skip=true
docker build -f centos7-openjdk8.Dockerfile -t openjdk8:v1 .
docker build -f Dockerfile -t echo-service:0.0. .
首先对spring boot项目进行打包,这时会在./target目录下生成echo-service.jar;
然后根据centos7-openjdk8.Dockerfile 来构建openjdk8:v1这个基础镜像;
最后构建echo-service:0.0.1镜像。
run.sh
kubectl create -f k8s.yaml
kubectl expose deployment echo-service --type="LoadBalancer"
1、创建k8s的pods;
2、将Deployment对外暴露
运行
进入项目根目录,先执行:
sh build-img.sh

再执行:
sh run.sh

此时服务已经正常启动。
浏览器访问:http://localhost:8080/echo

服务启动成功。
Spring Boot + Docker + K8S 简单示例的更多相关文章
- spring boot 结合jsp简单示例
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统
一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...
- Spring Boot Docker 实战
Spring Boot Docker 开发环境 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_192 maven: ...
- Spring Boot Ftp Client 客户端示例支持断点续传
本章介绍 Spring Boot 整合 Ftpclient 的示例,支持断点续传 本项目源码下载 1 新建 Spring Boot Maven 示例工程项目 注意:是用来 IDEA 开发工具 File ...
- SpringCloud微服务实战——搭建企业级开发框架(四十四):【微服务监控告警实现方式一】使用Actuator + Spring Boot Admin实现简单的微服务监控告警系统
业务系统正常运行的稳定性十分重要,作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件. spring-b ...
- Spring Boot 系列 - WebSocket 简单使用
在实现消息推送的项目中往往需要WebSocket,以下简单讲解在Spring boot 中使用 WebSocket. 1.pom.xml 中引入 spring-boot-starter-websock ...
- spring boot docker 初尝试
Docker服务中进程间通信通过/var/run/docker.sock实现,默认服务不提供监听端口,因此使用docker remote api 需要手动绑定端口. 在centos7.2下,可以进行这 ...
- Spring Boot的Servlet简单使用
当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet.Filter和Servlet规范的所有监听器(如HttpSessionListener监听器). Spri ...
- 对Spring Boot 及Mybatis简单应用
因为没有系统的学习过SpringBoot,在对照一个别人的SpringBoot项目,进行简单的搭建及使用. 1.首先创建SpringBoot项目之后,这里会有默认的启动类,基本不需要配置,在类的上边有 ...
随机推荐
- shell学习(15)- eval及shell No such file or directory解决办法
eval可以读取一连串的参数,然后按照参数特性来执行.参数数目不限,彼此之间用分号隔开. eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接 ...
- 【NS2】ns2 otcl与c++关联(转载)
最近几天,对ns2进行研究,ns2为什么要使用两种语言,因为C++执行速度快,因此对于一些不需要经常改变的东西:例如包的发送.而对于需要经常进行修改的就不能够使用C++,而使用OTcl脚本语言.所有O ...
- 2019-2-27-如何替换一个-exe-的图标
title author date CreateTime categories 如何替换一个 exe 的图标 lindexi 2019-02-27 20:33:16 +0800 2019-2-27 2 ...
- Python基础:06条件和循环
1:条件表达式(三元操作符) Python 在很长的一段时间里没有条件表达式(C ? X : Y), 或称三元运算符.人们试着用 and 和 or 来模拟它, 但大多都是错误的. 根据 FAQ , 正 ...
- LeetCode58 Length of Last Word
题目: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return t ...
- hihocoder1994 树与落叶 DFS+前缀和+二分
DFS找到节点删除的时间,删除的时间其实就是子树的最长链,然后给每个点打一个时间戳,然后求每个时间点对应删除的节点的个数,对于1-max_time时间戳求一个前缀和,然后二分找到和m距离最近的那一天 ...
- HZOJ 旋转子段
作者的正解: 算法一:对于30%的数据: 直接枚举区间直接模拟,时间复杂度O(N3). 算法二:对于60%的数据:枚举旋转中心点,然后再枚举旋转的端点, 我们可以用O(n)的预处理求前缀和记录固定点, ...
- 首次揭秘:阿里巴巴中间件在 Serverless 技术领域的探索
Serverless 话题涉及范围极广,几乎包含了代码管理.测试.发布.运维和扩容等与应用生命周期关联的所有环节.AWS Lambda 是 Serverless 领域的标志性产品,但如果将其应用于核心 ...
- oracle使用TKPROF 工具来查询SQL性能状态
SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统. 设置S ...
- 【Activiti工作流引擎】官方快速入门demo
Activiti官方快速入门demo 地址: https://www.activiti.org/quick-start 0. 版本 activiti 5.22.0 JDK 1.8 1. 介绍 这个快速 ...