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

一.背景

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

      开发工具用的eclipse。

二.创建简单的maven工程

1.新建maven工程

  

2.添加pom依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.scantt</groupId><artifactId>hello-docker</artifactId><version>0.0.1-SNAPSHOT</version><properties><!-- 为我在dependencyManagement约定springboot版本设置参数 --><version.springboot>2.7.0</version.springboot><!-- 这里指定了jdk编译的版本,不需要再去maven complie插件去设置了 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- 用dependencyManagement的方式引入springboot的版本及其关联依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${version.springboot}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 依赖了spring-boot-starter-web组件,这里就不需要再指定版本了 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

3.创建运行入口文件

HelloDockerApplication.java

package com.scantt.docker;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class HelloDockerApplication {public static void main(String[] args) {SpringApplication.run(HelloDockerApplication.class, args);}
}

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

HelloController.java

package com.scantt.docker.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/hello")public String hello(String name) {return "hello!" + name;}}

5.运行maven工程

HelloDockerApplication.java

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

控制台输出如下:

.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.7.0)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)
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"
2024-07-15 18:45:27.944  INFO 9640 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2024-07-15 18:45:27.944  INFO 9640 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-07-15 18:45:27.944  INFO 9640 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.63]
2024-07-15 18:45:28.037  INFO 9640 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-07-15 18:45:28.037  INFO 9640 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 693 ms
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 ''
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这一块。整体如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.scantt</groupId><artifactId>hello-docker</artifactId><version>0.0.1-SNAPSHOT</version><properties><!-- 为我在dependencyManagement约定springboot版本设置参数 --><version.springboot>2.7.0</version.springboot><!-- 这里指定了jdk编译的版本,不需要再去maven complie插件去设置了 --><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><!-- docker插件版本 --><version.dockerPlugin>1.4.13</version.dockerPlugin></properties><!-- 用dependencyManagement的方式引入springboot的版本及其关联依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${version.springboot}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 依赖了spring-boot-starter-web组件,这里就不需要再指定版本了 --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.6.6</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${version.dockerPlugin}</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><repository>${groupId}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}</JAR_FILE></buildArgs><dockerfile>Dockerfile</dockerfile></configuration></plugin></plugins></build>
</project>

2.编写Dockerfile文件

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

# 基础镜像
FROM docker.io/majiajue/jdk1.8# 环境变量配置
ENV ENV LC_ALL zh_CN.UTF-8# 主目录
ENV BASE_PATH=/usr/local/app/# 创建一个存放项目文件的目录
RUN mkdir -p ${BASE_PATH}# 复制编译打包号的jar包到镜像内/usr/local/app/目录下
# 基于当前项目根目录去复制文件:可以参照deploy.sh 关于docker build说明
COPY target/hello-docker.jar ${BASE_PATH}/hello-docker.jar# 启动镜像运行的命令
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”

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

