還在手動(dòng)啟動(dòng)SpringBoot項(xiàng)目?Docker部署不香嗎?

來(lái)源:toutiao.com/i6843391272229536267
docker介紹
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴(lài)包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
docker的核心思想是通過(guò)對(duì)應(yīng)用的封裝、分發(fā)、部署、運(yùn)行生命周期進(jìn)行管理,達(dá)到應(yīng)用組件級(jí)別的“一次性封裝,到處運(yùn)行”。這里的應(yīng)用組件,可以是一個(gè)web應(yīng)用,也可以是一個(gè)環(huán)境,更可以是一個(gè)數(shù)據(jù)庫(kù)等等。
安裝docker
既然docker這么神奇,那我們?nèi)绾伟惭bdocker呢?我們一起來(lái)走一下吧。
Ubuntu安裝docker
由于本人的系統(tǒng)是CentOS,所以這里就只展示一下CentOS的安裝方式,Ubuntu以及其他系統(tǒng)請(qǐng)自行百度。
CentOS安裝docker
docker要求CentOS在7.0以后的版本,如果你的系統(tǒng)版本還在7.0以前,請(qǐng)先升級(jí)一下版本在進(jìn)行安裝,同時(shí)不支持32位的系統(tǒng),內(nèi)核版本至少3.10。
請(qǐng)先確保沒(méi)有安裝過(guò)docker,否則有可能會(huì)導(dǎo)致安裝失敗,如果之前安裝過(guò),可以嘗試直接yum isntall -y docker
1.更新軟件源第一個(gè)命令
yum?update

遇到他輸入y,然后回車(chē),看到下面信息表示更新成功:

第二個(gè)命令
yum?install?-y?yum-utils?device-mapper-persistent-data?lvm2

2.添加docker穩(wěn)定版本的yum軟件源
yum-config-manager?--add-repo?https://download.docker.com/linux/centos/docker-ce.repo

3.再次更新yum源,并安裝docker
yum?update

yum?install?-y?docker-ce

看到這個(gè)頁(yè)面,標(biāo)識(shí)docker已經(jīng)安裝成功了。4.安裝完成之后啟動(dòng)docker
systemctl?start?docker
5.重啟
systemctl?restart?docker
6.停止
systemctl?stop?docker
7.開(kāi)機(jī)自啟動(dòng)
systemctl?enable?docker
8.查看docker的狀態(tài)
systemctl?status?docker
通過(guò)腳本安裝
除了上面的yum安裝,還可以采用shell腳本安裝,安裝流程如下:
curl?-fsSL?https://get.docker.com/?|?sh
或者
wget?-qO-?https://get.docker.com/?|?sh
拉取java環(huán)境
拉取jdk很簡(jiǎn)單,直接執(zhí)行一行代碼即可,我這里拉取的時(shí)java 8的版本。
docker?pull?java:8
拉取完成之后執(zhí)行:
docker?images
如果出現(xiàn)下面內(nèi)容,表示拉取成功

創(chuàng)建springboot項(xiàng)目
1.新建項(xiàng)目

引入sprint-boot-web的依賴(lài)

新建完成之后的項(xiàng)目結(jié)構(gòu)

2.引入docker依賴(lài)
<properties>
???????<docker.image.prefix>registry.aliyuncs.com/linhuatestdocker.image.prefix>
????properties>
?
????????????<plugin>
????????????????<groupId>com.spotifygroupId>
????????????????<artifactId>docker-maven-pluginartifactId>
????????????????<version>1.0.0version>
????????????????<configuration>
????????????????????<imageName>${docker.image.prefix}/${project.artifactId}imageName>
????????????????????
????????????????????<dockerDirectory>src/main/dockerdockerDirectory>
????????????????????<resources>
????????????????????????<resource>
????????????????????????????<targetPath>/targetPath>
????????????????????????????<directory>${project.build.directory}directory>
????????????????????????????<include>${project.build.finalName}.jarinclude>
????????????????????????resource>
????????????????????resources>
????????????????configuration>
????????????plugin>
3.新建docker文件在main目錄下新建docker目錄,然后在docker目錄下創(chuàng)建dockerfile文件,不需要后綴名。

創(chuàng)建完成之后的工程目錄如下:

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是我剛剛拉取的鏡像,運(yùn)行的基礎(chǔ)。VOLUME:指向的一個(gè)臨時(shí)文件,用于存儲(chǔ)tomcat工作。ADD:復(fù)制文件并且重命名文件。ENTRYPOINT:初始化配置或者自定義配置。
5.創(chuàng)建測(cè)試接口

