当前位置:   article > 正文

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景

       公司主机管理小组的同事期望我们开发的maven项目能够在1Panel管理的docker容器部署。上一篇写了先开放1Panel中docker镜像构建能力maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网-CSDN博客。这一篇就是演示maven工程的镜像构建、容器运行、运行验证。

      开发工具用的eclipse。

二.创建简单的maven工程

1.新建maven工程

  

2.添加pom依赖

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.scantt</groupId>
  6. <artifactId>hello-docker</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <!-- 为我在dependencyManagement约定springboot版本设置参数 -->
  10. <version.springboot>2.7.0</version.springboot>
  11. <!-- 这里指定了jdk编译的版本,不需要再去maven complie插件去设置了 -->
  12. <maven.compiler.source>1.8</maven.compiler.source>
  13. <maven.compiler.target>1.8</maven.compiler.target>
  14. </properties>
  15. <!-- 用dependencyManagement的方式引入springboot的版本及其关联依赖 -->
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-dependencies</artifactId>
  21. <version>${version.springboot}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. </dependencies>
  26. </dependencyManagement>
  27. <!-- 依赖了spring-boot-starter-web组件,这里就不需要再指定版本了 -->
  28. <dependencies>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. </dependencies>
  34. </project>

3.创建运行入口文件

HelloDockerApplication.java

  1. package com.scantt.docker;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class HelloDockerApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(HelloDockerApplication.class, args);
  8. }
  9. }

4.创建简单的控制层响应文件

HelloController.java

  1. package com.scantt.docker.controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class HelloController {
  6. @GetMapping("/hello")
  7. public String hello(String name) {
  8. return "hello!" + name;
  9. }
  10. }

5.运行maven工程

HelloDockerApplication.java

在HelloDockerApplication.java中右键点击“Run As”=>“Java Application”。

控制台输出如下:

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  3. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  4. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v2.7.0)
  8. 2024-07-15 18:45:27.306 INFO 9640 --- [ main] c.scantt.docker.HelloDockerApplication : Starting HelloDockerApplication using Java 1.8.0_341 on zhaoshiping with PID 9640 (D:\zsp\tools\eclipse_workspaces\base_workspace\hello-docker\target\classes started by Dell in D:\zsp\tools\eclipse_workspaces\base_workspace\hello-docker)
  9. 2024-07-15 18:45:27.306 INFO 9640 --- [ main] c.scantt.docker.HelloDockerApplication : No active profile set, falling back to 1 default profile: "default"
  10. 2024-07-15 18:45:27.944 INFO 9640 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
  11. 2024-07-15 18:45:27.944 INFO 9640 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
  12. 2024-07-15 18:45:27.944 INFO 9640 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
  13. 2024-07-15 18:45:28.037 INFO 9640 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
  14. 2024-07-15 18:45:28.037 INFO 9640 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 693 ms
  15. 2024-07-15 18:45:28.238 INFO 9640 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
  16. 2024-07-15 18:45:28.246 INFO 9640 --- [ main] c.scantt.docker.HelloDockerApplication : Started HelloDockerApplication in 1.143 seconds (JVM running for 1.401)

可见默认端口是8080。

6.浏览器访问

http://127.0.0.1:8080/hello?name=potato

结果如下:

三.maven工程docker构建对接改造

1.为maven工程添加docker插件

      增加了2处,一是properties里面增加了docker插件版本,二是增加了build这一块。整体如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.scantt</groupId>
  6. <artifactId>hello-docker</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <properties>
  9. <!-- 为我在dependencyManagement约定springboot版本设置参数 -->
  10. <version.springboot>2.7.0</version.springboot>
  11. <!-- 这里指定了jdk编译的版本,不需要再去maven complie插件去设置了 -->
  12. <maven.compiler.source>1.8</maven.compiler.source>
  13. <maven.compiler.target>1.8</maven.compiler.target>
  14. <!-- docker插件版本 -->
  15. <version.dockerPlugin>1.4.13</version.dockerPlugin>
  16. </properties>
  17. <!-- 用dependencyManagement的方式引入springboot的版本及其关联依赖 -->
  18. <dependencyManagement>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-dependencies</artifactId>
  23. <version>${version.springboot}</version>
  24. <type>pom</type>
  25. <scope>import</scope>
  26. </dependency>
  27. </dependencies>
  28. </dependencyManagement>
  29. <!-- 依赖了spring-boot-starter-web组件,这里就不需要再指定版本了 -->
  30. <dependencies>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-web</artifactId>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <finalName>${project.artifactId}</finalName>
  38. <plugins>
  39. <plugin>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-maven-plugin</artifactId>
  42. <version>2.6.6</version>
  43. <executions>
  44. <execution>
  45. <goals>
  46. <goal>repackage</goal>
  47. </goals>
  48. </execution>
  49. </executions>
  50. </plugin>
  51. <plugin>
  52. <groupId>com.spotify</groupId>
  53. <artifactId>dockerfile-maven-plugin</artifactId>
  54. <version>${version.dockerPlugin}</version>
  55. <executions>
  56. <execution>
  57. <id>default</id>
  58. <goals>
  59. <goal>build</goal>
  60. <goal>push</goal>
  61. </goals>
  62. </execution>
  63. </executions>
  64. <configuration>
  65. <repository>${groupId}/${project.artifactId}</repository>
  66. <tag>${project.version}</tag>
  67. <buildArgs>
  68. <JAR_FILE>${project.build.finalName}</JAR_FILE>
  69. </buildArgs>
  70. <dockerfile>Dockerfile</dockerfile>
  71. </configuration>
  72. </plugin>
  73. </plugins>
  74. </build>
  75. </project>