[INFO] Image will be built as com.scantt/hello-docker:0.0.1-SNAPSHOT
[INFO] 
[INFO] Step 1/6 : FROM docker.io/majiajue/jdk1.8
[INFO] 
[INFO] Pulling from majiajue/jdk1.8
[INFO] Digest: sha256:fc684fe12c95aac86ef506f5a2bc2ec8fa411cdf7f34165f51a0275076dedcb4
[INFO] Status: Image is up to date for majiajue/jdk1.8:latest
[INFO]  ---> 2be3cc30c33f
[INFO] Step 2/6 : ENV ENV LC_ALL zh_CN.UTF-8
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> 30161b4581a1
[INFO] Step 3/6 : ENV BASE_PATH=/usr/local/app/
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> be747d0679df
[INFO] Step 4/6 : RUN mkdir -p ${BASE_PATH}
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> 7b513e464747
[INFO] Step 5/6 : COPY target/hello-docker.jar ${BASE_PATH}/hello-docker.jar
[INFO] 
[INFO]  ---> ac30abcf81e8
[INFO] Step 6/6 : ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar ${BASE_PATH}/hello-docker.jar
[INFO] 
[INFO]  ---> Running in e208149d02d6
[INFO]  ---> Removed intermediate container e208149d02d6
[INFO]  ---> f02da726ef9a
[INFO] [Warning] One or more build-args [JAR_FILE] were not consumed
[INFO] Successfully built f02da726ef9a
[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就不写路径了。它就没有问题了,为啥原因还没有去深究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第14天|DCGAN 与漫画头像生成:原理剖析与训练实战

目录 数据集下载 数据处理 构建生成器 构建判别器 模型训练 结果展示 数据集下载 首先尝试卸载已安装的 mindspore 库&#xff0c;然后通过指定的镜像源安装特定版本&#xff08;2.2.14&#xff09;的 mindspore 库。从指定的 URL 下载一个 zip 文件到当前目录下的 ./faces…

SMTP服务器地址与端口号有哪些关系与区别?

SMTP服务器地址如何正确配置&#xff1f;怎么验证服务器的地址&#xff1f; 了解SMTP服务器地址与端口号的关系与区别对于确保邮件系统的正常运作至关重要。AokSend将详细探讨这两者之间的关系和区别&#xff0c;并解释它们在邮件传输过程中的重要性。 SMTP服务器地址&#x…

CSS 技巧与案例详解:开篇介绍

在现代前端开发中,CSS(层叠样式表)作为网页设计和布局的核心技术,扮演着至关重要的角色。无论是初学者还是经验丰富的开发者,掌握并灵活运用各种CSS技巧都能大大提升开发效率和页面效果。本系列文章《CSS技巧与案例详解》旨在为大家提供一站式的CSS知识速查与实用案例,帮…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.9-2.10

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.9 什么是端到端的深度学习&#xff1f;&#xff08;What is end-to-end deep learning?&#x…

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…

LTD官微(网站)云与枢纽云的差别有哪些,我该如何选择?

数字营销的时代&#xff0c;企业需要依赖互联网工具来实现业务增长和客户转化。LTD官微(网站)云和枢纽云正是应对这种需求的两种不同的解决方案&#xff0c;它们在功能和应用场景上有哪些区别呢&#xff1f;我又该如何选择&#xff1f; 官微云&#xff1a;基础内容管理与生意表…

一篇就够mysql高阶知识总结

一、事务的ACID原则 序号原则说明1原子性&#xff08;Atomicity&#xff09;事务是数据库的逻辑工作单位&#xff0c;事务中包括的诸操作要么都做&#xff0c;要么都不做2一致性&#xff08;Consistency&#xff09;事务执行的结果必须是使数据库从一个一致性状态变到另一个一…

19-1 LLM之野望 1 – 微软打开1-bit LLM时代

让我们面对现实吧&#xff0c;数字不会说谎。 尽管市场因人工智能而上涨&#xff0c;但其效应显然尚未转化为价值&#xff0c;因为只有不到4&#xff05;的公司使用人工智能来生产商品和服务。 更糟糕的是&#xff0c;虽然一些大公司确实在拥抱人工智能&#xff0c;但高不可攀…

Java案例斗地主游戏

目录 一案例要求&#xff1a; 二具体代码&#xff1a; 一案例要求&#xff1a; &#xff08;由于暂时没有学到通信知识&#xff0c;所以只会发牌&#xff0c;不会设计打牌游戏&#xff09; 二具体代码&#xff1a; Ⅰ&#xff1a;主函数 package three;public class test {…

HarmonyOS ArkUi @CustomDialog 和promptAction.openCustomDialog踩坑以及如何选择

CustomDialog 内使用Link&#xff0c;如何正常使用 错误使用方式&#xff1a; 定义一个函数&#xff0c;在函数内使用弹窗&#xff0c;如下面代码showDialog&#xff1a; 这种使用方式&#xff0c;无法在自定义的CustomDialog内使用 Link&#xff0c;进行父子双向绑定&#x…

查看仓库文件的改变(git-status , git-diff)

当你在进行项目开发的时候&#xff0c;想看一下自己改了什么&#xff0c;使用cmd进入项目的路径 输入命令回车&#xff0c;前面带有modified&#xff0c;说明后面这个文件被修改了前面带有deleted&#xff0c; 说明这个文件被删除了这是Untracked files&#xff0c; 这部分文…

BUUCTF逆向wp [MRCTF2020]Xor

第一步 查壳&#xff0c;该题是32位&#xff0c;无壳。 第二步 跟进main&#xff0c;发现反汇编不了 通过下图我们可以发现一串类似字符串的东西 第三步 我们看一下汇编 我们可以得到这些信息&#xff1a;flag的长度为27&#xff08;下面是对本条指令cmp edx 27指令的应用…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时&#xff0c;一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找&#xff1f;许多视频创作者感叹&#xff0c;寻找理想的视频素材难度甚至超过了寻找伴侣&#xff01;但不用担心&#xff0c;今天我将为您介绍几个优质的视…

Python 二进制求和

Python 二进制求和 正文 正文 关于进制转换&#xff0c;可以参考这篇 Python进制转换。对于给定的两个二进制数&#xff0c;比如&#xff1a; a 11 b 1求解它们的和并以字符串形式显示。首先二进制表示是以字符串形式存储的&#xff0c;那么我们要进行运算&#xff0c;首先…

发布支持TS的npm包

你现在有这么一个包&#xff0c;已经将他发布在npm上了&#xff0c;周下载量也还比较可观。美中不足的就是&#xff0c;这个包之前使用js写的&#xff0c;现在你想增加TS类型&#xff0c;提升用户使用体验&#xff0c;那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…

华为od机试真题 — 分披萨(Python)

题目描述 “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨&#xff0c;并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。 但是粗心服务员将披萨切成了每块大小都完全不同奇数块&#xff0c;且肉眼能分辨出大小。 由于两人都想吃到最多的披萨&#xff0c;他们商量…

ubuntu 22.04安装Eigen

1 安装 git clone https://gitlab.com/libeigen/eigen.gitcd eigen mkdir build cd build cmake ..sudo make install... -- Installing: /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry -- Installing: /usr/local/include/eigen3/unsupported/Eige…

Puppet: 强大的配置管理工具

文章目录 引言Puppet官网链接Puppet原理架构与组件工作原理 Puppet基础使用安装常用命令清单文件&#xff08;Manifests&#xff09; Puppet高级使用自定义资源类型环境管理幂等性 Puppet的优缺点优点缺点 结论 引言 Puppet是一种开源的配置管理工具&#xff0c;它基于客户端-…

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一&#xff1a;概要 Flume 是一个可配置、可靠、高可用的大数据采集工具&#xff0c;主要用于将大量的数据从各种数据源&#xff08;如日志文件、数据库、本地磁盘等&#xff09;采集到数据存储系统&#xff08;主要为Had…

Leetcoede编程基础0到1——1768. 交替合并字符串 389. 找不同28. 找出字符串中第一个匹配项的下标 242.有效的字母异位词

1768. 交替合并字符串 题目描述&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 输入输出实例&a…