首页 > 其他分享 >Spring Boot 和 Docker 实现微服务部署

Spring Boot 和 Docker 实现微服务部署

时间:2023-04-28 17:35:29浏览次数:44  
标签:仓库 Spring boot Boot jar tag 镜像 Docker docker

Spring boot 开发轻巧的微服务提供了便利,Docker 的发展又极大的方便了微服务的部署。这篇文章介绍一下如果借助 maven 来快速的生成微服务的镜像以及快速启动服务。

其实将 Spring Boot 项目用 Docker 部署也不是什么多么神秘的技术,也要先生成镜像,再用镜像启动容器,如果说有什么方便的地方,也就是一些工具可以帮助我们节省手动操作的过程。

知识背景:

掌握 docker 的安装以及基本的操作,熟悉 Dockerfile 文件创建镜像的方法。

创建 Spring boot 项目

1、添加 application.yml 配置文件

server:
  port: 7000
spring:
  application:
    name: spring-boot-docker-sample

2、创建项目启动文件

@SpringBootApplication
public class Application {

    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }
}

3、添加一个 RestController 用于服务是否正常可用

@RestController
public class DockerController {

    @GetMapping(value = "hello")
    public Object sayHello(){
        return "hello! spring boot with docker.";
    }
}

之后启动服务,访问 localhost:7000/hello 查看,如果正常访问,则进入下一步操作。

利用 maven 插件生成镜像文件

我们这里用到的 Maven 插件是 dockerfile-maven-plugin

1、在 pom 文件中添加上述插件依赖

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.4.9</version>
    <executions>
        <execution>
            <id>tag-latest</id>
            <phase>deploy</phase>
            <goals>
                <goal>build</goal>
                <goal>tag</goal>
                <goal>push</goal>
            </goals>
            <configuration>
                <tag>latest</tag>
            </configuration>
        </execution>
        <execution>
            <id>tag-version</id>
            <phase>deploy</phase>
            <goals>
                <goal>build</goal>
                <goal>tag</goal>
                <goal>push</goal>
            </goals>
            <configuration>
                <tag>${project.version}</tag>
            </configuration>
        </execution>
    </executions>
    
</plugin>

2、这个 maven 插件是依赖于 Dockerfile 文件的,所以使用命令之前需要先手动创建 Dockerfile 文件,注意这个 Dockerfile 文件要和 pom.xml 文件同级,简单的 Dockerfile 内容如下:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/docker-sample-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

简单解释一下:

  • 先从中央仓库或者你配置的代理仓库(如阿里云镜像仓库)拉取 openjdk 镜像;
  • 然后设置一个挂载点;
  • 拷贝 target 目录下的 Spring boot 项目运行包,并改名为 app.jar;
  • 设置启动命令 java -jar app.jar

3、然后使用命令 sudo mvn package dockerfile:build 就可以生成镜像到本地仓库了,生成后的镜像如下:

Spring Boot 和 Docker 实现微服务部署_Docker

这一步翻译为 docker 命令的话就是下面两条:

docker build -t registry.cn-beijing.aliyuncs.com/fengzheng/kite:1.0-SNAPSHOT . 
docker build -t registry.cn-beijing.aliyuncs.com/fengzheng/kite:latest

4、之后根据生成的镜像,就可以以 docker 方式启动服务了

docker run -d -p 7000:7000 registry.cn-beijing.aliyuncs.com/fengzheng/kite:latest

将镜像推送到阿里云 docker 仓库

访问 https://dev.aliyun.com/search.html,然后随意输入一个镜像名称,例如 redis,如果你没有注册过,阿里云便会调到登录注册页,之后按照提示注册即可。

注册成功后,到镜像管理界面,会提示你输入镜像仓库服务的密码,也就是下方配置文件中的 Registry登录密码。

注册成功后,设置一个命名空间,并在命名空间下新建一个仓库。例如本例中我设置的命名空间是fengzheng,仓库名称为 kite

之后,在 pom.xml 文件中 plugin 节点增加如下配置:

<configuration>
        <username>阿里云账号名</username>
        <!--在容器镜像服务控制台"设置Registry登录密码"-->
        <password>Registry登录密码</password>
        <!--registry.cn-hangzhou.aliyuncs.com/namespace/repositoryname-->
        <repository>registry.cn-beijing.aliyuncs.com/fengzheng/kite</repository>
        <tag>latest</tag>
        <buildArgs>              
            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
</configuration>

