日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

学习Spring Boot:(二十三)Spring Boot 中使用 Docker

發布時間:2025/3/12 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习Spring Boot:(二十三)Spring Boot 中使用 Docker 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

簡單的學習下怎么在 Spring Boot 中使用 Docker 進行構建,發布一個鏡像,現在我們通過遠程的 docker api 構建鏡像,運行容器,發布鏡像等操作。

這里只介紹兩種方式:

  • 遠程命令 api (需要知道 Docker 命令)
  • maven 插件 (不需要了解 Docker 命令)
  • 開啟 Docker api 遠程訪問

    開啟 docker api 遠程操作的功能,
    例如,centos 7 中在 /usr/lib/systemd/system/docker.service,文件中,修改 ExecStart 的參數:

    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

    端口自定義設置即可。

    重載所有修改過的配置文件,并且重啟 docker,

    systemctl daemon-reload systemctl restart docker.service

    需要注意的是,由于沒有密碼登陸任何權限驗證,外網或者生產環境需要上證書使用。

    命令方式構建鏡像

    這種方式其實非常簡單,就是需要懂得 docker 命令,才能操作。

    經過上面開啟 Docker Api 后,我們可以使用網絡環境操作 Docker 引擎了。

  • 新建 Dockerfile 構建鏡像文件,新創建一個文件夾,專門放構建鏡像需要的文件,我創建的是 /src/docker/

    FROM java:8 EXPOSE 8080VOLUME /tmp ADD springboot-docker.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]
  • 執行 maven 命令 ,將項目打包 mvn clean package --DskipTests,然后將打好的 jar 包,也放入到 Dockerfile項目目錄中。

  • 然后進入 src/docker 目錄下執行 :

    docker -H tcp://xxx.xxx.xxx.xxx:2375 build -t test .

    開始構建鏡像:

    Sending build context to Docker daemon 31.74MB Step 1/5 : FROM java:8---> d23bdf5b1b1b Step 2/5 : EXPOSE 8080---> Using cache---> 060a43a42146 Step 3/5 : VOLUME /tmp---> Using cache---> b4f88fde6181 Step 4/5 : ADD springboot-docker.jar app.jar---> 3a40188825b0 Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in ab093916fc4c Removing intermediate container ab093916fc4c---> 45a3966feb60 Successfully built 45a3966feb60 Successfully tagged test:latest

    ?

  • 使用 docker-maven-plugin構建鏡像

    在 maven 項目下加入 docker-maven-plugin

    <!--打包docker插件相關參數的配置--><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.14</version><configuration><!--打包的鏡像名--><imageName>${project.groupId}/${project.artifactId}</imageName><!--Dockerfile文件位置,以項目的 root 目錄為根節點,建議到單獨建立一個目錄--><dockerDirectory>./src/docker/</dockerDirectory><!--Docker 遠程的 API 地址及端口--><dockerHost>http://xxx.xxx.xxx.199:2375</dockerHost><imageTags><imageTag>latest</imageTag></imageTags><!--執行構建docker鏡像的時候需要哪些文件,springboot項目指定 打包好的jar 鏡像就好--><resources><resource><!--這里指定的文件是target中的jar文件--><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>

    創建 Dockerfile

    需要跟pom.xml 上面配置的路徑保持一致,所以我的路徑是 ${baseProjectFolder}/src/docker的文件夾下新建一個文件 Dockerfile,添加構建 docker 相關命令參數:

    FROM java:8 EXPOSE 8080VOLUME /tmp ADD springboot-docker.jar app.jar # 根據打包的jar 包文件名進行修改 ENTRYPOINT ["java","-jar","/app.jar"]

    打包

    在應用的根目錄下執行命令(打包加 dokcer build):

    $ mvn clean package docker:build -DskipTests

    比如使用我的工程,進行打包后完成了 docker 的構建的信息:

    [INFO] Building image com.wuwii/springboot-docker Step 1/5 : FROM java:8---> d23bdf5b1b1b Step 2/5 : EXPOSE 8080---> Running in b7936baae57f Removing intermediate container b7936baae57f---> 060a43a42146 Step 3/5 : VOLUME /tmp---> Running in 65e2b8ac44d3 Removing intermediate container 65e2b8ac44d3---> b4f88fde6181 Step 4/5 : ADD springboot-docker.jar app.jar---> aa3762cda143 Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in d9f5f63b9736 Removing intermediate container d9f5f63b9736---> 622a7d1e315c ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built 622a7d1e315c Successfully tagged com.wuwii/springboot-docker:latest

    使用鏡像

  • 進入安裝 docker 的主機中,使用命令查看鏡像(IMAGE ID 和上面是一致的):

    $ docker image ls com.wuwii/springboot-docker REPOSITORY TAG IMAGE ID CREATED SIZE com.wuwii/springboot-docker latest 622a7d1e315c 22 minutes ago 659MB
  • 運行容器:

    $ docker run -d -p 8080:8080 --name learn com.wuwii/springboot-docker180fe4a7ddfc10c0cf2c37649ae1628e804564bfe1594ef05840e707801e6da3

    監聽 8080 端口,測試是否成功。

  • 服務編排 compose

    一般的我們的 WEB 項目會使用到很多外部工具,例如 Redis ,MYSQL, ES等,如果一個一個啟動搭建部署,太麻煩了,還要測試如果把這個一套環境拿到別的地方還能用嗎?

    使用服務編排可以避免這些坑。

    加入我們的項目中增加了 Mysql 的數據庫,在根目錄新建一個 docker-compose.yml:

    version: '3' services:web:depends_on:- dbports:- "8080:8080" # 建議加上引號,如果單獨兩位數的數字,可能出現解析問題restart: always# build:# context: ./src/docker # Dockerfile 文件的目錄,可以遠程地址,絕對 or 相對# dockerfile: Dockerfile # 如果你的 Dockerfile 重命名了,需要指定image: test:latestenvironment:DB_HOST: db:3306DATABASE: learnDB_USERNAME: root # 測試用下 rootDB_PASSWORD: 123456 # # 建議使用 secretdb:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: learnMYSQL_USER: kronchanMYSQL_PASSWORD: 123456volumes:db_data: # 使用的數據卷必須聲明

    上面我使用的是前面已經構建好的鏡像,然后執行的編排,更好的是直接使用 build 讓它自己編排服務。

    系統配置文件application.yml使用缺省值的方式,不影響開發的使用:

    spring:datasource:url: jdbc:mysql://${DB_HOST:localhost:3306}/${DATABASE:learn}?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: ${DB_USERNAME:root}password: ${DB_PASSWORD:123456}driver-class-name: com.mysql.jdbc.Driverjpa:show-sql: truedatabase: mysqlhibernate:ddl-auto: updateproperties:hibernate:dialect: org.hibernate.dialect.MySQL57Dialect # 方言根據 數據庫版本選擇吧

    也可以使用不同的 spring.profiles指定不同的環境,在 docker-compose.yml 中覆蓋執行命令指定環境也是常見做法的:command: mvn clean spring-boot:run -Dspring-boot.run.profiles=xxx

    最后啟動,在 docker-compose.yml目錄下執行 : docker-compose up

    關閉服務 docker-compose down

    注意

    docker-compose 順序的問題,這個是開始學習編排的時候需要注意的問題,如果上面的服務編排中 mysql 啟動的慢, web 項目就會啟動失敗,它啟動的時候不知道被依賴的服務是否啟動完成,就會出現這樣的問題。

    解決的辦法有以下幾種:

    • 足夠的容錯和重試機制,比如連接數據庫,在初次連接不上的時候,服務消費者可以不斷重試,直到連接上位置
    • docker-compose拆分,分成兩部分部署,將要先啟動的服務放在一個docker-compose中,后啟動的服務放在兩一個docker-compose中,啟動兩次,兩者使用同一個網絡。
    • 同步等待,使用wait-for-it.sh或者其他shell腳本將當前服務啟動阻塞,直到被依賴的服務加載完畢
      wait-for-it的github地址為:wait-for-it

    總結

  • 主要是寫 Dockerfile 的時候最好單獨的拿出一個文件夾來放它,我開始的時候就是直接放在項目的根路徑,結果構建鏡像的時候總是出現了將其他的文件也一起復制到了 Docker 目錄中,WINDOW下使用 maven 插件操作這個需要注意這個上下文環境,不然很容易將一個磁盤的文件都拷貝進來了,初學者血的教訓。解決辦法就是單獨創建一個文件夾,將需要的東西單獨放置,就不用考慮這么多問題。
  • 總結

    以上是生活随笔為你收集整理的学习Spring Boot:(二十三)Spring Boot 中使用 Docker的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。