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

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獲取更多精彩文章!

歡迎關注微信公衆號<南瓜慢說>,將持續爲你更新...

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章