0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SpringBoot+Docker实现一次构建到处运行~

jf_ro2CN3Fa 来源:CSDN 2023-08-30 17:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


一、容器化部署的好处

Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

最重要的是一致的运行环境。Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而达到真正意义上的 一次构建,到处执行。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二、构建镜像

2.1、Dockerfile

接着我们开始使用 Dockerfile 来定制我们的镜像,从而达到容器化的目的。Dockerfile 的本质就是将一系列修改、安装、构建、操作的命令整合到一起,去构建一个个性化的镜像,以达到一次构建,到处运行。 接下来我们就来构建自定义镜像。

在my-project-server模块下创建docker目录,在docker目录下创建Dockerfile。代码如下:

FROMopenjdk:8-jre

MAINTAINERMicromaple@qq.com>

RUNmkdir/app

COPYmy-project-server-1.0.0-SNAPSHOT.jar/app/app.jar

ENTRYPOINT["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar","--spring.profiles.active=prod,druid-prod"]

EXPOSE8899
  • FROM:指定基础镜像,项目是使用jdk8开发的项目,所以我们指定的基础镜像为openjdk:8-jre
  • MAINTAINER:项目维护人员
  • RUN:执行命令,在根目录下创建app目录
  • COPY:将宿主机当前目录下的my-project-server-1.0.0-SNAPSHOT.jar文件拷贝到app目录下,并重命名为app.jar
  • ENTRYPOINT:指定容器启动程序及参数
  • EXPOSE:指定运行时容器提供服务的端口

2.2、开始构建

在虚拟机创建目录

mkdir-p/usr/local/docker/my-project/docker

将打包后的my-project-server-1.0.0-SNAPSHOT.jar文件和Dockerfile文件上传至该目录。

99a574ca-46dc-11ee-a2ef-92fbcf53809c.png

执行镜像构建命令

dockerbuild-tmy-project-server:v1.

构建成功

$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv1ed30386b06d211secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

三、搭建私服

3.1、搭建 Docker Registry

创建目录

mkdir-p/usr/local/docker/registry

在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:

cd/usr/local/docker/registry
version:'3.1'
services:
registry:
image:registry
restart:always
container_name:registry
ports:
-5000:5000
volumes:
-./data:/var/lib/registry

启动容器

docker-composeup-d

3.2、搭建 Docker Registry WebUI

创建目录

mkdir-p/usr/local/docker/docker-registry-frontend

在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:

cd/usr/local/docker/docker-registry-frontend
version:'3.1'
services:
frontend:
image:konradkleine/docker-registry-frontend:v2
ports:
-8080:80
volumes:
-./certs/frontend.crt:/etc/apache2/server.crt:ro
-./certs/frontend.key:/etc/apache2/server.key:ro
environment:
-ENV_DOCKER_REGISTRY_HOST=192.168.110.158(Docker仓库的IP)
-ENV_DOCKER_REGISTRY_PORT=5000

需要将ENV_DOCKER_REGISTRY_HOST的值更改为自己搭建的 DockerRegistry 服务的IP

启动容器

docker-composeup-d

浏览器访问http://192.168.110.158:8080/,效果如下:

99b7b73e-46dc-11ee-a2ef-92fbcf53809c.png

3.3、客户端配置

在需要上传 Docker 镜像的客户端需配置daemon.json,完整路径在 /etc/docker/daemon.json

vi/etc/docker/daemon.json

需增加如下内容:

"insecure-registries":[
"Docker仓库的IP:5000"
]

完整daemon.json内容:

{
"registry-mirrors":[
"https://xxx.mirror.aliyuncs.com"
],
"insecure-registries":[
"192.168.110.158:5000"
]
}
  • registry-mirrors:为镜像加速地址,这里为我自己申请的加速地址。大家可以自己申请一个,也可以在网上找一个。
  • insecure-registries:Docker仓库的IP。

重新启动服务

systemctldaemon-reload
systemctlrestartdocker

3.4、上传私服

搭建以及配置完成后,需要将我们之前构建的镜像上传至我们自己的Docker仓库。

查看镜像

$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
my-project-serverv16af7d633afb75secondsago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
1)、镜像标记

使用 docker tag 将 my-project-server:v1 这个镜像标记为 192.168.110.158:5000/my-project-server:v1。

192.168.110.158为我的Docker仓库的IP。

格式为:docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

命令如下:

dockertagmy-project-server:v1192.168.110.158:5000/my-project-server:v1

标记后,查看镜像

$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
192.168.110.158:5000/my-project-serverv16af7d633afb73minutesago334MB
my-project-serverv16af7d633afb73minutesago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB
2)、镜像上传

使用 docker push 上传镜像。

