不要手動部署SpringBoot項目了,使用Docker真香!

2021-12-31 Java筆記蝦
目錄docker介紹

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

docker的核心思想是通過對應用的封裝、分發、部署、運行生命周期進行管理,達到應用組件級別的「一次性封裝,到處運行」。這裡的應用組件,可以是一個web應用,也可以是一個環境,更可以是一個資料庫等等。

安裝docker

既然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,然後回車,看到下面信息表示更新成功:


第二個命令

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


2.添加docker穩定版本的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


看到這個頁面,標識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

拉取java環境

拉取jdk很簡單,直接執行一行代碼即可,我這裡拉取的時java 8的版本。

docker pull java:8

拉取完成之後執行:

docker images

如果出現下面內容,表示拉取成功


創建springboot項目

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內容如下:

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項目沒有問題,現在我們將項目拷貝到伺服器中。

打包springboot到docker

我現在已經將項目拷貝到伺服器中,我們現在需要將它打包到docker中,藉助maven實現打包,如果還沒有安裝maven的,請先安裝maven,切換到項目的根目錄


執行

mvn clean package docker:build

執行完之後將會看到


表示打包成功。

執行

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項目已經啟動成功了,到這裡docker部署springboot項目差不就結束了,但是你可能還有一個疑問,如果我想看控制臺的日誌怎麼辦呢?像我們一般使用java -jar的時候都會生成一個控制臺的日誌文件,那docker容器中怎麼查看控制臺日誌呢?其實很簡單,只需要一行命令即可

docker ps

找到容器的id


然後執行

docker logs -f --tail=100 ca


這個時候我們就能看到控制臺的日誌了,如何我們想看log4j2輸出的文件日誌呢?

查看log4j2輸出問文件日誌

還記得我們在log4j2中配置了日誌的輸出目錄了嗎?


沒錯,就是這個, 我們切換到這個目下


發現這裡生成了三個文件,我們打開info.log

tail -100f info.log


我們發現並沒有輸入我們列印的:「這是輸出到文件的日誌」,難道是我們配置錯了問題?不是的,是因為我們找錯了位置,真正的文件日誌在容器內部,所以我們需要先進入容器內部

docker exec -it ca2cd59fff9b /bin/bash

ca2cd59fff9b:容器id

然後再切換到我們日誌的輸出路徑

cd work/spring-boot-docker

這裡也找到了三個日誌文件,我們列印info.log

tail -100f info.log

這就是我們log4j2輸出到文件的日誌,到這裡docker整合springboot項目就差不多結束了,如果想要退出docker容器可以使用

exit

