Docker 部署SpringBoot專案
目錄
- docker介紹
- 安裝docker
- Ubuntu安裝docker
- CentOS安裝docker
- 通過指令碼安裝
- 拉取java環境
- 建立springboot專案
- 打包springboot到docker
- docker檢視容器的日誌
- 檢視log4j2輸出問檔案日誌
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。docker的核心思想是通過對應用的封裝、分發、部署、執行生命週期進行管理,達到應用元件級別的“一次性封裝,到處執行”。這裡的應用元件,可以是一個web應用,也可以是一個環境,更可以是一個數據庫等等。既然docker這麼神奇,那我們如何安裝docker呢?我們一起來走一下吧。PS:我把 Dorcker 相關的文章整理好了,關注微信公眾號 Java後端,回覆 666 下載就可以了。
Ubuntu安裝docker
由於本人的系統是CentOS,所以這裡就只展示一下CentOS的安裝方式,Ubuntu以及其他系統請自行百度。
CentOS安裝docker
docker要求CentOS在7.0以後的版本,如果你的系統版本還在7.0以前,請先升級一下版本在進行安裝,同時不支援32位的系統,核心版本至少3.10。請先確保沒有安裝過docker,否則有可能會導致安裝失敗,如果之前安裝過,可以嘗試直接yum isntall -y docker1.更新軟體源第一個命令
yumupdate
遇到他輸入y,然後回車,看到下面資訊表示更新成功:
第二個命令
yuminstall-y yum-utils device-mapper-persistent-datalvm2
2.新增docker穩定版本的yum軟體源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.再次更新yum源,並安裝docker
yumupdate
yuminstall-y docker-ce
看到這個頁面,標識docker已經安裝成功了。4.安裝完成之後啟動docker
systemctlstartdocker
5.重啟
systemctlrestart docker
6.停止
systemctlstopdocker
7.開機自啟動
systemctlenabledocker
8.檢視docker的狀態
systemctlstatus docker
通過指令碼安裝
除了上面的yum安裝,還可以採用shell指令碼安裝,安裝流程如下:
curl -fsSL https://get.docker.com/ |sh
或者
wget -qO- https://get.docker.com/ |sh
拉取jdk很簡單,直接執行一行程式碼即可,我這裡拉取的時java 8的版本。
docker pull java:8
拉取完成之後執行:
dockerimages
如果出現下面內容,表示拉取成功
1.新建專案
引入sprint-boot-web的依賴
新建完成之後的專案結構
2.引入docker依賴
<properties>
<docker.image.prefix>registry.aliyuncs.com/linhuatest</docker.image.prefix>
</properties>
<!-- docker外掛 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--docker檔案所在的目錄-->
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
3.新建docker檔案在main目錄下新建docker目錄,然後在docker目錄下建立dockerfile檔案,不需要字尾名。
建立完成之後的工程目錄如下:
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內容如下:
packagecom.ymy.controller;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.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 profileset, falling backtodefaultprofiles:default
15:29:20.183[main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcatinitializedwithport(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 -Startingservice [Tomcat]
15:29:20.201[main] INFO org.apache.catalina.core.StandardEngine -StartingServletengine: [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 completedin881ms
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 -StartingProtocolHandler ["http-nio-9999"]
15:29:20.596[main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat startedonport(s):9999(http)withcontextpath''
15:29:20.599[main] INFO com.ymy.SpringBootDockerApplication - Started SpringBootDockerApplicationin1.664seconds (JVM runningfor4.04)
如果看到這個頁面表示springboot專案沒有問題,現在我們將專案拷貝到伺服器中。
我現在已經將專案拷貝到伺服器中,我們現在需要將它打包到docker中,藉助maven實現打包,如果還沒有安裝maven的,請先安裝maven,切換到專案的根目錄
執行
mvn cleanpackagedocker:build
執行完之後將會看到
表示打包成功。執行
dockerimages
我們發現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並不需要輸入全稱,只需要輸入前幾個就行,有一個前提:當有很多映象的時候,前面幾個字元就有可能會相同,這個時候就需要多輸入幾位,直到不相同位置。
啟動了映象之後我怎麼知道有沒有成功呢?這個時候我們就需要一個命令來檢視已經啟動的任務
dockerps
我們發現這裡已經出現了我們之前啟動的映象,所以這基本上代表啟動成功了,為了驗證是否啟動成功,我們在瀏覽器輸入測試的介面:ip:9999/test
這說明我們已經springboot專案已經啟動成功了,到這裡docker部署springboot專案差不就結束了,但是你可能還有一個疑問,如果我想看控制檯的日誌怎麼辦呢?像我們一般使用java -jar的時候都會生成一個控制檯的日誌檔案,那docker容器中怎麼檢視控制檯日誌呢?其實很簡單,只需要一行命令即可
dockerps
找到容器的id
然後執行
docker logs -f
這個時候我們就能看到控制檯的日誌了,如何我們想看log4j2輸出的檔案日誌呢?還記得我們在log4j2中配置了日誌的輸出目錄了嗎?
沒錯,就是這個, 我們切換到這個目下
發現這裡生成了三個檔案,我們開啟info.log
tail-100finfo.log
我們發現並沒有輸入我們列印的:“這是輸出到檔案的日誌”,難道是我們配置錯了問題?不是的,是因為我們找錯了位置,真正的檔案日誌在容器內部,所以我們需要先進入容器內部
dockerexec-it ca2cd59fff9b /bin/bash
ca2cd59fff9b:容器id
然後再切換到我們日誌的輸出路徑
cdwork/spring-boot-docker
這裡也找到了三個日誌檔案,我們列印info.log
tail-100finfo.log
這就是我們log4j2輸出到檔案的日誌,到這裡docker整合springboot專案就差不多結束了,如果想要退出docker容器可以使用