六、部署SpringBoot应用

1、Dockerfile

(1)Dockerfile概念

Dockerfile是一个文本文件,其中包含一条条的指令。

基于基础镜像,每条指令构建一层镜像,最终使用docker build构建一个新的镜像。

使用Dockerfile可以统一开发、测试和运维的环境,避免因为环境不同而产生的问题。

对于开发人员:可以为开发团队提供一个完全一致的开发环境。

对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。

对于运维人员:在部署时,可以实现应用的无缝移植。

(2)Dockerfile指令

Dockerfile支持一系列指令,一些用于构建镜像,另一些用于从镜像中运行容器。

关键字

作用

备注

FROM

指定父镜像

基于那个镜像构建新镜像

MAINTAINER

作者信息

镜像维护者信息

LABEL

标签

可以使用Label代替Maintainer,用法更加灵活

RUN

执行命令

构建镜像时运行的Shell命令。默认是/bin/sh格式:

RUN command

或者

RUN ["command" , "param1","param2"]

CMD

容器启动命令

基于本镜像运行容器时执行的默认命令。如果有多个CMD指令,则最后一个生效。格式:

CMD command param1 param2

或者

CMD ["command" , "param1","param2"]

ENTRYPOINT

入口

基于本镜像运行容器时执行。可单独使用,也可与CMD配合使用。如果有多个CMD指令,则ENTRYPOINT最后一个生效。

一般在制作执行就关闭的容器中使用

COPY

复制文件

构建镜像的时候复制文件到本镜像中

ADD

添加文件

构建镜像的时候添加文件到本镜像中。并不局限于当前构建上下文,也可以来源于远程服务

ENV

环境变量

指定构建时候的环境变量,格式ENV name=value。可以在启动的容器的时候通过-e覆盖。

ARG

构建参数

构建参数。只在构建镜像的时候使用。如果有ENV,那么ENV的相同名字的值始终覆盖arg的参数

VOLUME

定义外部可以挂载的数据卷

指定构建镜像中的挂载点,使容器中的一个目录具有持久化存储数据的功能。启动容器的时候使用 -v 绑定。格式 VOLUME ["目录"]

EXPOSE

暴露端口

定义容器运行的服务端口。

格式:EXPOSE 8080 或者 EXPOSE 8080/udp

启动容器时使用-p来绑定到宿主机的端口。

WORKDIR

工作目录

RUNCMDENTRYPOINTCOPYADD设置工作目录。

指定容器内部的工作目录。如果没有创建则自动创建;如果指定 / 使用的是绝对地址;如果不是/开头就是在上一条workdir路径的相对路径

USER

指定执行用户

指定构建时RUN、CMD、ENTRYPONT的执行用户

HEALTHCHECK

健康检查

指定监测当前容器的健康监测的命令。基本上没用,因为很多时候应用本身有健康监测机制

ONBUILD

触发器

当存在ONBUILD关键字的镜像作为基础镜像的时候。当执行FROM完成之后,会执行ONBUILD的命令,但是不影响当前镜像,用处也不怎么大

STOPSIGNAL

发送信号量到宿主机

该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出

SHELL

指定执行脚本的shell

指定RUN、CMD、ENTRYPOINT执行命令时使用的shell

3)基础镜像的选择

Docker镜像是基于基础镜像来构建的,选择的基础镜像越高级,我们要做的底层工作就越少。比如,如果构建一个Java应用的镜像,选择一个openjdk的镜像作为基础镜像比选择一个alpine镜像作为基础镜像要简单地多。

(4)使用Dockerfile来自定义镜像

在项目的根目录(pom文件的同一级)下创建Dockerfile文件,说明如何构建镜像。

FROM java:8

EXPOSE 8080

ARG JAR_FILE

ADD target/${JAR_FILE} /app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

2、使用spring-boot-maven-plugin部署

(1)build-image命令

完成应用开发后,通常使用maven打包成jar文件,然后使用docker将jar文件构建成一个镜像(docker image),就可以在docker daemon中创建基于镜像的容器并提供服务了。

Spring Boot 2.4推出了自己的docker构建工具,整合在原有的spring-boot-maven-plugin中,只需要配置对应目标仓库和主机信息即可完成镜像构建。

这种方式支持下图中在开发机器没有安装Docker的情形下,通过192.168.0.10的Docker Remote API完成镜像构建并发布到192.168.0.20的镜像仓库。