TestController內(nèi)容如下:
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("這是控制臺(tái)日志!");
????????log.info("這是輸出到文件的日志");
????????return???"HELLO-BUG?。。。。。。。。。?;
????}
}
在resources目錄下創(chuàng)建log4j2.xml文件主要看這兩個(gè)參數(shù):

這里我使用了log4j2的日志,如何配置log4j2的日志,請(qǐng)參考 springboot整合Log4j2(將日志輸出到指定文件)。
6.編寫(xiě)application.yml配置文件
server:
??port:?9999
到這里springboot項(xiàng)目就創(chuàng)建完成了,我們現(xiàn)在啟動(dòng)一下項(xiàng)目。
??.???____??????????_????????????__?_?_
?/\\?/?___'_?__?_?_(_)_?__?__?_?\?\?\?\?(?(?)\___?|?'_?|?'_|?|?'_?\/?_`?|?\?\?\?\
?\\/??___)|?|_)|?|?|?|?|?||?(_|?|??)?)?)?)
??'??|____|?.__|_|?|_|_|?|_\__,?|?/?/?/?/
?=========|_|==============|___/=/_/_/_/
?::?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)
如果看到這個(gè)頁(yè)面表示springboot項(xiàng)目沒(méi)有問(wèn)題,現(xiàn)在我們將項(xiàng)目拷貝到服務(wù)器中。
打包springboot到docker


執(zhí)行
mvn?clean?package?docker:build
執(zhí)行完之后將會(huì)看到

表示打包成功。
執(zhí)行
docker?images

我們發(fā)現(xiàn)docker的鏡像中多了一個(gè)springboot/spring-boot-docker,沒(méi)錯(cuò),這個(gè)就是我們的springboot項(xiàng)目,既然鏡像已經(jīng)生成,那么如何使用這個(gè)鏡像呢?
執(zhí)行
docker?run?--name?springbooot-docker???-p?9999:9999?-d?4a2

run:運(yùn)行的意思–name:指定鏡像啟動(dòng)的之后的名稱(chēng)-p:容器和外部的端口映射 第一個(gè)端口:外部 第二個(gè)端口:內(nèi)部-d:后臺(tái)運(yùn)行 -t:實(shí)時(shí)運(yùn)行,窗口關(guān)閉,程序結(jié)束。4a2:表示鏡像的id(IMAGE ID)前3位,這里的id并不需要輸入全稱(chēng),只需要輸入前幾個(gè)就行,有一個(gè)前提:當(dāng)有很多鏡像的時(shí)候,前面幾個(gè)字符就有可能會(huì)相同,這個(gè)時(shí)候就需要多輸入幾位,直到不相同位置。
啟動(dòng)了鏡像之后我怎么知道有沒(méi)有成功呢?這個(gè)時(shí)候我們就需要一個(gè)命令來(lái)查看已經(jīng)啟動(dòng)的任務(wù)
docker?ps


docker查看容器的日志
這說(shuō)明我們已經(jīng)springboot項(xiàng)目已經(jīng)啟動(dòng)成功了,到這里docker部署springboot項(xiàng)目差不就結(jié)束了,但是你可能還有一個(gè)疑問(wèn),如果我想看控制臺(tái)的日志怎么辦呢?像我們一般使用java -jar的時(shí)候都會(huì)生成一個(gè)控制臺(tái)的日志文件,那docker容器中怎么查看控制臺(tái)日志呢?其實(shí)很簡(jiǎn)單,只需要一行命令即可
docker?ps
找到容器的id

然后執(zhí)行
docker?logs?-f?--tail=100?ca

這個(gè)時(shí)候我們就能看到控制臺(tái)的日志了,如何我們想看log4j2輸出的文件日志呢?
查看log4j2輸出問(wèn)文件日志
還記得我們?cè)趌og4j2中配置了日志的輸出目錄了嗎?

沒(méi)錯(cuò),就是這個(gè), 我們切換到這個(gè)目下

發(fā)現(xiàn)這里生成了三個(gè)文件,我們打開(kāi)info.log
tail?-100f?info.log

docker?exec?-it?ca2cd59fff9b?/bin/bash
ca2cd59fff9b:容器id
然后再切換到我們?nèi)罩镜妮敵雎窂?/p>
cd?work/spring-boot-docker

這里也找到了三個(gè)日志文件,我們打印info.log
tail?-100f?info.log

這就是我們log4j2輸出到文件的日志,到這里docker整合springboot項(xiàng)目就差不多結(jié)束了,如果想要退出docker容器可以使用
exit
END
PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、在看。
