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獲取更多精彩文章!
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

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