另外,本插件提供了SpringBoot应用构建镜像的配置文件,无需自己编写Dockerfile镜像构建过程,从而直接自动构建应用的镜像。

(2)配置spring-boot-maven-plugin

<project>

  <modelVersion>4.0.0</modelVersion>

  <parent>

    <artifactId>climb-edu</artifactId>

    <groupId>com.climbcloud.edu</groupId>

    <version>1.0-SNAPSHOT</version>

  </parent>

  <artifactId>climb-edu-service</artifactId>

  <version>1.0-SNAPSHOT</version>

  <dependencies>

  </dependencies>

  <build>

    <plugins>

      <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-resources-plugin</artifactId>

        <configuration>

          <nonFilteredFileExtensions>

            <nonFilteredFileExtension>p12</nonFilteredFileExtension>

            <nonFilteredFileExtension>jks</nonFilteredFileExtension>

          </nonFilteredFileExtensions>

        </configuration>

      </plugin>

      <plugin>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-maven-plugin</artifactId>

        <configuration>

          <image>

            <!-- 生成镜像名称 -->

            <name>climbcloud/${project.artifactId}</name>

            <!-- 执行完build后自动push -->

            <publish>false</publish>

          </image>

          <!--配置构建宿主机信息,本机不用配置-->

          <docker>

            <host>http://192.168.0.106:2375</host>

            <tlsVerify>false</tlsVerify>

          </docker>

        </configuration>

      </plugin>

    </plugins>

  </build>

</project>

(3)生成镜像

1、在生成镜像之前,在父项目中使用Maven的install命令将所有项目都安装到本地仓库中,生成镜像时会从本地仓库或远程仓库中获取依赖。

2、使用mvn spring-boot:build-image命令构建镜像。

注意:镜像构建过程中很多依赖会从Github上下载约100M,网络不好的情况下会下载失败,多试几次就好了。

[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ climb-edu-service ---

[INFO] Building jar: C:\Java\vc_course_project\climb-edu\climb-edu-service\target\climb-edu-service.jar

[INFO]

[INFO] --- spring-boot-maven-plugin:2.5.1:repackage (repackage) @ climb-edu-service ---

[INFO] Replacing main artifact with repackaged archive

[INFO]

[INFO] --- spring-boot-maven-plugin:2.5.1:repackage (default) @ climb-edu-service ---

[INFO] Replacing main artifact with repackaged archive

[INFO]

[INFO] <<< spring-boot-maven-plugin:2.5.1:build-image (default-cli) < package @ climb-edu-service <<<

[INFO]

[INFO] --- spring-boot-maven-plugin:2.5.1:build-image (default-cli) @ climb-edu-service ---

[INFO] Building image 'docker.io/climbcloud/climb-edu-service:latest'

[INFO]

[INFO]  > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 0%

[INFO]  > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 100%

[INFO]  > Pulled builder image 'paketobuildpacks/builder@sha256:870e606466683750ac34ce45b33d4096ece06cf9489cc3b4c2f3fcd94da8a4d2'

[INFO]  > Pulling run image 'docker.io/paketobuildpacks/run:base-cnb' 100%

[INFO]  > Pulled run image 'paketobuildpacks/run@sha256:8d05ba1977ffef1e1499667d8e468fc60ebf1cc77d4df4c97aa10dd350c3b76f'

[INFO]  > Executing lifecycle version v0.11.3

[INFO]  > Using build cache volume 'pack-cache-ad2993bff3f1.build'

[INFO]

[INFO]  > Running creator

[INFO]     [creator]     ===> DETECTING

[INFO]     [creator]     ===> ANALYZING

[INFO]     [creator]     ===> RESTORING

[INFO]     [creator]     ===> BUILDING

[INFO]

[INFO] Successfully built image 'docker.io/climbcloud/climb-edu-service:latest'

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

3、在Docker环境中可以查看生成的镜像。

docker images

4、启动SpringBoot应用:

创建容器:

docker create \

    --name=climb-edu-service \

    -p 8080:8080 \

    -v /etc/localtime:/etc/localtime:ro \

    --restart=always \

    climbcloud/climb-edu-service:latest

启动容器:

docker start climb-edu-service

5、测试登录操作

如果容器不能被访问,查看可知SpringBoot对内存有要求,至少要分配3G给宿主机。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值