Springboot整合MongoDB的Docker開發,其它應用也類似

来源:https://www.cnblogs.com/larrydpk/archive/2020/07/05/13247127.html
-Advertisement-
Play Games

1 前言 Docker是容器開發的事實標準,而Springboot是Java微服務常用框架,二者必然是會走到一起的。本文將講解如何開發Springboot項目,把它做成Docker鏡像,並運行起來。 2 把Springboot打包成Docker鏡像 Springboot的Web開發非常簡單,本次使用 ...


1 前言

Docker是容器開發的事實標準,而SpringbootJava微服務常用框架,二者必然是會走到一起的。本文將講解如何開發Springboot項目,把它做成Docker鏡像,並運行起來。

2 把Springboot打包成Docker鏡像

SpringbootWeb開發非常簡單,本次使用之前講解過的Springboot整合MongoDB的項目,請參考

實例講解Springboot整合MongoDB進行CRUD操作的兩種方式,文章中有源碼;MongoDB的安裝請參考:用Docker安裝一個MongoDB最新版玩玩

2.1 修改配置文件,讓容器內部連接宿主機服務

修改Springboot的配置文件,主要是MongoDB的連接信息:

server.port=8080

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.username=user
spring.data.mongodb.password=123456
spring.data.mongodb.host=host.docker.internal
spring.data.mongodb.port=27017

MongoDBhost需要修改為host.docker.internal,而不能是localhost或者127.0.0.1。因為Springboot是運行在Docker容器裡面的,有網路隔離。查看Dockernetwork,有以下三個,預設使用bridge,這時就無法通過localhost訪問。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8560aacda859        bridge              bridge              local
2a276c0230a3        host                host                local
0eeb101bcf52        none                null                local

對於Linuxnetwork可以切換成host模式,這可以直接使用localhost,但不建議這樣做,這相當於容器與宿主機共用網路,會有風險。

對於MacWindows,如果Docker版本在v18.03或以上,就可以使用host.docker.internal。建議使用新版本,就不用考慮更早版本的方案了,哈哈。

2.2 通過Dockerfile生成鏡像

通過Dockerfile來生成鏡像是很常用的方式,必須要掌握的,文件具體內容如下:

FROM adoptopenjdk/openjdk8-openj9
VOLUME /tmp

ARG JAR_FILE=target/springboot-mongo-0.0.1-SNAPSHOT.jar
ARG PORT=8080
ARG TIME_ZONE=Asia/Shanghai

ENV TZ=${TIME_ZONE}
ENV JAVA_OPTS="-Xms64m -Xmx256m"

COPY ${JAR_FILE} pkslow.jar

EXPOSE ${PORT}

ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
  • FROM:指明我們基於某個鏡像來打包,因為需要啟動Java應用,所以我們找了一個帶JDK環境的鏡像。這就非常靈活了,有非常多帶Java環境的鏡像,即使沒有合適的,也可以自己做一個;
  • ARGDockerfile構建時的參數;
  • ENV:環境變數;
  • COPY:把文件複製到新的鏡像內;
  • EXPOSE:暴露埠,這樣外部才能訪問;
  • ENTRYPOINT:啟動命令。

準備好了Dockerfile後,就可以開始打包了:

$ mvn clean package
$ docker build -t pkslow/springboot-mongo:0.0.3 .
Sending build context to Docker daemon  23.43MB
Step 1/10 : FROM adoptopenjdk/openjdk8-openj9
 ......
Step 10/10 : ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -server -jar pkslow.jar
 ---> Running in a1274810851f
Removing intermediate container a1274810851f
 ---> 4a56d8e1a93e
Successfully built 4a56d8e1a93e
Successfully tagged pkslow/springboot-mongo:0.0.3

先用mavenSpringboot打成jar包,然後把jar包放到鏡像里,打成新的鏡像。

成功後查看鏡像列表:

$ docker image ls pkslow/springboot-mongo
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
pkslow/springboot-mongo   0.0.3               4a56d8e1a93e        46 minutes ago      346MB
pkslow/springboot-mongo   0.0.2               3699f9106567        3 hours ago         346MB
pkslow/springboot-mongo   0.0.1               37a35d2af376        3 hours ago         346MB

3 啟動應用

應用Springboot前請先確保已經成功啟動了MongoDB並創建好了相關用戶。

啟動應用如下:

