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

- step4 啟動(dòng)容器
 
- docker run -d -p 8088:8088 --name myspringboot niugang/springboot:3.0
 
- step5 訪問(wèn)測(cè)試
 
2.2 讀取Dockerfile進(jìn)行構(gòu)建
在2.1中只需要在pom.xm中配置,執(zhí)行命令就可以生成docker鏡像。在很多時(shí)候希望通過(guò)Dockerfile生成Docker鏡像。
- step1 在項(xiàng)目src/main/resources目錄下新建docker文件夾,在文件夾下新建Dockerfile文件,增加如下內(nèi)容
 
- 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>
 - <!--將打包后的資源文件復(fù)制到該目錄-->
 - <targetPath>/</targetPath>
 - <!--需要復(fù)制的文件所在目錄,maven打包的應(yīng)用jar包保存在target目錄下面-->
 - <directory>${project.build.directory}</directory>
 - <!--需要復(fù)制的文件,打包好的應(yīng)用jar包。-->
 - <include>${project.build.finalName}.jar</include>
 - </resource>
 - </resources>
 - </configuration>
 - </plugin>
 
可以看到,不再制定baseImage和entrypoint,而是使用dockerDirectory指定Dockerfile所在路徑。即時(shí)指定了baseImage和entrypoint也將被忽略。
- step3 進(jìn)入代碼路徑下,執(zhí)行如下命令
 
- mvn clean package docker:build
 
查看鏡像
- docker images
 
- step4 啟動(dòng)容器
 
- docker run -d -p 8088:8088 --name myspringboot niugang/springboot:4.0
 
- step5 訪問(wèn)測(cè)試
 
2.3 將插件綁定在某個(gè)phase執(zhí)行
很多場(chǎng)景下,我們有這樣的需求,執(zhí)行例如 mvn clean package 時(shí),插件就自動(dòng)為我們構(gòu)建Docker鏡像。要想實(shí)現(xiàn)這點(diǎn),我們只需將插件的goal綁定在某個(gè)phase即可。
phase和goal可以這樣理解:maven命令格式是: mvn phase:goal ,例如 mvnpackagedocker:build 。那么,package和docker都是phase,build則是goal。
- step1 編輯pom.xml 內(nèi)容如下
 
- <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>
 - <!--將打包后的資源文件復(fù)制到該目錄-->
 - <targetPath>/</targetPath>
 - <!--需要復(fù)制的文件所在目錄,maven打包的應(yīng)用jar包保存在target目錄下面-->
 - <directory>${project.build.directory}</directory>
 - <!--需要復(fù)制的文件,打包好的應(yīng)用jar包。-->
 - <include>${project.build.finalName}.jar</include>
 - </resource>
 - </resources>
 - </configuration>
 - </plugin>
 
- step2進(jìn)入代碼路徑下,執(zhí)行如下命令
 
- mvn clean package
 
- step3 查看鏡像
 
由配置可知,我們只需添加如下配置:
- <executions>
 - <execution>
 - <id>build-image</id>
 - <phase>package</phase>
 - <goals>
 - <goal>build</goal>
 - </goals>
 - </execution>
 - </executions>
 
就可將插件綁定在package這個(gè)phase上。也就是說(shuō),用戶只需執(zhí)行 mvn package ,就會(huì)自動(dòng)執(zhí)行 mvn docker:build 。當(dāng)然,讀者也可按照需求,將插件綁定到其他的phase。















 
 
 




 
 
 
 