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

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

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

相關文章