淺析Docker構建SpringBoot應用
1.基于Dockerfile構建SpringBoot鏡像
1.1準備工作
將SpringBoot項目通過maven打成jar包: mvn clean package
1.2使用Dockerfile構建鏡像
- step1 在存放jar所在目錄下創(chuàng)建Dockerfile文件
- touch Dockerfile
- step2 編輯Dockerfile增加以下內容
- FROM java:8
- MAINTAINER niugang<863263957@qq.com>
- RUN mkdir -p /opt/springapp
- ADD demo-0.0.1.jar /opt/springapp
- EXPOSE 8088
- ENTRYPOINT ["java","-jar","/opt/springapp/demo-0.0.1.jar"]
- step3 構建鏡像
- docker build -t springbootdemo:1.0 .
- step4 啟動容器
- docker run -d -p 8088:8088 --name sb springbootdemo:1.0
在啟動容器是可以添加數據卷,程序日志映射到宿主機,方便后期排查問題
注意:在啟動過程中,一直起不起來,然后通過前臺啟動查看了日志。
報了如下錯誤:WARNING: IPv4 forwarding is disabled. Networking will not work.
解決:需要做如下配置
- vim/etc/sysctl.conf
- net.ipv4.ip_forward=1 #添加這段代碼
重啟network服務
- systemctl restart network && systemctl restart docker
查看是否修改成功 (備注:返回1,就是成功)
- [root@docker-node2 ~]# sysctl net.ipv4.ip_forward
- net.ipv4.ip_forward = 1
- step5 調用你的springboot應用,驗證其是否正確
2.使用Maven插件構建Docker鏡像
Maven是一個強大的項目管理與構建工具。如果可以使用Maven構建Docker鏡像,以下幾款Maven的Docker插件比較常用。
插件名稱 官方地址 docker-maven-plugin https://github.com/spotify/docker-maven-plugin
上面插件可以從github看到此插件已經不再推薦了。推薦使用
https://github.com/spotify/dockerfile-maven 具體操作步驟上面有介紹
docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin
2.1直接配置方式
- step 1
在你的springboot應用的pom.xml中增加如下配置
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>0.4.13</version>
- <configuration>
- <!--用于指定鏡像名稱-->
- <imageName>niugang/springboot:3.0</imageName>
- <!--用于指定基礎鏡像,類似于Dockerfile中的FROM指令。-->
- <baseImage>java</baseImage>
- <!--類似于Dockerfile的ENTRYPOINT指令-->
- <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
- <resources>
- <resource>
- <!--將打包后的資源文件復制到該目錄-->
- <targetPath>/</targetPath>
- <!--需要復制的文件所在目錄,maven打包的應用jar包保存在target目錄下面-->
- <directory>${project.build.directory}</directory>
- <!--需要復制的文件,打包好的應用jar包。-->
- <include>${project.build.finalName}.jar</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
簡要說明一下插件的配置:
- imageName:用于指定鏡像名稱,其中niugang是倉庫名稱,springboot是鏡像名稱,3.0是標簽名稱
- baseImage:用于指定基礎鏡像,類似于Dockerfile中的FROM指令。
- entrypoint:類似于Dockerfile的ENTRYPOINT指令。
- resources.resource.directory:用于指定需要復制的根目錄,${project.build.directory}表示target目錄。
- resources.resource.include:用于指定需要復制的文件。${project.build.finalName}.jar指的是打包后的jar包文件。
- step2 進入代碼路徑下,執(zhí)行如下命令
- mvn clean package docker:build
- step3 查看鏡像

- step4 啟動容器
- docker run -d -p 8088:8088 --name myspringboot niugang/springboot:3.0
- step5 訪問測試
2.2 讀取Dockerfile進行構建
在2.1中只需要在pom.xm中配置,執(zhí)行命令就可以生成docker鏡像。在很多時候希望通過Dockerfile生成Docker鏡像。
- step1 在項目src/main/resources目錄下新建docker文件夾,在文件夾下新建Dockerfile文件,增加如下內容
- FROM java:8
- MAINTAINER niugang<863263957@qq.com>
- RUN mkdir -p /docker/images
- ADD demo-0.0.1-SNAPSHOT.jar /docker/images
- ENTRYPOINT ["java","-jar","/docker/images/demo-0.0.1-SNAPSHOT.jar"]
- step2 pom.xml修改為如下
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>0.4.13</version>
- <configuration>
- <!--用于指定鏡像名稱-->
- <imageName>niugang/springboot:4.0</imageName> <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
- <resources>
- <resource>
- <!--將打包后的資源文件復制到該目錄-->
- <targetPath>/</targetPath>
- <!--需要復制的文件所在目錄,maven打包的應用jar包保存在target目錄下面-->
- <directory>${project.build.directory}</directory>
- <!--需要復制的文件,打包好的應用jar包。-->
- <include>${project.build.finalName}.jar</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
可以看到,不再制定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在路徑。即時指定了baseImage和entrypoint也將被忽略。
- step3 進入代碼路徑下,執(zhí)行如下命令
- mvn clean package docker:build
查看鏡像
- docker images
- step4 啟動容器
- docker run -d -p 8088:8088 --name myspringboot niugang/springboot:4.0
- step5 訪問測試
2.3 將插件綁定在某個phase執(zhí)行
很多場景下,我們有這樣的需求,執(zhí)行例如 mvn clean package 時,插件就自動為我們構建Docker鏡像。要想實現(xiàn)這點,我們只需將插件的goal綁定在某個phase即可。
phase和goal可以這樣理解:maven命令格式是: mvn phase:goal ,例如 mvnpackagedocker:build 。那么,package和docker都是phase,build則是goal。
- step1 編輯pom.xml 內容如下
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>0.4.13</version>
- <executions>
- <execution>
- <id>build-images</id>
- <phase>package</phase>
- <goals>
- <goal>build</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <!--用于指定鏡像名稱-->
- <imageName>niugang/springboot:5.0</imageName> <dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>
- <resources>
- <resource>
- <!--將打包后的資源文件復制到該目錄-->
- <targetPath>/</targetPath>
- <!--需要復制的文件所在目錄,maven打包的應用jar包保存在target目錄下面-->
- <directory>${project.build.directory}</directory>
- <!--需要復制的文件,打包好的應用jar包。-->
- <include>${project.build.finalName}.jar</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
- step2進入代碼路徑下,執(zhí)行如下命令
- mvn clean package
- step3 查看鏡像
由配置可知,我們只需添加如下配置:
- <executions>
- <execution>
- <id>build-image</id>
- <phase>package</phase>
- <goals>
- <goal>build</goal>
- </goals>
- </execution>
- </executions>
就可將插件綁定在package這個phase上。也就是說,用戶只需執(zhí)行 mvn package ,就會自動執(zhí)行 mvn docker:build 。當然,讀者也可按照需求,將插件綁定到其他的phase。