当前位置: 首页 > news >正文

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就不写路径了。它就没有问题了,为啥原因还没有去深究。

相关文章:

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

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

电影购票小程序论文(设计)开题报告

一、课题的背景和意义 随着互联网技术的不断发展&#xff0c;人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题&#xff0c;而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用&#xff0c;它能够让用户随时随地…...

IP风险画像 金融行业的安全盾牌

在当今数字化时代&#xff0c;金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展&#xff0c;欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息&#xff0c;防止各种形式的欺诈行为。 IP风险画像是…...

探索老年综合评估实训室的功能与价值

一、引言 随着人口老龄化的加剧&#xff0c;老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所&#xff0c;具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 &#xff08;一&#xff09;健康评估功能 1、身体功能评估 通过专业设…...

视频剪辑软件如何选?FCPX和PR更适合新手呢

随着抖音、快手等短视频平台的迅速兴起&#xff0c;短视频数量急剧增加。想要发布一款简单、高质量的短视频&#xff0c;运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere&#xff0c;以及Final Cut Pro X&#xff0c;经常有用户在二者间&#xff0c;不知如何选择&…...

解决第三方模块ts声明文件编译错误问题

最近小卷在用vite脚手架学习vue组件开发&#xff0c;使用的语言框架是typescript。在搭建vitepress在线文档服务时&#xff0c;用到了vitepress-demo-preview模块来展示vue组件示例和源代码。 发现import相关依赖时&#xff0c;会有这样的编译错误&#xff1a; 也就是没找到第…...

数据结构小测试:排序算法

目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a; 归并排序&#xff1a; 堆排序&#xff1a; 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序&#xff…...

电脑远程开关机

1. 远程开机 参考&#xff1a;https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒&#xff08;需要主板支持&#xff0c;一般都支持&#xff09; 要使用远程唤醒&#xff0c;有几种方式&#xff1a;使用类似向日葵开机棒&#xff08;很贵&#xff09;、公网ip&…...

# Redis 入门到精通(四)-- linux 环境安装 redis

Redis 入门到精通&#xff08;四&#xff09;-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1&#xff09;下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…...

SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?

目录 0 问题引入 应用案例1 应用案例2 小结 0 问题引入 在日常数据分析中,经常会遇到数据产品经理或数据分析师提出这样的需求,比如按照某一给定的区间或数据范围对数据进行分类标签,而遇到这样的问题,好多同学感觉SQL做起来有点困难或无从下手,其实面对这样的问题笔者…...

数学建模·灰色关联度

灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色关联分析也可以用于综合评价&#xff0c;但是由于数据预处理的方式不同&#xff0c;导致结果 有较大出入 &#xff0c;故一般不采用 具体步骤 数据预处理…...

EMQX开源版安装

一、EMQX是什么 EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;同时保证毫秒…...

R语言进行集成学习算法:随机森林

# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…...

虚拟机的状态更新

文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新&#xff0c;以获得最新的修复和改进&#xff1b;如果长期没有打开单机或者集群&#xff0c;可以考虑先进行一次更新…...

基于hive数据库的泰坦尼克号幸存者数据分析

进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…...

excel根据数据批量创建并重命名工作表

需求 根据一列数据&#xff0c;批量创建并重命名工作表 做法 1. 右键该sheet&#xff0c;选择查看代码 2. 输入VBA代码 正向创建 Sub create_sheets_by_col()Dim num% 定义为integer*num Application.WorksheetFunction.CountA(Sheet1.Range("A:A")) num是非空…...

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展&#xff0c;智能合约和分布式应用&#xff08;DApps&#xff09;逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议&#xff0c;能够在预设条件满足时自动执行代码&#xff0c;而无需人工干预或中介机构。这种自动化和信任机制极大…...

Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”

1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置” 文章目录 1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”2. 拦截器3. Spring MVC 中的拦截器的创建和基本配置3.1 定义拦截3.2 拦截器基本配置3.3 拦截器的高级配置 4. Spr…...

MyBatis框架学习笔记(四):动态SQL语句、映射关系和缓存

1 动态 SQL 语句-更复杂的查询业务需求 1.1 动态 SQL-官方文档 &#xff08;1&#xff09;文档地址: mybatis – MyBatis 3 | 动态 SQL &#xff08;2&#xff09;为什么需要动态 SQL 动态 SQL 是 MyBatis 的强大特性之一 使用 JDBC 或其它类似的框架&#xff0c;根据不同条…...

【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言

文章目录 Beginning1&#xff09;ASCLL 码2&#xff09;大小比较2&#xff09;判断数字字符3&#xff09;字符、数字间的相互转换End Beginning 在 C 中&#xff0c;字符和整数有着密不可分的关系。原因就是在计算机中&#xff0c;字符是以一种较 ASCLL 码的整数存储的。自然&…...

人像视频淡入淡出效果的灵敏检验方法

在视频中经常会有淡入淡出的效果&#xff0c;这可能导致人脸检测在实际人已经离开画面之后仍然触发&#xff0c;特别是在使用基于像素强度变化的检测算法时。为了更精确地裁剪视频&#xff0c;你可以尝试以下几种方法&#xff1a; 使用更复杂的人脸检测模型&#xff1a; 有些…...

Unity UGUI Image Maskable

在Unity的UGUI系统中&#xff0c;Maskable属性用于控制UI元素是否受到父级遮罩组件的影响。以下是关于这个属性的详细说明和如何使用&#xff1a; Maskable属性 Maskable属性&#xff1a; 当你在GameObject上添加一个Image组件&#xff08;比如UI面板或按钮&#xff09;时&…...

SpringCloud | 单体商城项目拆分(微服务)

为什么要进行微服务拆分&#xff1f; 在平常的商城项目中&#xff0c;我们一般的项目结构模块都是将各种业务放在同一个项目文件夹&#xff0c;比如像&#xff1a; 用户&#xff0c;购物车&#xff0c;商品&#xff0c;订单&#xff0c;支付等业务都是放在一起&#xff0c;这样…...

uniapp 如何实现路由拦截,路由守卫

uniapp框架的全局文件&#xff1a;page.json全局文件&#xff0c;官网链接 背景&#xff1a; 通过封装 UniApp 的路由方法&#xff0c;并在封装方法中添加自定义逻辑&#xff0c;可以实现类似 Vue Router 的路由守卫功能。 在 UniApp 框架中&#xff0c;不像 Vue Router 直接支…...

人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…...

Qt/QML学习-ComboBox

QML学习 ComboBox例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("ComboBox")ComboBox {id: comboBox// 列表项数据模型model: ListModel {List…...

微服务实战系列之玩转Docker(一)

前言 话说计算机的“小型化”发展&#xff0c;历经了大型机、中型机直至微型机&#xff0c;贯穿了整个20世纪的下半叶。同样&#xff0c;伴随着计算机的各个发展阶段&#xff0c;如何做到“资源共享、资源节约”&#xff0c;也一直是一代又一代计算机人的不懈追求和历史使命。今…...

Java中常见的语法糖

文章目录 概览泛型增强for循环自动装箱与拆箱字符串拼接枚举类型可变参数内部类try-with-resourcesLambda表达式 概览 语法糖是指编程语言中的一种语法结构&#xff0c;它们并不提供新的功能&#xff0c;而是为了让代码更易读、更易写而设计的。语法糖使得某些常见的编程模式或…...

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…...

华为OD算法题汇总

60、计算网络信号 题目 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n]&#xff0c;二维数组代表网格地图 array[i][j]0&#xff0c;代表i行j列是空旷位置 a…...