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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP地址管理

TCP/IP中使用IP地址来确定网络上的一台主机 IPV4协议中&#xff0c;32位&#xff08;4个字节&#xff09;源IP地址和32位目的IP地址&#xff0c;也就是可以表示2^3242亿9千万个地址 如今随着互联网甚至物联网的迅速发展&#xff0c;我们面临着IP地址数量不充足的问题&#xf…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

云备份服务端

文件使用工具和json序列化反序列化工具 //文件和json工具类的设计实现 #ifndef __UTIL__ #define __UTIL__ #include<iostream> #include<fstream> #include<string> #include <vector> #include<sys/stat.h> #include"bundle.h" #inc…

热门软件缺陷管理工具2024:专业评测与建议

国内外主流的10款软件缺陷管理工具软件对比&#xff1a;PingCode、Worktile、禅道、Tapd、Teambition、Tower、JIRA、Bugzilla、MantisBT、Trac。 在软件开发过程中&#xff0c;管理缺陷和漏洞常常成为一项挑战&#xff0c;尤其是在项目规模庞大时。选择一个高效的软件缺陷管理…

【Linux环境sqlite下载安装教程】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、下载路径二、安装步骤 一、下载路径 https://sqlite.org/download.html 选择Alternative Source Code Formats下的sqlite-src-3460000.zip进行下载。 二、安…

手机怎么看WiFi的IP地址

在如今数字化快速发展的时代&#xff0c;无线网络已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们可能都离不开WiFi的陪伴。然而&#xff0c;在使用WiFi的过程中&#xff0c;有时我们可能需要查看其IP地址&#xff0c;以便更好地管理我们的网…

Jira学习

1.Dev OPS DevOps简介 DEV OPS 流程 DEV OPS流程对应工具 最重要的就是持续集成–Jenkins 2.Jira 新建项目

华为HCIP Datacom H12-821 卷39

1.填空题 请2001 :0DB8:0000:C030:0000: 000: 09A0:CDEF地址进行压缩。() (若答案中存在字母&#xff0c;请采用大写格式) 参考答案&#xff1a;2001 :DB8:0:C030: :9A0:CDEF 解析&#xff1a; IPv6地址的表示方法 IPv6地址总长度为128比特&#xff0c;通常分为8组&#xff0c…

macos上latex环境搭建(homebrew安装+vscode配置+ MacTex)和B站视频、网站、教程等相关资料推荐(Overleaf、公式预览网站)

安装及配置 本机环境 本人为macos&#xff0c;已经安装了homebrew和vscode。希望得到的效果是在vscode中编辑并预览latex文件 MacTex安装 首先&#xff0c;使用brew安装MacTex(新版本的brew已经将install和install --cask合并了) brew install mactex安装后一般会置于如下…

对于GPT-5在一年半后发布的期待!

首先&#xff0c;如果GPT-5真如OpenAI首席技术官米拉穆拉蒂&#xff08;Mira Murati&#xff09;在采访中所透露的那样&#xff0c;在一年半后发布&#xff0c;并在某些领域达到博士级的智能&#xff0c;这无疑将是一个令人振奋的消息。这一预测不仅反映了AI技术的快速发展&…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】!

项目场景&#xff1a; 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时&#xff0c;会发现这个文件下载的默认保存位置和我们预想的不太一样&#xff0c;容易找不到&#xff0c;而且没有提示&#xff0c;那么我们就需要把文件打开自己保存并且有提示保存到哪个…

leetcode算法题(反转链表)

思路1&#xff1a; 创建新的链表&#xff0c;遍历原链表&#xff0c;将原链表的节点进行头插到新链表中。 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* next NULL;struct ListNode* new_head NULL;if (head NULL ||head->next NULL) // 空…

【C语言】全面解析冒泡排序

文章目录 什么是冒泡排序&#xff1f;冒泡排序的基本实现代码解释冒泡排序的优化冒泡排序的性能分析冒泡排序的实际应用结论 在C语言编程中&#xff0c;排序算法是一个非常基础且重要的概念。冒泡排序作为最简单、最易理解的排序算法之一&#xff0c;广泛应用于各种编程教学和实…

设计模式学习(二)工厂模式——抽象工厂模式

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式 背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块&#xff0c;它可能在Windows下运行&#xff0c;也可能在Linux下运行。由于在厂家提供的SDK中&#xff0c;Windows下的SDK和Linux下…

K8S 中的 CRI、OCI、CRI shim、containerd

哈喽大家好&#xff0c;我是咸鱼。 好久没发文了&#xff0c;最近这段时间都在学 K8S。不知道大家是不是和咸鱼一样&#xff0c;刚开始学 K8S、Docker 的时候&#xff0c;往往被 CRI、OCI、CRI shim、containerd 这些名词搞得晕乎乎的&#xff0c;不清楚它们到底是干什么用的。…

踩坑日记 | 记一次流程图问题排查

踩坑日记&#xff1a;记一次流程图问题排查 标签&#xff1a; activiti | 流程 引言 今天排查了一个流程图问题&#xff0c;耗时2个小时终于解决&#xff0c;记录下来 现象 流程审批驳回报错&#xff1a;Unknown property used in expression: ${xxxx} 使用的是 activiti …

AI视频教程下载-ChatGPT速成课程:工作中的ChatGPT入门

使用ChatGPT提升你的生产力&#xff1a;利用OpenAI的革命性ChatGPT模型。 你准备好深入人工智能交流的世界&#xff0c;彻底改变你的职业生涯了吗&#xff1f;本课程适合技术背景和非技术背景的人士&#xff0c;它以独特、有趣且专业的方式&#xff0c;教授如何使用OpenAI的Ch…

【Linux取经之路】Linux常见指令

目录 基本指令 常见指令 1&#xff09;ls —— 对于目录&#xff0c;列出该目录下的所有子目录和文件&#xff1b;对于文件&#xff0c;将列出文件名及其他信息 2&#xff09;pwd —— 显示当前所在的目录 ​编辑 3&#xff09;cd —— 切换到指定路径下 4&#xff09;t…

服务客户,保证质量:腾讯云产品的质量实践

分享主题是“服务客户&#xff0c;保证质量”。自从20年开始&#xff0c;我们把质量提升到了一个前所未有的高度。为什么会如此重视质量呢&#xff1f;在竞争激烈和复杂的市场环境中&#xff0c;产品质量对于企业的重要性不言而喻。一旦出现了质量事故&#xff0c;对客户和企业…

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展&#xff0c;各种智能应用层出不穷。五子棋作为一款经典的棋类游戏&#xff0c;拥有广泛的爱好者。将人工智能技术与五子棋结合&#xff0c;不仅能提升游戏的趣味性和挑战性&#xff0c;还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…