Docker 部署SpringBoot项目不香吗?

Stella981
• 阅读 356

  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为星标”!这样才不会错过每日进阶架构文章呀。

  Docker 部署SpringBoot项目不香吗?

  2020年Java原创面试题库连载中

  (共18篇)

  【032期】JavaEE面试题(四)Spring(2)

  toutiao.com/i6843391272229536267

  目录

  docker介绍

  安装docker

  Ubuntu安装docker

  CentOS安装docker

  通过脚本安装

  拉取java环境

  创建springboot项目

  打包springboot到docker

  docker查看容器的日志

  查看log4j2输出问文件日志

  Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  docker的核心思想是通过对应用的封装、分发、部署、运行生命周期进行管理,达到应用组件级别的“一次性封装,到处运行”。这里的应用组件,可以是一个web应用,也可以是一个环境,更可以是一个数据库等等。

  既然docker这么神奇,那我们如何安装docker呢?我们一起来走一下吧。

  Ubuntu安装docker

  由于本人的系统是CentOS,所以这里就只展示一下CentOS的安装方式,Ubuntu以及其他系统请自行百度。

  CentOS安装docker

  docker要求CentOS在7.0以后的版本,如果你的系统版本还在7.0以前,请先升级一下版本在进行安装,同时不支持32位的系统,内核版本至少3.10。

  请先确保没有安装过docker,否则有可能会导致安装失败,如果之前安装过,可以尝试直接yum isntall -y docker

  1.更新软件源第一个命令

  yum update

  遇到他输入y,然后回车,看到下面信息表示更新成功:

  Docker 部署SpringBoot项目不香吗?

  第二个命令

  yum install -y yum-utils device-mapper-persistent-data lvm2

  Docker 部署SpringBoot项目不香吗?

  2.添加docker稳定版本的yum软件源

  yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  3.再次更新yum源,并安装docker

  yum update

  Docker 部署SpringBoot项目不香吗?

  yum install -y docker-ce

  Docker 部署SpringBoot项目不香吗?

  看到这个页面,标识docker已经安装成功了。

  4.安装完成之后启动docker

  systemctl start docker

  5.重启

  systemctl restart docker

  6.停止

  systemctl stop docker

  7.开机自启动

  systemctl enable docker

  8.查看docker的状态

  systemctl status docker

  通过脚本安装

  除了上面的yum安装,还可以采用shell脚本安装,安装流程如下:

  curl -fsSL https://get.docker.com/ | sh

  或者

  wget -qO- https://get.docker.com/ | sh

  拉取jdk很简单,直接执行一行代码即可,我这里拉取的时java 8的版本。

  docker pull java:8

  拉取完成之后执行:

  docker images

  如果出现下面内容,表示拉取成功

  1.新建项目

  Docker 部署SpringBoot项目不香吗?

  引入sprint-boot-web的依赖

  Docker 部署SpringBoot项目不香吗?

  新建完成之后的项目结构

  Docker 部署SpringBoot项目不香吗?

  2.引入docker依赖

  `
registry.aliyuncs.com/linhuatestdocker.image.prefix>
properties>

`

  `
com.spotifygroupId>
docker-maven-pluginartifactId>
1.0.0version>
${docker.image.prefix}/${project.artifactId}imageName>

`

  **3.新建docker文件**在main目录下新建docker目录,然后在docker目录下创建dockerfile文件,不需要后缀名。

  ![](http://dingyue.ws.126.net/2020/0920/3b7d156aj00qgy5y0000od200eh00axg00eh00ax.jpg)

  创建完成之后的工程目录如下:

  ![](http://dingyue.ws.126.net/2020/0920/d7fea4a4j00qgy5y0000ad200cy008eg00cy008e.jpg)

  **4.编辑dockerfile文件**

  `` `FROM java:8
VOLUME /tmp/tomcat
ADD spring-boot-docker-0.0.1-SNAPSHOT.jar springboot-docker.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/springboot-docker.jar"]

` ``

FROM:指定存在的镜像,java:8是我刚刚拉取的镜像,运行的基础。VOLUME:指向的一个临时文件,用于存储tomcat工作。ADD:复制文件并且重命名文件。ENTRYPOINT:初始化配置或者自定义配置。

  5.创建测试接口

  TestController内容如下:

  package com.ymy.controller;

  `import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

`

  `@RestController
@Slf4j
public class TestController {

`

  `@RequestMapping(value = "/test",method = RequestMethod.GET)
public String test(){
System.out.println("这是控制台日志!");
log.info("这是输出到文件的日志");
return "HELLO-BUG!!!!!!!!!!";
}
}

`

  在resources目录下创建log4j2.xml文件主要看这两个参数:

  这里我使用了log4j2的日志,如何配置log4j2的日志,请参考 springboot整合Log4j2(将日志输出到指定文件)。

  6.编写application.yml配置文件

  server: port: 9999

  到这里springboot项目就创建完成了,我们现在启动一下项目。

  ``. ____ _ __ _ _
/\ / _' __ _ ()_ __ __ _ \ \ \ \ ( ( )__ | '_ | '| | ' / ` | \ \ \ \
\/ _)| |)| | | | | || (_| | ) ) ) )
' |
| .|| ||| |_, | / / / /
=========|
|==============|_/=//_//
:: Spring Boot :: (v2.2.5.RELEASE)

``

  `15:29:19.386 [main] INFO com.ymy.SpringBootDockerApplication - Starting SpringBootDockerApplication on LAPTOP-3GLHJRE9 with PID 20652 (D:\springboot\spring-boot-docker\target\classes started by admin in D:\springboot)
15:29:19.395 [main] INFO com.ymy.SpringBootDockerApplication - No active profile set, falling back to default profiles: default
15:29:20.183 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 9999 (http)
15:29:20.200 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-9999"]
15:29:20.201 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
15:29:20.201 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.31]
15:29:20.309 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
15:29:20.309 [main] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 881 ms
15:29:20.452 [main] INFO org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
15:29:20.568 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-9999"]
15:29:20.596 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 9999 (http) with context path ''
15:29:20.599 [main] INFO com.ymy.SpringBootDockerApplication - Started SpringBootDockerApplication in 1.664 seconds (JVM running for 4.04)

`

  如果看到这个页面表示springboot项目没有问题,现在我们将项目拷贝到服务器中。

  我现在已经将项目拷贝到服务器中,我们现在需要将它打包到docker中,借助maven实现打包,如果还没有安装maven的,请先安装maven,切换到项目的根目录

  Docker 部署SpringBoot项目不香吗?

  执行

  mvn clean package docker:build

  执行完之后将会看到

  Docker 部署SpringBoot项目不香吗?

  表示打包成功。

  执行

  docker images

  我们发现docker的镜像中多了一个springboot/spring-boot-docker,没错,这个就是我们的springboot项目,既然镜像已经生成,那么如何使用这个镜像呢?

  执行

  docker run --name springbooot-docker -p 9999:9999 -d 4a2

run:运行的意思–name:指定镜像启动的之后的名称-p:容器和外部的端口映射 第一个端口:外部 第二个端口:内部-d:后台运行 -t:实时运行,窗口关闭,程序结束。4a2:表示镜像的id(IMAGE ID)前3位,这里的id并不需要输入全称,只需要输入前几个就行,有一个前提:当有很多镜像的时候,前面几个字符就有可能会相同,这个时候就需要多输入几位,直到不相同位置。

  启动了镜像之后我怎么知道有没有成功呢?这个时候我们就需要一个命令来查看已经启动的任务

  docker ps

  我们发现这里已经出现了我们之前启动的镜像,所以这基本上代表启动成功了,为了验证是否启动成功,我们在浏览器输入测试的接口:ip:9999/test

  Docker 部署SpringBoot项目不香吗?

  这说明我们已经springboot项目已经启动成功了,到这里docker部署springboot项目差不就结束了,但是你可能还有一个疑问,如果我想看控制台的日志怎么办呢?像我们一般使用java -jar的时候都会生成一个控制台的日志文件,那docker容器中怎么查看控制台日志呢?其实很简单,只需要一行命令即可

  docker ps

  找到容器的id

  然后执行

  docker logs -f

  Docker 部署SpringBoot项目不香吗?

  这个时候我们就能看到控制台的日志了,如何我们想看log4j2输出的文件日志呢?

  还记得我们在log4j2中配置了日志的输出目录了吗?

  没错,就是这个, 我们切换到这个目下

  Docker 部署SpringBoot项目不香吗?

  发现这里生成了三个文件,我们打开info.log

  tail -100f info.log

  Docker 部署SpringBoot项目不香吗?

  我们发现并没有输入我们打印的:“这是输出到文件的日志”,难道是我们配置错了问题?不是的,是因为我们找错了位置,真正的文件日志在容器内部,所以我们需要先进入容器内部

  docker exec -it ca2cd59fff9b /bin/bash

ca2cd59fff9b:容器id

  然后再切换到我们日志的输出路径

  cd work/spring-boot-docker

  这里也找到了三个日志文件,我们打印info.log

  tail -100f info.log

  Docker 部署SpringBoot项目不香吗?

  这就是我们log4j2输出到文件的日志,到这里docker整合springboot项目就差不多结束了,如果想要退出docker容器可以使用

  之前,给大家发过三份Java面试宝典,这次新增了一份,目前总共是四份面试宝典,相信在跳槽前一个月按照面试宝典准备准备,基本没大问题。

  《java面试宝典5.0》(初中级)

  《350道Java面试题:整理自100+公司》(中高级)

  《资深java面试宝典-视频版》(资深)

  《Java[BAT]面试必备》(资深)

  分别适用于初中级,中高级资深****级工程师的面试复习。

  内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。

  获取方式:点“在看”,V信关注上述Java最全面试题库号并回复【面试】即可领取,更多精彩陆续奉上。

  看到这里,证明有所收获

  `src/main/dockerdockerDirectory>
/targetPath>
${project.build.directory}directory>
${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>

`

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue
helloworld_34035044 helloworld_34035044
5个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为