设置好用户名和密码,仓库地址等参数,因为是私有仓库,所以需要用户名和密码。

然后运行命令,将以 latest${project.version} 为 tag 的镜像推送到阿里云镜像仓库。

sudo mvn dockerfile:push

或者,运行命令,发布某一个指定 tag 的镜像。

sudo mvn dockerfile:push@tag-version
或
sudo mvn dockerfile:push@tag-latest

最后,各位同学不妨到我的公众号里互动一下 : 古时的风筝 ,进入公众号可以加入交流群

Spring Boot 和 Docker 实现微服务部署_Docker_02

人生没有回头路,珍惜当下。



标签:仓库,Spring,boot,Boot,jar,tag,镜像,Docker,docker
From: https://blog.51cto.com/u_15717245/6235031

相关文章

  • Spring Cloud 系列之 Eureka 实现服务注册与发现
    如果你对SpringCloud体系还不是很了解,可以先读一下SpringCloud都有哪些模块Eureka是Netflix开源的服务注册发现组件,服务发现可以说是微服务架构的核心功能了,微服务部署之后,一定要有服务注册和发现的能力,Eureka就是担任这个角色的。如果你用过dubbo的话,那一定知道dubbo......
  • Spring 实现自定义 bean 的扩展
    Springmvc提供了扩展xml的机制,用来编写自定义的xmlbean,例如dubbo框架,就利用这个机制实现了好多的dubbobean,比如 <dubbo:application>、<dubbo:registry> 等等,只要安装这个标准的扩展方式实现配置即可。扩展自定义bean的意义何在假设我们要使用一个开源框架或者一套......
  • 你一直在用的 Spring Boot Starters 究竟是怎么回事
    SpringBoot对比SpringMVC最大的优点就是使用简单,约定大于配置。不会像之前用SpringMVC的时候,时不时被xml配置文件搞的晕头转向,冷不防还因为xml配置上的一点疏忽,导致整个项目莫名其妙的不可用,顿感生活无所依恋,简称生无可恋。这要归功于组成了SpringBoot的各种各样的......
  • Spring AOP 和 动态代理技术
     AOP是什么东西首先来说AOP并不是Spring框架的核心技术之一,AOP全称AspectOrientProgramming,即面向切面的编程。其要解决的问题就是在不改变源代码的情况下,实现对逻辑功能的修改。常用的场景包括记录日志、异常处理、性能监控、安全控制(例如拦截器)等,总结起来就是,凡是想对......
  • vscode下搭建springboot
    安装两个扩展JavaExtensionforPackSpringBootExtensionPack配置mavenctrl+,搜索java.configuration.maven输入setting.xml的路径注意路径不能有中文或者空格创建springboot项目ctrl+shift+p创建项目,输入springbootInitializer即可。参考博客vscode配置ma......
  • jeecgboot的jar分离打包部署
    因为jeecgboot单体应用打包的jar包太大了,得200M左右,每次更新后上传云服务器有点费劲,所以看了官网有分离打包部署的方法,但是按照官网的步骤啊,发现会出现问题,我现在把我最后成功的配置写下来,我的版本是jeecg-boot-2.4.6,如果其他版本就只能参考下了。主要是修改jeecg-boot-m......
  • Spring源码分析之BeanFactory
    概述以XmlBeanFactory为例分析Xml描述的Bean被Reasource加载到内存,先解析为Document对象,再解析为BeanDefinition注册到BeanDefinitionRegistry,再通过BeanFactory创建名词解释Resource是Spring对资源的抽象,主要是用来读取文件输入流Document是java本身的API进行解析的,得到......
  • 解决 ERROR:Docker Got permission denied while trying to connect to the Docker da
    解决ERROR:DockerGotpermissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix在终端执行"dockerversion"命令,出现如下报错:”GotpermissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Gethttp......
  • Spring XML配置的12个技巧
    Spring是一个强有力的java程序框架,其被广泛应用于java的程序中。它用POJO提供了企业级服务。Spring利用依赖注入可以获得简单而有效的测试能力。Springbeans,依赖关系,以及服务所需要的bean都将在配置文件中予以描述,配置文件一般采用XML格式。然而XML配置文件冗长而不易使用,在你进......
  • springcloud gateway filter 重写response
     importorg.reactivestreams.Publisher;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.cloud.gateway.filter.GatewayFilterChain;importorg.springframework.cloud.gateway.filter.GlobalFilter;importorg.springfram......