Docker部署SpringBoot的兩種方法,后一種一鍵部署超好用!

作者 | LemonSquash
來源 | cnblogs.com/npeng/p/14267007.html
1.手工方式
1.1.準備Springboot jar項目

將項目打包成jar
1.2.編寫Dockerfile
FROM?java:8
VOLUME?/tmp
ADD?elk-web-1.0-SNAPSHOT.jar?elk.jar
EXPOSE?8080
ENTRYPOINT?["java","-Djava.security.egd=file:/dev/./urandom","-jar","/elk.jar"]
FROM:表示基礎(chǔ)鏡像,即運行環(huán)境 VOLUME:/tmp創(chuàng)建/tmp目錄并持久化到Docker數(shù)據(jù)文件夾,因為Spring Boot使用的內(nèi)嵌Tomcat容器默認使用/tmp作為工作目錄 ADD:拷貝文件并且重命名(ADD elk-web-1.0-SNAPSHOT.jar elk.jar 將應(yīng)用jar包復制到/elk.jar) EXPOSE:并不是真正的發(fā)布端口,這個只是容器部署人員與建立image的人員之間的交流,即建立image的人員告訴容器布署人員容器應(yīng)該映射哪個端口給外界 ENTRYPOINT:容器啟動時運行的命令,相當于我們在命令行中輸入java -jar xxxx.jar,為了縮短 Tomcat 的啟動時間,添加java.security.egd的系統(tǒng)屬性指向/dev/urandom作為 ENTRYPOINT
1.3.構(gòu)建容器
[root@VM_0_15_centos?elk]#?docker?build?-t?elk?.
Sending?build?context?to?Docker?daemon?14.43?MB
Step?1/5?:?FROM?java:8
Trying?to?pull?repository?docker.io/library/java?...?
8:?Pulling?from?docker.io/library/java
5040bd298390:?Pull?complete?
fce5728aad85:?Pull?complete?
76610ec20bf5:?Pull?complete?
60170fec2151:?Pull?complete?
e98f73de8f0d:?Pull?complete?
11f7af24ed9c:?Pull?complete?
49e2d6393f32:?Pull?complete?
bb9cdec9c7f3:?Pull?complete?
Digest:?sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status:?Downloaded?newer?image?for?docker.io/java:8
?--->?d23bdf5b1b1b
Step?2/5?:?VOLUME?/tmp
?--->?Running?in?0aec2dc2f98c
?--->?a52e844f25d4
Removing?intermediate?container?0aec2dc2f98c
Step?3/5?:?ADD?elk-web-1.0-SNAPSHOT.jar?elk.jar
?--->?3ba2f4fdddda
Removing?intermediate?container?860a0f748a23
Step?4/5?:?EXPOSE?8080
?--->?Running?in?1d3331cc2be6
?--->?e9ac33d26ce0
Removing?intermediate?container?1d3331cc2be6
Step?5/5?:?ENTRYPOINT?java?-Djava.security.egd=file:/dev/./urandom?-jar?/elk.jar
?--->?Running?in?d354f8ee2af5
?--->?8937e1ade6c7
Removing?intermediate?container?d354f8ee2af5
Successfully?built?8937e1ade6c7
1.4.運行容器
docker?run?-di?--name?容器名稱?-p?8080:8080?鏡像名稱
其中-d表示后臺運行容器,這也就自然地解決的Spring Boot不支持后臺運行應(yīng)用程序的問題。
-p 8080:8080表示將容器內(nèi)部的8080端口映射到宿主機器的8080端口,這樣就可以通過宿主機器直接訪問應(yīng)
用。--name 給容器取一個容易記住的名字方便日后管理。
[root@VM_0_15_centos?elk]#?docker?run?-di?--name?myspringboot?-p?8080:8080?8937e1ade6c7
04d6b2c347950a10c95a039c94a3e51d717e516dd8c3c742e3197687dfcf5523
[root@VM_0_15_centos?elk]#?docker?ps?-a
CONTAINER?ID????????IMAGE???????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS????????????????????NAMES
04d6b2c34795????????8937e1ade6c7????????"java?-Djava.secur..."???8?seconds?ago???????Up?7?seconds????????0.0.0.0:8080->8080/tcp???myspringboot
[root@VM_0_15_centos?elk]#?
1.5.查看運行日志
docker logs -f --tail=100 容器名稱
[root@VM_0_15_centos?elk]#?docker?logs?-f?--tail=100?04d6b2c34795
??.???____??????????_????????????__?_?_
?/\\?/?___'_?__?_?_(_)_?__??__?_?\?\?\?\
(?(?)\___?|?'_?|?'_|?|?'_?\/?_`?|?\?\?\?\
?\\/??___)|?|_)|?|?|?|?|?||?(_|?|??)?)?)?)
??'??|____|?.__|_|?|_|_|?|_\__,?|?/?/?/?/
?=========|_|==============|___/=/_/_/_/
?::?Spring?Boot?::????????(v1.5.4.RELEASE)
2019-12-29?07:42:58.982??INFO?1?---?[???????????main]?c.b.ElkExampleSpringBootApplication??????:?Starting?ElkExampleSpringBootApplication?v1.0-SNAPSHOT?on?04d6b2c34795?with?PID?1?(/elk.jar?started?by?root?in?/)
2019-12-29?07:42:58.999??INFO?1?---?[???????????main]?c.b.ElkExampleSpringBootApplication??????:?No?active?profile?set,?falling?back?to?default?profiles:?default
2019-12-29?07:42:59.243??INFO?1?---?[???????????main]?ationConfigEmbeddedWebApplicationContext?:?Refreshing?org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5a2e4553:?startup?date?[Sun?Dec?29?07:42:59?UTC?2019];?root?of?context?hierarchy
2019-12-29?07:43:03.652??INFO?1?---?[???????????main]?s.b.c.e.t.TomcatEmbeddedServletContainer?:?Tomcat?initialized?with?port(s):?8080?(http)
2019-12-29?07:43:03.699??INFO?1?---?[???????????main]?o.apache.catalina.core.StandardService???:?Starting?service?[Tomcat]
2019-12-29?07:43:03.714??INFO?1?---?[???????????main]?org.apache.catalina.core.StandardEngine??:?Starting?Servlet?Engine:?Apache?Tomcat/8.5.15
2019-12-29?07:43:04.012??INFO?1?---?[ost-startStop-1]?o.a.c.c.C.[Tomcat].[localhost].[/]???????:?Initializing?Spring?embedded?WebApplicationContext
2019-12-29?07:43:04.012??INFO?1?---?[ost-startStop-1]?o.s.web.context.ContextLoader????????????:?Root?WebApplicationContext:?initialization?completed?in?4772?ms
2019-12-29?07:43:04.449??INFO?1?---?[ost-startStop-1]?o.s.b.w.servlet.ServletRegistrationBean??:?Mapping?servlet:?'dispatcherServlet'?to?[/]
2019-12-29?07:43:04.470??INFO?1?---?[ost-startStop-1]?o.s.b.w.servlet.FilterRegistrationBean???:?Mapping?filter:?'characterEncodingFilter'?to:?[/*]
2019-12-29?07:43:04.470??INFO?1?---?[ost-startStop-1]?o.s.b.w.servlet.FilterRegistrationBean???:?Mapping?filter:?'hiddenHttpMethodFilter'?to:?[/*]
2019-12-29?07:43:04.471??INFO?1?---?[ost-startStop-1]?o.s.b.w.servlet.FilterRegistrationBean???:?Mapping?filter:?'httpPutFormContentFilter'?to:?[/*]
2019-12-29?07:43:04.471??INFO?1?---?[ost-startStop-1]?o.s.b.w.servlet.FilterRegistrationBean???:?Mapping?filter:?'requestContextFilter'?to:?[/*]
2019-12-29?07:43:05.534??INFO?1?---?[???????????main]?s.w.s.m.m.a.RequestMappingHandlerAdapter?:?Looking?for?@ControllerAdvice:?org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5a2e4553:?startup?date?[Sun?Dec?29?07:42:59?UTC?2019];?root?of?context?hierarchy
2019-12-29?07:43:05.765??INFO?1?---?[???????????main]?s.w.s.m.m.a.RequestMappingHandlerMapping?:?Mapped?"{[/exception]}"?onto?public?java.lang.String?com.bruceliu.controller.ELKController.exception()
2019-12-29?07:43:05.766??INFO?1?---?[???????????main]?s.w.s.m.m.a.RequestMappingHandlerMapping?:?Mapped?"{[/elkdemo]}"?onto?public?java.lang.String?com.bruceliu.controller.ELKController.helloWorld()
2019-12-29?07:43:05.772??INFO?1?---?[???????????main]?s.w.s.m.m.a.RequestMappingHandlerMapping?:?Mapped?"{[/error],produces=[text/html]}"?onto?public?org.springframework.web.servlet.ModelAndView?org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2019-12-29?07:43:05.780??INFO?1?---?[???????????main]?s.w.s.m.m.a.RequestMappingHandlerMapping?:?Mapped?"{[/error]}"?onto?public?org.springframework.http.ResponseEntity>?org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2019-12-29?07:43:05.869??INFO?1?---?[???????????main]?o.s.w.s.handler.SimpleUrlHandlerMapping??:?Mapped?URL?path?[/webjars/**]?onto?handler?of?type?[class?org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29?07:43:05.869??INFO?1?---?[???????????main]?o.s.w.s.handler.SimpleUrlHandlerMapping??:?Mapped?URL?path?[/**]?onto?handler?of?type?[class?org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29?07:43:05.984??INFO?1?---?[???????????main]?o.s.w.s.handler.SimpleUrlHandlerMapping??:?Mapped?URL?path?[/**/favicon.ico]?onto?handler?of?type?[class?org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29?07:43:06.387??INFO?1?---?[???????????main]?o.s.j.e.a.AnnotationMBeanExporter????????:?Registering?beans?for?JMX?exposure?on?startup
2019-12-29?07:43:06.537??INFO?1?---?[???????????main]?s.b.c.e.t.TomcatEmbeddedServletContainer?:?Tomcat?started?on?port(s):?8080?(http)
2019-12-29?07:43:06.562??INFO?1?---?[???????????main]?c.b.ElkExampleSpringBootApplication??????:?Started?ElkExampleSpringBootApplication?in?8.771?seconds?(JVM?running?for?9.832)
1.6.訪問測試

2.Idea一鍵部署
2.1.配置docker遠程連接端口
首先編輯我們服務(wù)器上的docker文件
vim?/usr/lib/systemd/system/docker.service
修改以ExecStart開頭的行(centos 7):添加
-H?tcp://0.0.0.0:2375?-H?unix:///var/run/docker.sock?\

修改后保存文件,然后重啟docker
systemctl?daemon-reload
service?docker?restart
重啟之后測試遠程連接是否正常,這里的2375是之前配置的端口
curl?http://localhost:2375/version
看到返回信息基本上就沒有問題了
[root@VM_0_15_centos?elk]#?curl?http://localhost:2375/version
{"Version":"1.13.1","ApiVersion":"1.26","MinAPIVersion":"1.12","GitCommit":"7f2769b/1.13.1","GoVersion":"go1.10.3","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-957.21.3.el7.x86_64","BuildTime":"2019-09-15T14:06:47.565778468+00:00","PkgVersion":"docker-1.13.1-103.git7f2769b.el7.centos.x86_64"}
然后開啟端口,或者關(guān)閉防火墻,二者選其一即可
firewall-cmd?--zone=public?--add-port=2375/tcp?--permanent??
chkconfig?iptables?off
然后打開瀏覽器測試將之前的localhost修改為你的ip
2.2.使用idea連接到docker
首先下載docker插件,idea2019自帶了docker插件。如果沒有插件可以選擇安裝docker插件。
然后配置docker地址,在你的File | Settings | Build, Execution, Deployment | Docker

配置完成鏈接之后,出現(xiàn)了框中的內(nèi)容即可.

鏈接成功之后會列出容器和鏡像!
配置阿里云鏡像加速器:
2.3.docker-maven-plugin 介紹
在我們持續(xù)集成過程中,項目工程一般使用 Maven 編譯打包,然后生成鏡像,通過鏡像上線,能夠大大提供上線效率,同時能夠快速動態(tài)擴容,快速回滾,著實很方便。
docker-maven-plugin 插件就是為了幫助我們在Maven工程中,通過簡單的配置,自動生成鏡像并推送到倉庫中。
pom.xml:
<build>
????????<finalName>${project.artifactId}finalName>
????????<plugins>
????????????<plugin>
????????????????<groupId>org.springframework.bootgroupId>
????????????????<artifactId>spring-boot-maven-pluginartifactId>
????????????????<configuration>
????????????????????<fork>truefork>
????????????????configuration>
????????????plugin>
????????????
????????????<plugin>
????????????????<groupId>org.apache.maven.pluginsgroupId>
????????????????<artifactId>maven-surefire-pluginartifactId>
????????????????<configuration>
????????????????????<skipTests>trueskipTests>
????????????????configuration>
????????????plugin>
????????????
????????????<plugin>
????????????????<groupId>com.spotifygroupId>
????????????????<artifactId>docker-maven-pluginartifactId>
????????????????<version>1.0.0version>
????????????????
????????????????<executions>
????????????????????<execution>
????????????????????????<id>build-imageid>
????????????????????????
????????????????????????<phase>packagephase>
????????????????????????<goals>
????????????????????????????<goal>buildgoal>
????????????????????????goals>
????????????????????execution>
????????????????executions>
????????????????<configuration>
????????????????????
????????????????????<imageName>bruceliu/${project.artifactId}imageName>
????????????????????
????????????????????<imageTags>
????????????????????????<imageTag>latestimageTag>
????????????????????imageTags>
????????????????????
????????????????????<baseImage>javabaseImage>
????????????????????
????????????????????<maintainer>[email protected]maintainer>
????????????????????
????????????????????<workdir>/ROOTworkdir>
????????????????????<cmd>["java",?"-version"]cmd>
????????????????????<entryPoint>["java",?"-jar",?"/${project.build.finalName}.jar"]entryPoint>
????????????????????
????????????????????<dockerHost>http://122.51.50.249:2375dockerHost>
????????????????????
????????????????????<resources>
????????????????????????<resource>
????????????????????????????<targetPath>/targetPath>
????????????????????????????
????????????????????????????<directory>${project.build.directory}directory>
????????????????????????????
????????????????????????????<include>${project.build.finalName}.jarinclude>
????????????????????????resource>
????????????????????resources>
????????????????configuration>
????????????plugin>
????????plugins>
????build>
執(zhí)行Maven打包命令:
G:\softDevelopment\JDK8\bin\java?-Dmaven.multiModuleProjectDirectory=E:\workspace2017\elk-web?-Dmaven.home=E:\Maven20190910\apache-maven-3.6.1?-Dclassworlds.conf=E:\Maven20190910\apache-maven-3.6.1\bin\m2.conf?"-javaagent:G:\idea2017\IntelliJ?IDEA?2017.3.1\lib\idea_rt.jar=49260:G:\idea2017\IntelliJ?IDEA?2017.3.1\bin"?-Dfile.encoding=UTF-8?-classpath?E:\Maven20190910\apache-maven-3.6.1\boot\plexus-classworlds-2.6.0.jar?org.codehaus.classworlds.Launcher?-Didea.version=2017.3.7?-s?E:\Maven20190910\apache-maven-3.6.1\conf\settings.xml?-Dmaven.repo.local=E:\Maven20190910\repository?package
[INFO]?Scanning?for?projects...
[WARNING]?
[WARNING]?Some?problems?were?encountered?while?building?the?effective?model?for?com.bruceliu.elk.demo:elk-web:jar:1.0-SNAPSHOT
[WARNING]?'build.plugins.plugin.(groupId:artifactId)'?must?be?unique?but?found?duplicate?declaration?of?plugin?org.springframework.boot:spring-boot-maven-plugin?@?line?36,?column?21
[WARNING]?
[WARNING]?It?is?highly?recommended?to?fix?these?problems?because?they?threaten?the?stability?of?your?build.
[WARNING]?
[WARNING]?For?this?reason,?future?Maven?versions?might?no?longer?support?building?such?malformed?projects.
[WARNING]?
[INFO]?
[INFO]?---------------------------------------
[INFO]?Building?elk-web?1.0-SNAPSHOT
[INFO]?--------------------------------[?jar?]---------------------------------
[INFO]?
[INFO]?---?maven-resources-plugin:2.6:resources?(default-resources)?@?elk-web?---
[INFO]?Using?'UTF-8'?encoding?to?copy?filtered?resources.
[INFO]?Copying?1?resource
[INFO]?Copying?0?resource
[INFO]?
[INFO]?---?maven-compiler-plugin:3.1:compile?(default-compile)?@?elk-web?---
[INFO]?Changes?detected?-?recompiling?the?module!
[INFO]?Compiling?2?source?files?to?E:\workspace2017\elk-web\target\classes
[INFO]?
[INFO]?---?maven-resources-plugin:2.6:testResources?(default-testResources)?@?elk-web?---
[INFO]?Using?'UTF-8'?encoding?to?copy?filtered?resources.
[INFO]?skip?non?existing?resourceDirectory?E:\workspace2017\elk-web\src\test\resources
[INFO]?
[INFO]?---?maven-compiler-plugin:3.1:testCompile?(default-testCompile)?@?elk-web?---
[INFO]?Nothing?to?compile?-?all?classes?are?up?to?date
[INFO]?
[INFO]?---?maven-surefire-plugin:2.18.1:test?(default-test)?@?elk-web?---
[INFO]?Tests?are?skipped.
[INFO]?
[INFO]?---?maven-jar-plugin:2.6:jar?(default-jar)?@?elk-web?---
[INFO]?Building?jar:?E:\workspace2017\elk-web\target\elk-web.jar
[INFO]?
[INFO]?---?spring-boot-maven-plugin:1.5.4.RELEASE:repackage?(default)?@?elk-web?---
[INFO]?
[INFO]?---?docker-maven-plugin:1.0.0:build?(build-image)?@?elk-web?---
[INFO]?Using?authentication?suppliers:?[ConfigFileRegistryAuthSupplier]
[INFO]?Copying?E:\workspace2017\elk-web\target\elk-web.jar?->?E:\workspace2017\elk-web\target\docker\elk-web.jar
[INFO]?Building?image?bruceliu/elk-web
Step?1/6?:?FROM?java
?--->?d23bdf5b1b1b
Step?2/6?:[email protected]
?--->?Running?in?787e4786fbd4
?--->?4d4519f52fda
Removing?intermediate?container?787e4786fbd4
Step?3/6?:?WORKDIR?/ROOT
?--->?f40dcbc9a9eb
Removing?intermediate?container?7fa6bbc9d1df
Step?4/6?:?ADD?/elk-web.jar?//
?--->?c7f1107ae3d4
Removing?intermediate?container?f370558f1a38
Step?5/6?:?ENTRYPOINT?java?-jar?/elk-web.jar
?--->?Running?in?e4480ced0829
?--->?b634ca5fa5ad
Removing?intermediate?container?e4480ced0829
Step?6/6?:?CMD?java?-version
?--->?Running?in?cc6a064ef921
?--->?cf9a5d50326b
Removing?intermediate?container?cc6a064ef921
Successfully?built?cf9a5d50326b
[INFO]?Built?bruceliu/elk-web
[INFO]?Tagging?bruceliu/elk-web?with?latest
[INFO]?------------------------------------------------------------------------
[INFO]?BUILD?SUCCESS
[INFO]?------------------------------------------------------------------------
[INFO]?Total?time:??10.329?s
[INFO]?Finished?at:?2019-12-29T22:44:06+08:00
[INFO]?------------------------------------------------------------------------
Process?finished?with?exit?code?0
往期推薦
一文匯總 JDK 5 到 JDK 15 中的牛逼功能!
Socket粘包問題終極解決方案—Netty版(2W字)!
不要再用main方法測試代碼性能了,用這款JDK自帶工具
關(guān)注我,每天陪你進步一點點!




