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

    文章

    495

    浏览量

    22061
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14341
  • 虚拟机
    +关注

    关注

    1

    文章

    916

    浏览量

    28181
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    177

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

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

收藏 人收藏

    评论

    相关推荐

    Docker运行环境安装

    作者:京东科技 林中 Docker个开放的平台,用于开发、发布和运行应用程序。Docker分离了应用程序和运行应用的基础设施,从而
    的头像 发表于 10-29 11:28 214次阅读

    一次电源与二电源有什么不同

    在电力系统和电子设备的供电领域中,一次电源与二电源是两个至关重要的概念。它们各自承担着不同的功能和角色,共同确保电力供应的稳定性和可靠性。本文将对一次电源与二电源的定义、区别以及它
    的头像 发表于 10-10 14:10 1871次阅读

    一次电池分类以及应用场景详解

    01 一次电池简介 一次电池即原电池(primarycell、primarybattery)(俗称干电池),是放电后不能再充电使其复原的电池,通电电池有正极、负极电解以及容器和隔膜等组成。 一次电池
    的头像 发表于 09-30 17:52 676次阅读
    <b class='flag-5'>一次</b>电池分类以及应用场景详解

    手动构建Docker镜像的方法

    不推荐使用docker commit命令,而应该使用更灵活、更强大的dockerfile来构建docker镜像。
    的头像 发表于 08-05 15:30 523次阅读
    手动<b class='flag-5'>构建</b><b class='flag-5'>Docker</b>镜像的方法

    ARM平台实现Docker容器技术

    Docker的镜像提供了除内核外完整的运行时环境,确保环境致性,从而不会在出现“这段代码在我机器上没问题”这类问题。 持续支付和部署:对开发和运维人员来说,最希望就是一次创建和部署,
    发表于 07-25 14:36

    ARM平台实现Docker容器技术

    Docker的镜像提供了除内核外完整的运行时环境,确保环境致性,从而不会在出现“这段代码在我机器上没问题”这类问题。持续支付和部署:对开发和运维人员来说,最希望就是一次创建和部署,可
    发表于 07-17 11:05

    一次消谐器的构造

    今天来给大家介绍一下一次消谐器的构造。 一次消谐器是种用于消除电力系统中的谐波及无功功率的装置,它由感性元件和电容器构成,感性元件用于吸收系统中的无功功率,而电容器则用于补偿系统中的感性无功功率
    的头像 发表于 05-30 14:55 411次阅读

    鸿蒙OS开发:【一次开发,多端部署】(视频应用)

    提供了“一次开发,多端部署”的系统能力,让开发者可以基于一次开发,快速构建不同类型终端上的应用,降低开发成本,提高开发效率。
    的头像 发表于 05-25 16:29 4538次阅读
    鸿蒙OS开发:【<b class='flag-5'>一次</b>开发,多端部署】(视频应用)

    HarmonyOS开发案例:【一次开发,多端部署(视频应用)】

    提供了“一次开发,多端部署”的系统能力,让开发者可以基于一次开发,快速构建不同类型终端上的应用,降低开发成本,提高开发效率。
    的头像 发表于 05-11 15:41 1464次阅读
    HarmonyOS开发案例:【<b class='flag-5'>一次</b>开发,多端部署(视频应用)】

    基波是一次谐波么 基波与一次谐波的区别

    基波是一次谐波么 基波与一次谐波的区别  基波和一次谐波是两个不同的概念。 基波是在谐波分析中指的是频率最低且没有任何谐波成分的波形,它是构成复杂波形的基础。在正弦波中,基波就是正弦波的本身。基波
    的头像 发表于 04-08 17:11 7582次阅读

    ARM平台实现Docker容器技术

    ,亦可实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。使用Docker,可像管理应用程序样管理基础结构。通过利用Docker的快速发布、测试和部署代码的方法,可显著减少产
    的头像 发表于 03-07 13:48 803次阅读
    ARM平台<b class='flag-5'>实现</b><b class='flag-5'>Docker</b>容器技术

    分析一次消谐器功能,材料、安装方式以及特点!

    ,以防止在电网运行中因系统故障  或运行状态突变产生的零序电压导致PT过饱和,进而可能产生铁磁谐振过电压。 一次消谐核心部件是种高容量非线性电阻器,这种电阻器能够在电网
    的头像 发表于 03-06 15:24 728次阅读

    变电一次接线图:变电站主接线和站用电接线运行

    在发电厂和变电站中,由各种一次电气设备及其连接线所组成的输送和分配电能的电路,称为电气一次回路。
    发表于 01-17 10:29 3006次阅读
    变电<b class='flag-5'>一次</b>接线图:变电站主接线和站用电接线<b class='flag-5'>运行</b>

    请问docker是怎么实现cpu隔离的?

    Docker 使用 cgroups(控制组)来实现 CPU 隔离。
    的头像 发表于 01-15 10:06 523次阅读

    一次消谐器在电气设备中的作用

    在电力系统中,谐波问题直困扰着电气设备的稳定运行。为了解决这问题,一次消谐器应运而生,成为电气设备中不可或缺的元件。
    的头像 发表于 01-10 14:03 943次阅读