$dockerpush192.168.110.158:5000/my-project-server
Thepushreferstorepository[192.168.110.158:5000/my-project-server]
5b9e874b9f9c:Pushed
e87c042d22f8:Pushed
b4cfcb8385a8:Pushed
2b730cf18c09:Pushed
edeaba958753:Pushed
8bf42db0de72:Pushed
31892cc314cb:Pushed
11936051f93b:Pushed
v1:digest:sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40size:2000
3)、查看镜像

使用 curl 查看 192.168.110.158:5000/v2/_catalog 地址,可以看到上传成功的镜像

$curl192.168.110.158:5000/v2/_catalog
{"repositories":["my-project-server"]}

这里我们可以成功的看到我们上传的镜像。

我们也可以在我们刚刚搭建的WebUI上可视化的查看我们的镜像。效果图如下:

99d09092-46dc-11ee-a2ef-92fbcf53809c.png
4)、验证

此时我们将本地镜像删除,尝试从私有仓库下载这个镜像

先删除已有镜像

dockerrmimy-project-server:v1192.168.110.158:5000/my-project-server:v1

下载镜像

dockerpull192.168.110.158:5000/my-project-server:v1
$dockerpull192.168.110.158:5000/my-project-server:v1
v1:Pullingfrommy-project-server
0e29546d541c:Alreadyexists
9b829c73b52b:Alreadyexists
cb5b7ae36172:Alreadyexists
99ce012bef04:Alreadyexists
22dc2a72d098:Alreadyexists
9c69a57e10d9:Alreadyexists
776f54050ab5:Pullcomplete
65a83a9a7871:Pullcomplete
Digest:sha256:5c8a0efff409649a389d0bc74dda94ca96e67e87c92673b4c7dad0078657af40
Status:Downloadednewerimagefor192.168.110.158:5000/my-project-server:v1
192.168.110.158:5000/my-project-server:v1
$dockerimages
REPOSITORYTAGIMAGEIDCREATEDSIZE
192.168.110.158:5000/my-project-serverv16af7d633afb715minutesago334MB
openjdk8-jre26ac3f63d29f9monthsago273MB

我们可以看到可以正常拉取。

四、容器启动

镜像构建并上传至完成后,可以直接使用Docker Compose来启动容器。实现一次构建到处运行。

创建目录

mkdir-p/usr/local/docker/my-project

在该目录下创建Docker Registry 的 docker-compose.yml。内容如下:

cd/usr/local/docker/my-project
version:'3.1'
services:
my_project_server:
image:192.168.110.158:5000/my-project-server:v1
container_name:my-project-server
restart:always
ports:
-8899:8899
volumes:
-./logs:/logs
environment:
TZ:Asia/Shanghai

启动容器

docker-composeup-d

查看容器启动状态

dockerps-a

访问查询所有用户接口

  • http://ip:8899/sys-user/get/all
99e7d158-46dc-11ee-a2ef-92fbcf53809c.png


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 容器
    +关注

    关注

    0

    文章

    536

    浏览量

    23026
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    16052
  • 虚拟机
    +关注

    关注

    1

    文章

    975

    浏览量

    30692
  • SpringBoot
    +关注

    关注

    0

    文章

    178

    浏览量

    712

