IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈有来商城线上部署方式

简介: IDEA 集成 Docker 插件实现一键远程部署 SpringBoot 应用,无需三方依赖,开源微服务全栈有来商城线上部署方式

一. 前言

最近有些童鞋对开源微服务商城项目 youlai-mall 如何部署到线上环境以及项目中 的Dockerfile 文件有疑问,所以写了这篇文章做个答疑以及演示完整的微服务项目发布到线上的流程,当然除此之外也为后续的项目更新计划做一些基础工作。


其实之前是写了 关于 IDEA 整合Docker插件和 docker-maven-plugin 依赖构建镜像实现一键部署 SpringBoot 应用。


Docker实战 | 第三篇:IDEA集成 Docker 插件实现一键自动打包部署微服务项目


但是上篇文章的“ 一键部署”是有些夸大的,实践过的童鞋应该清楚,在 IDEA 集成 Docker 和项目添加 docker-maven-plugin 依赖基础上,部署SpringBoot 应用还需要经过 镜像构建 → 容器配置 → 手动启动容器 这些步骤,所以离一键部署相差甚远。


本篇提供的方案中 IDEA 只需安装 Docker 插件,项目不用添加 docker-maven-plugin 和dockerfile-maven-plugin 依赖,且在完成首次的相关配置之后,后续只需点击一下 IDEA 的 Run 按钮 ▶️就可以将应用部署远程服务器并且启动,让部署线上应用就是随手点一下的事情。


二. Docker 配置

IDEA 需要连接 Docker 服务器来完成推送镜像和一些交互,需要 Docker 开启远程监听,如果是专网还好,但是公网下开启监听时一定要启用 TLS 协议进行安全加密传输,否则被黑基本上是早晚的事情。


下面是轻身经历得到的教训总结,有想找点乐子的童鞋可以看一下:


Docker实战 | 第五篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结


1. Docker 开启远程访问

访问 Docker 配置文件 docker.service


vim /usr/lib/systemd/system/docker.service

1

在 ExecStart=/usr/bin/dockerd 追加 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock


微信图片_20230710080136.png


重启 Docker 让配置生效


systemctl daemon-reload

systemctl restart docker

1

2

查看 Docker 远程访问服务是否开启


# 查看服务端口监听是否开启

lsof -i:2375

# CURL测试是否生效

curl http://127.0.0.1:2375/info


2. Docker 启用 TLS

传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。


设置主机名


输入命令 hostname 查看服务器主机名,如果存在则忽略,没有则需设置主机名


vim/etc/hostname

1

微信图片_20230710080142.png


修改配置之后重启生效


TLS 证书生成


创建 TLS 证书存放目录


mkdir -p /etc/docker/cert

1

创建 TLS 证书生成脚本


vim /etc/docker/create_tls_cert.sh

1

添加内容


#!/bin/bash

set -e

if [ -z $1 ];then

       echo "请输入 Docker 服务器主机名"

       exit 0

fi

HOST=$1

# 生成证书的目录 /etc/docker/cert

cd /etc/docker/cert

openssl genrsa -aes256 -out ca-key.pem 4096

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

openssl genrsa -out server-key.pem 4096

openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

# 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功

echo subjectAltName = DNS:$HOST,IP:0.0.0.0 > extfile.cnf

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf

openssl genrsa -out key.pem 4096

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth > extfile.cnf

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf

rm -v client.csr server.csr

chmod -v 0400 ca-key.pem key.pem server-key.pem

chmod -v 0444 ca.pem server-cert.pem cert.pem


执行 create_tls_cert.sh 证书生成脚本


# f.youlai.tech 为 Docker 服务器主机名

sh /etc/docker/create_tls_cert.sh f.youlai.tech

1

2


红色框部分需要设置证书密码,可以为了方便,填写一致的就行。


进入目录 /etc/docker/cert 把本地需要的3个证书文件 ca.pem 、cert.pem、key.pem 下载到本地文件夹下 , 我的文件夹是 D:\项目资料\Docker证书\f.youlai.tech


微信图片_20230710080243.png


配置 Docker 启用 TLS监听


访问 Docker 配置文件 docker.service


vim /usr/lib/systemd/system/docker.service

1

在 ExecStart=/usr/bin/dockerd 修改和追加内容如下


ExecStart=/usr/bin/dockerd \

       --tlsverify --tlscacert=/etc/docker/cert/ca.pem \

       --tlscert=/etc/docker/cert/server-cert.pem \

       --tlskey=/etc/docker/cert/server-key.pem \

       -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock


微信图片_20230710080413.png

重载配置和重启 Docker 生效


systemctl daemon-reload

systemctl restart docker

1

2

查看监听是否开启


lsof -i:2376

1

微信图片_20230710080411.png


三. IDEA 配置

1. 安装 Docker 插件

微信图片_20230710080432.png


安装后重启 IDEA 让插件生效


2. Docker 服务器连接配置

打开 File → Setting → Build,Execution,Deployment → Docker → +


微信图片_20230710080436.png


Engine API URL : Docker 服务器远程监听地址