$ docker run -d --name pkslow-springboot -p 8080:8080 pkslow/springboot-mongo:0.0.3
ee479efc132b7839cf4973c5b78164554485f733489835f8888dcc726d2e1c3f

會返回一個容器ID,可以查看其信息。

查看Docker容器運行狀態,說明它正常運行:

$ docker ps -f name=pkslow*
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
ee479efc132b        pkslow/springboot-mongo:0.0.3   "/bin/sh -c 'java ${…"   51 minutes ago      Up 51 minutes       0.0.0.0:8080->8080/tcp   pkslow-springboot

查看容器日誌命令為:docker logs 容器ID,如下:

說明Springboot應用已經正常啟動,併成功連接MongoDB

Postman做一個簡單的測試,成功插入一條數據:

4 總結

雖然案例講的是SpringbootDocker開發,但其它應用也是類似的。

這是微軟關於Docker微服務的開發流程圖,大體就是應用代碼——Dockerfile——生成鏡像——容器編排服務——運行——測試——提交,前面幾步都一樣的,後面的我們將會採用Kubernetes,後續再講解。


歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關註微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 接下來演示一遍如何通過寶塔面板安裝子楓後臺管理系統 在寶塔找到子楓後臺管理系統 軟體商店->一鍵部署->一鍵部署 點擊一鍵部署 填寫上功能變數名稱,設置好基本配置,然後點擊提交,進入安裝 點擊上圖鏈接打開系統安裝界面 進入子楓後臺系統安裝界面 到此 安裝成功 這是會彈出登錄頁面,輸入剛纔的賬號密碼登錄 高顏 ...
  • 一、關鍵字&標識符 關鍵字:被Java語言賦予了特殊含義,用做專門用途的字元串(單詞) 標識符:凡是自己可以起名字的地方都叫標識符 1. 命名的規範(一定要遵守,不遵守就會報編譯的錯誤) 由26個英文字母大小寫,0-9 ,_或 $ 組成 數字不可以開頭。 不可以使用關鍵字和保留字,但能包含關鍵字和保 ...
  • 本文主要介紹在使用阿裡雲Redis的開發規範,從下麵幾個方面進行說明。 鍵值設計 命令使用 客戶端使用 相關工具 通過本文的介紹可以減少使用Redis過程帶來的問題。 一、鍵值設計 1、key名設計 可讀性和可管理性 以業務名(或資料庫名)為首碼(防止key衝突),用冒號分隔,比如業務名:表名:id ...
  • 總結: 基本數據類型(瞭解) 整數 byte、short、int、long 浮點數 float、double 字元 char 布爾 boolean 類型轉換(瞭解) 數據範圍小的賦值給數據範圍大的會自動轉換 數據範圍大的賦值給數據範圍小用括弧括起來 大轉小會出現精度損失 一、數據類型 1. 電腦存 ...
  • 總結: 常量(掌握) 在程式運行過程中,其值不可以發生改變的量。 Java中的常量:字元串、整數、小數、字元、布爾、null 變數(掌握) 在程式運行過程中,其值可以發生改變的量。 變數的定義格式:數據類型 變數名 = 初始化值; 同一對{}中,定義變數名不能重覆 變數未賦值不能使用 定義long類 ...
  • 總結: 註釋(掌握) 單行註釋:// 多行註釋:/* */ 關鍵字(瞭解) 賦予了特殊含義的單詞 關鍵字的字母全部小寫 編輯器對關鍵字都有高亮顯示 標識符(掌握) 由字母、數字、下劃線“_”、美元符號“$”組成,第一個字元不能是數字 不能使用java中的關鍵字作為標識符 小駝峰式命名:變數名、方法名 ...
  • 1. Collection a) List (有序,可重覆) i. ArrayList底層用數組實現。線程不安全,效率高 ii. LinkedList:底層用雙向鏈表實現。線程不安全,效率高 ii. Vector:底層用數組實現。線程安全,效率低 b) Set (無序,不可重覆) HashSet(內 ...
  • 棧 1. 存放局部變數 2. 不可以被多個線程共用 3. 空間連續,速度快 堆 1. 存放對象 2. 可以被多個線程共用 3. 空間不連續,速度慢。但是靈活 方法區 1. 存放類的信息:代碼、靜態變數、字元串常量等 2. 可以被多個線程共用 3. 空間不連續,速度慢。但是靈活 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...