Springboot整合MongoDB的Docker開發,其它應用也類似
1 前言
Docker
是容器開發的事實標準,而 Springboot
是 Java
微服務常用框架,二者必然是會走到一起的。本文將講解如何開發 Springboot
項目,把它做成 Docker
鏡像,並運行起來。
2 把Springboot打包成Docker鏡像
Springboot
的 Web
開發非常簡單,本次使用之前講解過的 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
MongoDB
的 host
需要修改爲 host.docker.internal
,而不能是 localhost
或者 127.0.0.1
。因爲 Springboot
是運行在 Docker
容器裏面的,有網絡隔離。查看 Docker
的 network
,有以下三個,默認使用 bridge
,這時就無法通過 localhost
訪問。
$ docker network ls NETWORK ID NAME DRIVER SCOPE 8560aacda859 bridge bridge local 2a276c0230a3 host host local 0eeb101bcf52 none null local
對於 Linux
, network
可以切換成 host
模式,這可以直接使用 localhost
,但不建議這樣做,這相當於容器與宿主機共享網絡,會有風險。
對於 Mac
和 Windows
,如果 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
環境的鏡像,即使沒有合適的,也可以自己做一個; -
ARG
:Dockerfile
構建時的參數; -
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
先用 maven
將 Springboot
打成 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 總結
雖然案例講的是 Springboot
的 Docker
開發,但其它應用也是類似的。
這是微軟關於 Docker
微服務的開發流程圖,大體就是 應用代碼
—— Dockerfile
—— 生成鏡像
—— 容器編排服務
—— 運行
—— 測試
—— 提交
,前面幾步都一樣的,後面的我們將會採用 Kubernetes
,後續再講解。
歡迎訪問 南瓜慢說 www.pkslow.com 獲取更多精彩文章!
歡迎關注微信公衆號< 南瓜慢說 >,將持續爲你更新...