关于java:Docker部署SpringBoot项目的两种方式总结

8次阅读

共计 12809 个字符,预计需要花费 33 分钟才能阅读完成。

欢送微信搜寻公众号【java 版 web 我的项目】获取资源:java 学习视频 / 设计模式笔记 / 算法手册 /java 我的项目

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:示意根底镜像,即运行环境 VOLUME /tmp 创立 /tmp 目录并长久化到 Docker 数据文件夹,因为 Spring Boot 应用的内嵌 Tomcat 容器默认应用 /tmp 作为工作目录 ADD:拷贝文件并且重命名 (ADD elk-web-1.0-SNAPSHOT.jar elk.jar 将利用 jar 包复制到 /elk.jar) EXPOSE:并不是真正的公布端口,这个只是容器部署人员与建设 image 的人员之间的交换,即建设 image 的人员通知容器布署人员容器应该映射哪个端口给外界 ENTRYPOINT:容器启动时运行的命令,相当于咱们在命令行中输出 java -jar xxxx.jar,为了缩短 Tomcat 的启动工夫,增加 java.security.egd 的零碎属性指向 /dev/urandom 作为 ENTRYPOINT

1.3. 构建容器

[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 不反对后盾运行应用程序的问题。-p 8080:8080 示意将容器外部的 8080 端口映射到宿主机器的 8080 端口,这样就能够通过宿主机器间接拜访应 用。–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=}” 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<java.util.Map<java.lang.String, java.lang.Object>> 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.Docker 近程连贯并且应用 idea 一键部署

2.1. 配置 docker 近程连贯端口

首先编辑咱们服务器上的 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″}

而后开启端口,或者敞开防火墙,二者选其一即可

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 配置实现链接之后,呈现了框中的内容即可. 链接胜利之后会列出容器和镜像!

配置阿里云镜像加速器:

2.3.docker-maven-plugin 介绍

在咱们继续集成过程中,我的项目工程个别应用 Maven 编译打包,而后生成镜像,通过镜像上线,可能大大提供上线效率,同时可能疾速动静扩容,疾速回滚,着实很不便。docker-maven-plugin 插件就是为了帮忙咱们在 Maven 工程中,通过简略的配置,主动生成镜像并推送到仓库中。

pom.xml:

<build>

<finalName>${project.artifactId}</finalName>

<plugins>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<!– 跳过单元测试 –>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>

<!– 应用 docker-maven-plugin 插件 –>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!– 将插件绑定在某个 phase 执行 –>
<executions>
<execution>
<id>build-image</id>
<!– 用户只需执行 mvn package,就会主动执行 mvn docker:build–>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!– 指定生成的镜像名 –>
<imageName>bruceliu/${project.artifactId}</imageName>
<!– 指定标签 –>
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!– 指定根底镜像 jdk1.8–>
<baseImage>java</baseImage>
<!– 镜像制作人自己信息 –>
<maintainer>bruceliu@email.com</maintainer>
<!– 切换到 ROOT 目录 –>
<workdir>/ROOT</workdir>
<cmd>[“java”, “-version”]</cmd>
<entryPoint>[“java”, “-jar”, “/${project.build.finalName}.jar”]</entryPoint>
<!– 指定近程 docker api 地址 –>
<dockerHost>http://122.51.50.249:2375</dockerHost>
<!– 这里是复制 jar 包到 docker 容器指定目录配置 –>
<resources>
<resource>
<targetPath>/</targetPath>
<!–jar 包所在的门路 此处配置的 即对应 target 目录 –>
<directory>${project.build.directory}</directory>
<!– 用于指定须要复制的文件 须要蕴含的 jar 包,这里对应的是 Dockerfile 中增加的文件名 –>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

</plugins>
</build>

执行 Maven 打包命令:

G:softDevelopmentJDK8binjava -Dmaven.multiModuleProjectDirectory=E:workspace2017elk-web -Dmaven.home=E:Maven20190910apache-maven-3.6.1 -Dclassworlds.conf=E:Maven20190910apache-maven-3.6.1binm2.conf “-javaagent:G:idea2017IntelliJ IDEA 2017.3.1libidea_rt.jar=49260:G:idea2017IntelliJ IDEA 2017.3.1bin” -Dfile.encoding=UTF-8 -classpath E:Maven20190910apache-maven-3.6.1bootplexus-classworlds-2.6.0.jar org.codehaus.classworlds.Launcher -Didea.version=2017.3.7 -s E:Maven20190910apache-maven-3.6.1confsettings.xml -Dmaven.repo.local=E:Maven20190910repository 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] ——————-< com.bruceliu.elk.demo:elk-web >——————–
[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:workspace2017elk-webtargetclasses
[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:workspace2017elk-websrctestresources
[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:workspace2017elk-webtargetelk-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:workspace2017elk-webtargetelk-web.jar -> E:workspace2017elk-webtargetdockerelk-web.jar
[INFO] Building image bruceliu/elk-web
Step 1/6 : FROM java
—> d23bdf5b1b1b
Step 2/6 : MAINTAINER bruceliu@email.com
—> 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

作者:LemonSquash
出处:https://www.cnblogs.com/npeng/p/14267007.html

近期热文举荐:
SpringCloud 微服务电商我的项目教程

正文完
 0