大家好,今天我们来聊聊如何用Java开发一个简单的Web应用,并将其通过Docker容器化,最后部署到Kubernetes集群中。
首先,我们来简单介绍一下Docker和Kubernetes。
一 、 概念
Docker
Docker 相信这个大家并陌生, Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。Docker让程序环境独立或复制对于开发、运维人员来说非常的友好。
Kubernetes
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。Kubernetes可以帮助你管理多个容器,确保它们在集群中的高可用性和负载均衡。
第二、部署
简介绍下Kubernetes部署,以下是部署 k8s 的一些方式
比如kubeadm 是 Kubernetes 官方提供的一个工具,用于在 Linux 系统上快速设置和管理 Kubernetes 集群的初始化过程。与 Kind、Minikube不同,kubeadm 用于在生产环境中部署多节点的 Kubernetes 集群,而不仅仅是单节点的本地开发环境。
第三、实战
在介绍完Docker和Kubernetes基本概念后我们来上手实操一下,
3.1 Java开发Web应用
创建Spring Boot项目
使用Spring Initializr创建一个Spring Boot项目,选择以下依赖:
- Spring Web
- MyBatis-Plus
- PostgreSQL
创建完成后,你会得到一个基本的Spring Boot项目结构。
编写代码
1. 创建实体类
在src/main/java/com/hanko/user/entity目录下创建User.java文件:
package com.hanko.user.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@Data
public class User {
private Long id;
private String name;
}
2. 创建Dao层
在src/main/java/com/hanko/user/dao目录下创建UserMapper.java文件:
package com.hanko.user.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hanko.user.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
3. 创建Service层
在src/main/java/com/hanko/user/service目录下创建UserService.java文件:
package com.hanko.user.service;
import com.hanko.user.entity.User;
public interface UserService {
User getUserById(Long id);
}
4. 创建ServiceImpl层
在src/main/java/com/hanko/user/service/impl目录下创建UserServiceImpl.java文件:
package com.hanko.user.service.impl;
import com.hanko.user.dao.UserMapper;
import com.hanko.user.entity.User;
import com.hanko.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
5. 修改Controller层
在src/main/java/com/hanko/user/controller目录下修改HelloController.java文件,增加用户信息查询的接口:
package com.hanko.user.controller;
import com.hanko.user.entity.User;
import com.hanko.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
6. 配置数据库
在src/main/resources目录下,修改application.properties文件,配置PostgreSQL数据库:
spring.datasource.url=jdbc:postgresql://localhost:5432/xx
spring.datasource.username=xx
spring.datasource.password=xx
spring.datasource.driver-class-name=org.postgresql.Driver
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.hanko.user.entity
7. 创建数据库表
在PostgreSQL数据库中创建users表:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
8. 运行应用
在项目根目录下运行以下命令来启动应用:
mvn spring-boot:run
打开浏览器,访问http://localhost:8080/user/1,你应该能看到用户信息的输出。
3.2 容器化应用
编写Dockerfile
在项目根目录下创建一个名为Dockerfile的文件,内容如下:
# 使用官方的Java镜像作为基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /app
# 将构建好的JAR文件复制到容器中
COPY target/user-app.jar /user-app/user-app.jar
# 暴露8080端口
EXPOSE 8080
# 运行应用
CMD ["java", "-jar", "user-app.jar"]
构建Docker镜像
在项目根目录下运行以下命令来构建Docker镜像:
docker build -t hanko/user-app:latest .
运行Docker容器
构建完成后,你可以运行以下命令来启动容器:
docker run -p 8080:8080 hanko/user-app:latest
再次访问http://localhost:8080/user/1,你应该能看到相同的输出。
3.3 部署到Kubernetes
创建Kubernetes部署文件
在项目根目录下创建一个名为deployment.yaml的文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-kubernetes
spec:
replicas: 3
selector:
matchLabels:
app: user-kubernetes
template:
metadata:
labels:
app: user-kubernetes
spec:
containers:
- name: user-kubernetes
image: hanko/user-app:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: user-kubernetes-service
spec:
selector:
app: user-kubernetes
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
部署到Kubernetes
在项目根目录下运行以下命令来部署应用:
kubectl apply -f deployment.yaml
访问应用
部署完成后,你可以通过Kubernetes的Service来访问应用。运行以下命令来获取Service的IP地址:
kubectl get services
在浏览器中访问http://ip/user/1,你应该能看到相同的输出。
当然如果你不想使用命令行,也可以考虑使用图形界面来部署
配置部署:包含应用名称、容器镒、pod数量、Service非常的方便,不想设置配置yaml的可以很方便的部署。
点击部署就成功了k8s应用的部署了。部署后可以看到相应的deployment、pod、service等状态和信息。
- Deployment
- Pod
- Service
3.4 Tapd进行DevOps持续交付
配置Tapd
- 创建Tapd项目:在Tapd中创建一个新的项目。
- 集成代码仓库:将GitHub仓库与Tapd项目集成。
- 配置CI/CD流水线:在Tapd中配置CI/CD流水线,定义构建、测试和部署的步骤。
配置CI/CD流水线
在Tapd中配置CI/CD流水线,定义以下步骤:
- 代码拉取:从GitHub仓库拉取代码。
- 构建项目:使用Maven构建项目。
- 构建Docker镜像:使用Docker构建镜像并推送到Docker Hub。
- 部署到Kubernetes:使用
kubectl将应用部署到Kubernetes集群。
栈江湖 正在“豆包MarsCode AI 红人创造营”中借助 AI 工具创作精彩内容,请帮TA投上一票吧! www.marscode.cn/events/2024…