Certificates folder : 上文下载 Docker 的证书的文件件

四. SpringBoot 应用部署

1. Dockerfile 文件

在项目根目录添加 Dockerfile 文件


微信图片_20230710080456.png


完整内容如下:


# 基础镜像

FROM openjdk:8-jre


# 维护者信息

MAINTAINER youlai


# 设置容器时区为当前时区

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone


# /tmp 目录作为容器数据卷目录,SpringBoot内嵌Tomcat容器默认使用/tmp作为工作目录,任何向 /tmp 中写入的信息不会记录进容器存储层

# 在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录

VOLUME /tmp


# 复制主机文件至镜像内,复制的目录需放置在 Dockerfile 文件同级目录下

ADD target/admin-boot.jar app.jar


# 容器启动执行命令

ENTRYPOINT ["java", "-Xmx128m", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]


# 声明容器提供服务端口

EXPOSE 8800

2. pom.xml文件

添加 spring-boot-maven-plugin 依赖为SpringBoot 应用打包,指定 finalName 不带版本号,这样打包出的 jar 包名称就没有版本号。


   ${project.artifactId}

   

       

           org.springframework.boot

           spring-boot-maven-plugin

       

   



3. Run/Debug Configurations 配置

Run/Debug Configurations 运行/调试 配置


微信图片_20230710080548.png


Dockerfile 配置


微信图片_20230710080551.png

/

添加执行目标 Maven Goal

微信图片_20230710080554.png



Command line 输入 clean package -U -DskipTests

微信图片_20230710080559.png



点击 OK 保存配置,至此,已完成所有的配置,接下来就是一键部署。


4. SpringBoot应用一键构建部署

工具栏 Run/Debug 选择上文的 Docker配置

微信图片_20230710080652.png


点击 ▶️开始执行


微信图片_20230710080655.png


稍等一会儿,就可以看到启动的容器

微信图片_20230710080657.png



Nacos 注册中心可以看到youlai-admin服务在线

微信图片_20230710080700.png



五. 总结

本篇通过 IDEA 集成 Docker 插件和通过 Dockerfile的方式一键完成 SpringBoot应用的打包 → 构建镜像 → 容器创建和启动 的整套应用部署的流程,没有第三方 maven 依赖,可以说非常的简单便捷,再不会对频繁的应用部署而感到头疼。当然写这篇文章的目的除了解释开源微服务商城 youlai-mall 项目中的 Dockerfile 作用和有来商城微服务是如何部署到线上之外,还有就是为后续的 ELK + Filebeat实现日志收集和线上环境远程调试等等做好基础工作,具体的在后续文章说明。


附录:

1. 开源项目

项目名称 码云(Gitee) Github

微服务后台 youlai-mall youlai-mall

系统管理前端 youlai-mall-admin youlai-mall-admin

微信小程序 youlai-mall-weapp youlai-mall-weapp


相关文章
|
2月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
2月前
|
Prometheus 监控 Kubernetes
Prometheus 在微服务架构中的应用
【8月更文第29天】随着微服务架构的普及,监控和跟踪各个服务的状态变得尤为重要。Prometheus 是一个开源的监控系统和时间序列数据库,非常适合用于微服务架构中的监控。本文将详细介绍 Prometheus 如何支持微服务架构下的监控需求,包括服务发现、服务间的监控指标收集以及如何配置 Prometheus 来适应这些需求。
58 0
|
2月前
|
监控 JavaScript 测试技术
从单体应用迁移到微服务的最佳实践
【8月更文第29天】随着软件架构的发展,越来越多的企业开始考虑从传统的单体应用迁移到微服务架构。虽然迁移可以带来诸如更好的可扩展性、更高的灵活性等优势,但这一过程也可能充满挑战。本文将详细介绍如何顺利地进行这一转变,并提供一些实用的步骤和示例代码。
73 0
|
22天前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
22 5
|
22天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
29 3
|
27天前
|
Cloud Native 持续交付 云计算
云原生之旅:从传统应用到容器化微服务
随着数字化转型的浪潮不断推进,企业对IT系统的要求日益提高。本文将引导你了解如何将传统应用转变为云原生架构,重点介绍容器化和微服务的概念、优势以及实施步骤,旨在帮助读者掌握将应用迁移到云平台的关键技巧,确保在云计算时代保持竞争力。
22 5
|
27天前
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
34 1
|
2月前
|
存储 消息中间件 前端开发
Web2py框架下的神秘力量:如何轻松集成第三方API,让你的应用不再孤单!
【8月更文挑战第31天】在开发现代Web应用时,常需集成第三方服务如支付网关、数据存储等。本文将指导你使用Web2py框架无缝接入第三方API。通过实例演示从注册获取API密钥、创建控制器、发送HTTP请求到处理响应的全过程。利用`requests`库与Web2py的内置功能,轻松实现API交互。文章详细介绍了如何编写RESTful控制器,处理API请求及响应,确保数据安全传输。通过本教程,你将学会如何高效整合第三方服务,拓展应用功能。欢迎留言交流心得与建议。
37 1
|
18天前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
1月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
111 0
下一篇
无影云桌面