2.编写Dockerfile文件

新建文件Dockerfile,放到hello-docker下面(必须放到工程根目录)。内容如下:

  1. # 基础镜像
  2. FROM docker.io/majiajue/jdk1.8
  3. # 环境变量配置
  4. ENV ENV LC_ALL zh_CN.UTF-8
  5. # 主目录
  6. ENV BASE_PATH=/usr/local/app/
  7. # 创建一个存放项目文件的目录
  8. RUN mkdir -p ${BASE_PATH}
  9. # 复制编译打包号的jar包到镜像内/usr/local/app/目录下
  10. # 基于当前项目根目录去复制文件:可以参照deploy.sh 关于docker build说明
  11. COPY target/hello-docker.jar ${BASE_PATH}/hello-docker.jar
  12. # 启动镜像运行的命令
  13. ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar ${BASE_PATH}/hello-docker.jar

3.增加系统环境变量DOCKER_HOST

我这里上篇文章docker的ip和端口是tcp://10.1.230.94:2375

4.build试试

    在工程点击右键选择“Run As”=》“Maven install”

     运行结果会发现其中有类似镜像构建过程的输出日志,部分如下:     

  1. [INFO] Image will be built as com.scantt/hello-docker:0.0.1-SNAPSHOT
  2. [INFO]
  3. [INFO] Step 1/6 : FROM docker.io/majiajue/jdk1.8
  4. [INFO]
  5. [INFO] Pulling from majiajue/jdk1.8
  6. [INFO] Digest: sha256:fc684fe12c95aac86ef506f5a2bc2ec8fa411cdf7f34165f51a0275076dedcb4
  7. [INFO] Status: Image is up to date for majiajue/jdk1.8:latest
  8. [INFO] ---> 2be3cc30c33f
  9. [INFO] Step 2/6 : ENV ENV LC_ALL zh_CN.UTF-8
  10. [INFO]
  11. [INFO] ---> Using cache
  12. [INFO] ---> 30161b4581a1
  13. [INFO] Step 3/6 : ENV BASE_PATH=/usr/local/app/
  14. [INFO]
  15. [INFO] ---> Using cache
  16. [INFO] ---> be747d0679df
  17. [INFO] Step 4/6 : RUN mkdir -p ${BASE_PATH}
  18. [INFO]
  19. [INFO] ---> Using cache
  20. [INFO] ---> 7b513e464747
  21. [INFO] Step 5/6 : COPY target/hello-docker.jar ${BASE_PATH}/hello-docker.jar
  22. [INFO]
  23. [INFO] ---> ac30abcf81e8
  24. [INFO] Step 6/6 : ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar ${BASE_PATH}/hello-docker.jar
  25. [INFO]
  26. [INFO] ---> Running in e208149d02d6
  27. [INFO] ---> Removed intermediate container e208149d02d6
  28. [INFO] ---> f02da726ef9a
  29. [INFO] [Warning] One or more build-args [JAR_FILE] were not consumed
  30. [INFO] Successfully built f02da726ef9a
  31. [INFO] Successfully tagged com.scantt/hello-docker:0.0.1-SNAPSHOT

5.1Panel中去看看镜像

点击“容器”,在右边界面选择“镜像”就可以看到刚刚构建的镜像文件了。

6.1Panel中用镜像创建容器

点击左边“容器”,右边还是选择“容器”,点击“创建容器”按钮

      在容器创建界面,填写如下:

      填写名称、选择镜像文件、指定端口映射、选择网络即可。ip可以自动生成。

7.1Panel中查看容器运行日志

     刚刚创建的容器,默认就运行了。点击右边的“日志”,弹出可以查看日志。

     从日志来看,可以看到启动是正常的。

8.浏览器再访问试试

我的1Panel服务器的ip是10.1.230.94。刚刚创建容器配置的映射端口是9001对应容器的8080端口。所以访问地址就变成了 http://10.1.230.94:9001/hello?name=docker

四.总结

      我们经历了maven创建创建、docker插件使用、1Panel容器创建三个主要过程。实现了eclipse工具中maven工程调用远程docker服务完成镜像文件构建。但pom中,只是简单的将maven插件写在了build中,每次maven工程install都会去构建镜像文件,这里不太合理,下次再写一篇文章,将这个一部分“优雅”一些。

      到这里,勉强达到目的吧!其实过程中遇到很多问题。比如:

      1)docker对接不上,提示0.0.0.0:9527等信息,是没有设置系统环境变量DOCKER_HOST引起的。

      2)构建报错“Could not acquire image ID or digest following build”。我直接把Dockerfile放到工程根目录,对应pom中指定dockerfile就不写路径了。它就没有问题了,为啥原因还没有去深究。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/837057
推荐阅读
相关标签
  

闽ICP备14008679号