相關焦點

  • 還在手動啟動SpringBoot項目?Docker部署不香嗎?
    容器是完全使用沙箱機制,相互之間不會有任何接口。docker的核心思想是通過對應用的封裝、分發、部署、運行生命周期進行管理,達到應用組件級別的「一次性封裝,到處運行」。這裡的應用組件,可以是一個web應用,也可以是一個環境,更可以是一個資料庫等等。
  • Springboot項目使用docker部署
    -r下載安裝docker啟動docker查看docker版本到此docker環境安裝配置完成,接下來將項目部署到docker中。新建springboot項目spring-boot-dockerpom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</
  • 還在手動部署 Spring Boot項目?不妨試試它,讓你部署項目飛起來!
    >還在手動啟動springboot項目?還在手動啟動springboot項目?docker部署不香嗎?還在手動啟動springboot項目?docker部署不香嗎?我們發現docker的鏡像中多了一個springboot/spring-boot-docker,沒錯,這個就是我們的springboot項目,既然鏡像已經生成,那麼如何使用這個鏡像呢?
  • 還在手動部署springboot項目?不妨試試它,讓你部署項目飛起來!
    容器是完全使用沙箱機制,相互之間不會有任何接口。docker的核心思想是通過對應用的封裝、分發、部署、運行生命周期進行管理,達到應用組件級別的「一次性封裝,到處運行」。這裡的應用組件,可以是一個web應用,也可以是一個環境,更可以是一個資料庫等等。安裝docker既然docker這麼神奇,那我們如何安裝docker呢?我們一起來走一下吧。
  • 使用 Docker 部署 Spring Boot 項目
    Docker 技術發展為微服務落地提供了更加便利的環境,使用 Docker 部署 Spring Boot 其實非常簡單,這篇文章我們就來簡單學習下。首先構建一個簡單的 Spring Boot 項目,然後給項目添加 Docker 支持,最後對項目進行部署。
  • 初級-手動部署springboot工程到Docker
    #配置yum為阿里雲鏡像yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝docker-cednf install https://mirrors.aliyun.com/docker-ce/linux
  • 使用Gradle構建SpringBoot項目Docker鏡像
    使用Gradle快速構建SpringBoot項目Docker鏡像,將鏡像推送到阿里雲遠程鏡像倉庫。
  • 一分鐘玩轉Docker容器化部署
    例如在項目src/main/docker目錄創建Dockerfile文件,代碼如下:FROM java:8VOLUME /tmpRUN mkdir /appADD springboot-1.0-SNAPSHOT.jar /app/springboot.jarADD runboot.sh /app/RUN bash -c 'touch
  • 手把手教你Docker+nginx部署Springboot+vue前後端分離項目
    有些同學們提出個問題,不知道如何打包部署Vue前後端分離項目。那麼今天,我們就來學習一下,如何部署簡單快捷部署我們的vueblog項目!線上演示:http://www.markerhub.com:8084/blogs配套部署視頻工具上線前準備這裡我們同步演示怎麼部署到win環境和linux(centos7)系統中,前端伺服器採用nginx部署,並使用docker統一管理前後端伺服器。
  • 使用Docker部署SpringBoot+Vue博客系統
    從完成實現到現在,也斷斷續續的根據實際的使用情況進行更新。只不過每次上線部署的時候都覺得有些麻煩,因為我的伺服器內存太小,每次即使只更新了前臺部分(fame-front)的代碼,在執行npm build的時候都還必須把我的後端服務(fame-server)的進程關掉,不然會造成伺服器卡死(慘啊)。
  • Spring Boot 2.0(四):使用 Docker 部署 Spring Boot
    安裝MAVEN下載: http://mirrors.shu.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz## 解壓tar vxf apache-maven-3.5.2-bin.tar.gz## 移動mv apache-maven
  • SpringBoot第二十四篇: springboot整合docker
    這篇文篇介紹,怎麼為 springboot程序構建一個docker鏡像。docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。準備工作環境:linux環境或mac,不要用windowsjdk 8maven 3.0docker對docker一無所知的看docker教程。
  • 使用Docker Compose部署SpringBoot應用
    使用Compose你可以用YAML文件來配置你的應用服務,然後使用一個命令,你就可以部署你配置的所有服務了。--version使用Docker Compose的步驟使用Dockerfile定義應用程式環境,一般需要修改初始鏡像行為時才需要使用;使用docker-compose.yml定義需要部署的應用程式服務,以便執行腳本一次性部署;使用docker-compose up命令將所有應用服務一次性部署起來。dock
  • SpringBoot 項目構建 Docker 鏡像調優實踐
    由於本人使用的程式語言是 Java,所以對 Java SpringBoot 項目接觸比較多,所以比較關心如何更好的通過 Dockerfile 編譯 Docker 的鏡像。Kubernetes 微服務簡單說就是一群鏡像間的排列組合與相互間調的關係,故而如何編譯鏡像會使服務性能更優,使鏡像構建、推送、拉取速度更快,使其佔用網絡資源更少這裡優化,更易使用成為了一個重中之重的事情,也是一個非常值得琢磨的問題。這裡我將對 SpringBoot 項目打包 Docker 鏡像如何寫 Dockerfile 的探究進行簡單敘述。
  • Docker安裝Jenkins+Shell腳本自動化部署項目
    「Jenkins是一款開源的CI&CD軟體, 提供超過1000個插件來支持構建、部署、自動化, 滿足任何項目的需要。:/var/run/docker.sock      - /usr/bin/docker:/usr/bin/docker    privileged: true    user: root官網中文文檔與英文文檔不一致,不要使用中文文檔中推薦的jenkinsci/blueocean鏡像,使用它構建node程序會出現問題
  • 【超全教程】SpringBoot 2.3.x 分層構建 Docker 鏡像實踐
    上面即是使用分層工具提取 Jar 的內容後生成的文件夾,其中各個文件夾作用是:dependencies: 存儲項目正常依賴 Jar 的文件夾。:0.0.1$ time docker push hub.mydlq.club/library/springboot-normal:0.0.1real    0m35.395s## 拉取鏡像 springboot-normal:0.0.2$ time docker push hub.mydlq.club/library/springboot-normal
  • 一個網站的微服務架構實戰docker和 docker-compose
    本項目是開發一個類似於segmentfault的文章共享社區,我的設想是當部署在個人伺服器上時就是個人的文章庫,部署在項目組的伺服器上就是項目內部的文章庫,部署在公司的伺服器上就是所有職工的文章共享社區。突出的特點就是,項目相關的所有應用和文件資源都是靈活的,用戶可以傻瓜式地部署並使用,對宿主機沒有任何依賴。
  • 我是如何使用docker,把一個nodejs項目部署上線的
    上一篇文章聊了一下如何把一個nodejs項目部署上線。現在容器化技術這麼火熱,作為學習,這篇文章就和大家聊一聊,我是如何使用docker把一個nodejs項目部署上線的。廢話不多說,下面開始進入正題:一、安裝 Docker首先在伺服器上安裝 Docker,參照官方極簡教程,很快便能安裝好,搭建 Docker 環境。
  • Docker搭建部署Node項目
    其中在centos上搭建環境和部署都挺費周折,部署測試伺服器,接著上線的時候又部署生產環境伺服器。這中間就有很多既無聊又費精力,吃力不討好的"體力活"。所以就開始思考怎麼自動化這部分搭建部署的工作,也就引出了Docker。什麼是DockerDocker 是比虛擬機還要輕量級的虛擬化技術,它虛擬化的實體就叫做容器。
  • Docker實戰:docker部署nginx項目詳解
    這裡我直接使用命令:docker pull nginx,可以從Docker Hub下載最新版本的nginx。這裡我們運行一個展示vue項目的nginx服務並指定訪問ip為8001,其指令為:docker run --name nginx-vue -p 8001:80 -d nginx。-p表示埠映射將本地的 8001 埠映射到容器內部的 80 埠,-d則是指定該容器一直在後臺運行。