原文标题:SpringBoot + Docker 实现一次构建到处运行~

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一次调频如何影响我们的日常生活?

    守护者”——一次调频。很多人没听过它的名字,但它每时每刻都在默默工作,用毫秒级的响应守护着我们的日常生活。今天就用大白话聊聊,一次调频到底怎么影响我们的日常用电。
    的头像 发表于 04-07 14:58 558次阅读
    <b class='flag-5'>一次</b>调频如何影响我们的日常生活?

    一次调频vs二调频,电力调节的“兄弟组合”有何不同?

    在电力系统的频率稳定保障体系中,一次调频与二调频就像对默契配合的“兄弟组合”:个冲锋在前、极速响应,个沉稳跟进、精准收官,共同守护电
    的头像 发表于 03-30 15:21 679次阅读
    <b class='flag-5'>一次</b>调频vs二<b class='flag-5'>次</b>调频,电力调节的“兄弟组合”有何不同?

    如何判断一次消谐器是否工作正常?

    判断一次消谐器是否正常,其实就看它有没有“扛住”系统电压、及时“泄放”谐振能量,同时自己保持“健康”状态。核心方法是‌外观检查、电气参数测试和运行状态观察‌三管齐下。
    的头像 发表于 01-22 10:27 324次阅读
    如何判断<b class='flag-5'>一次</b>消谐器是否工作正常?

    新思科技分享实现AI芯片一次流片成功的十大策略

    带来错失融资机会、产品上市延期以及由此导致的市场份额流失等严重后果。 随着越来越多的芯片公司和初创企业投入到 AI 芯片开发中,一次流片成功已经成为技术、财务和商业层面的刚性要求。 以下是开发 AI 芯片时实现一次流片成功的十条
    的头像 发表于 01-19 11:08 877次阅读

    光伏一次调频设备/一次调频装置|光伏一次调频涉网试验/光伏电站一次调频建设改造方案

    2025年以来能源局下发通知要求10KV以上的新能源厂站要具备一次调频能力,并递交涉网试验报告。对于投资规模不大的工商业分布式光伏电站,又要面临改造投资问题,压力较大。如何选择质优价廉的一次调频产品
    的头像 发表于 01-17 08:54 1624次阅读
    光伏<b class='flag-5'>一次</b>调频设备/<b class='flag-5'>一次</b>调频装置|光伏<b class='flag-5'>一次</b>调频涉网试验/光伏电站<b class='flag-5'>一次</b>调频建设改造方案

    光伏一次调频设备,光伏电站一次调频建设改造方案

    的输出。这里的发电机组在火力水力发电系统中是指同步发电机。在光伏发电中是指逆变器,在储能和风力发电系统中是指PCS变流设备。 二:一次调频装置 这是台在光伏电站中正在运行
    发表于 01-16 20:06

    一次消谐器对电力系统的核心贡献

    一次消谐器(又称 PT 一次消谐装置)是安装在电压互感器一次侧中性点与地之间的非线性电阻设备,主要应用于3-66kV 中性点不接地或经消弧线圈接地的中压配电网,对保障电力系统安全稳定运行
    的头像 发表于 01-07 06:40 568次阅读
    <b class='flag-5'>一次</b>消谐器对电力系统的核心贡献

    解析一次消谐和二消谐的差异与应用场景

    在电力系统中,消谐装置是保障系统稳定运行的关键设备,它可以有效消除谐振过电压,避免因谐振引发的设备损坏和停电事故。一次消谐器和微机消谐装置,都可以用于PT柜,保护电压互感器。 一次消谐器和微机消谐
    的头像 发表于 12-11 11:33 646次阅读

    如何使用SpringBoot、Vue2.0、MySQL开发套云诊所系统?

    ​ 如何使用Java语言;前端框架:Vue2.0;后端框架:SpringBoot;数 据 库: MySQL 这些技术开发套云诊所系统? 技术栈分析: 后端:SpringBoot
    的头像 发表于 11-27 16:02 401次阅读
    如何使用<b class='flag-5'>SpringBoot</b>、Vue2.0、MySQL开发<b class='flag-5'>一</b>套云诊所系统?

    深入剖析Docker全链路安全防护策略

    在云原生时代,Docker容器安全已成为运维工程师必须面对的核心挑战。本文将从实战角度深入剖析Docker全链路安全防护策略,涵盖镜像构建、容器运行、网络隔离等关键环节,助你
    的头像 发表于 08-18 11:17 1264次阅读

    智能客服驱动效率和体验升级,上海电信+昇腾AI的一次民生应用实践

    上海电信+昇腾AI的一次民生应用实践
    的头像 发表于 07-30 23:44 3069次阅读
    智能客服驱动效率和体验升级,上海电信+昇腾AI的<b class='flag-5'>一次</b>民生应用实践

    参考STM32 MPU生态资源利用Yocto构建STM32MP2芯片镜像运行docker

    的搭建。 拉取Yocto所需的配置数据库 接下来根据OpenSTLinux distribution 指南中的介绍,下载STM32MPU的Yocto开发所需的meta数据库(其中包含构建系列配置
    发表于 05-10 16:47

    一次消谐装置与二消谐装置区别、一次消谐器与二消谐器的区别

    ~35kV中性点不接地系统;二消谐器适用于复杂谐振工况,可区分谐振类型并智能动作。 两者常配合使用,一次消谐提供基础防护,二消谐实现精准抑制,共同保障系统安全。
    的头像 发表于 05-07 09:58 4889次阅读
    <b class='flag-5'>一次</b>消谐装置与二<b class='flag-5'>次</b>消谐装置区别、<b class='flag-5'>一次</b>消谐器与二<b class='flag-5'>次</b>消谐器的区别

    Docker Compose的常用命令

    。它通过个配置文件(docker-compose.yml)来详细定义多个容器之间的关联、网络设置、服务端口等信息。使用条简单的命令,就可以轻松启动、停止和管理这些容器,极大地简化了多容器应用的部署与管理流程,方便
    的头像 发表于 04-30 13:40 1384次阅读

    看门狗存在问题,设备第一次设置后正常,再次运行提示ValueError: WDT id is used,怎么解决?

    看门狗存在问题,设备第一次设置后正常,再次运行提示ValueError: WDT id is used,重启也无法恢复
    发表于 04-29 07:17