如何用docker在自己服务器上部署springboot项目

一、将springboot项目打包

1、maven clean项目

2、maven package项目

打包成功之后生成jar文件(在target目录下)

notion image

3、为Java创建Dockerfile

引入jdk8的Docker镜像

FROM openjdk:8

为了使运行其余命令时更容易,让我们设置映像的工作目录。这将指示Docker使用此路径作为所有后续命令的默认位置。通过这样做,我们不必键入完整的文件路径,但可以使用基于工作目录的相对路径。

WORKDIR /app

在运行mvnw依赖项之前,需要将Maven包装器和pom.xml文件放入映像中。我们将使用COPY命令来完成此操作。COPY命令有两个参数。第一个参数告诉Docker你想复制什么文件到镜像中。第二个参数告诉Docker你想把文件复制到哪里。我们将把所有这些文件和目录复制到我们的工作目录- /app中。

COPY .mvn/ .mvn
COPY mvnw pom.xml ./

一旦映像中有了pom.xml文件,就可以使用RUN命令执行命令mvnw dependency:resolve。这与我们在机器上本地运行mvnw(或mvn)依赖项的方式完全相同,但是这次依赖项将被安装到映像中。

RUN ./mvnw dependency:resolve

至此,我们已经有了一个基于OpenJDK版本8的映像,并且我们还安装了依赖项。我们需要做的下一件事是将源代码添加到镜像中。我们将使用COPY命令,就像处理上面的pom.xml文件一样。

COPY src ./src

这个COPY命令获取位于当前目录中的所有文件,并将它们复制到映像中。现在,我们所要做的就是告诉Docker,当我们的镜像在容器中执行时,我们想要运行什么命令。我们使用CMD命令来执行此操作。

CMD ["./mvnw", "spring-boot:run"]

这里是完整的Dockerfile。

FROM openjdk:8

WORKDIR /app

COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:resolve

COPY src ./src

CMD ["./mvnw", "spring-boot:run"]

4、创建一个.dockerignore文件

为了提高构建的性能,作为一般的最佳实践,我们建议您在与Dockerfile相同的目录下创建一个.dockerignore文件。在本教程中,.dockerignore文件应该只包含一行:

target

这一行将目标目录(其中包含来自Maven的输出)从Docker构建上下文中排除。有很多很好的理由来仔细构造一个.dockerignore文件,但是现在这个一行文件就足够了。

5、构建镜像

docker build --tag java-docker .

6、查看本地镜像

docker images

7、一个镜像可以有多个标签。让我们为我们构建的镜像创建第二个标签,并查看其图层。

docker tag java-docker:latest java-docker:v1.0.0

让我们移除刚刚创建的标签。为此,我们将使用rmi命令。rmi命令代表“remove image”。

docker rmi java-docker:v1.0.0

二、将镜像作为容器运行

1、要在容器中运行镜像,我们使用docker run命令。docker run命令需要一个参数,即镜像的名称。让我们启动映像并确保它正确运行。在终端上运行以下命令:

docker run java-docker

2、让我们网页访问《服务器ip》:9090

可以看到无法访问,因为我们的容器是隔离运行的,包括网络。让我们停止容器并重新启动本地网络上发布的端口9090。

3、要停止容器,请按ctrl-c。这将返回到终端提示符。

4、启动容器并将端口9090暴露给主机上的端口9090。

要为容器发布端口,我们将在docker运行命令上使用——publish标志(简称-p)。——publish命令的格式为[host port]:[container port]。因此,如果我们想要将容器内部的端口9090公开给容器外部的端口9090,我们将把9090:9090传递给——publish标志

docker run --publish 9090:9090 java-docker

5、再次访问,发现变为了404,说明成功了

现在,按ctrl-c停止容器。

6、以后端模式运行

我们可以使用——detach或简称为-d。Docker像之前一样启动容器,但这一次,它将从容器“分离”并返回终端提示符。

docker run -d -p 9090:9090 java-docker

Docker在后台启动我们的容器,并在终端上打印容器ID。

确保容器正常运行,用同样的路径访问

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、初识 llvm源码编译 及virtualbox和ubuntu环境搭建

很久没更新了,最近准备研究逆向和加固,于是跟着看雪hanbing老师学习彻底搞懂ollvm,终于把所有流程跑通了,中间遇到了太多的坑,所以必须记录一下,能避免自己和帮助他人最好。 环境搭建太重要了,…

26、pytest使用allure解读

官方实例 # content of pytest_quick_start_test.py import allurepytestmark [allure.epic("My first epic"), allure.feature("Quick start feature")]allure.id(1) allure.story("Simple story") allure.title("test_allure_simple_te…

LabVIEW使用单板RIO开发远程监控电源信号

LabVIEW使用单板RIO开发远程监控电源信号 设计和构建用于智能电网的本地功耗分析系统,主要服务于领先的电力监控设备设计者和制造商。随着智能电网投资的增加,对于能够有效处理替代电源(如太阳能和风能)间歇性功率水平的技术需求…

vue 提交表单重复点击,重复提交防抖问题

问题:用户点击保存时,可能会多次点击。导致生成重复数据。 目标:多次点击时,1s内只允许提交一次数据。 解决方案: 1.在utils文件夹创建文件preventReClick.js export default {install (Vue) {// 防止按钮重复点击V…

lv11 嵌入式开发 IIC(上) 19

目录 1 IIC总线简介 1.1 串行、半双工(同时只能1收或者1发) 1.2 IIC总线通信过程 2 IIC总线信号实现 2.1 IIC总线寻址方式 2.2 起始信号和停止信号 2.3 字节传送与应答 2.4 同步信号 2.5 典型IIC时序 3 练习 1 IIC总线简介 1.1 串行、半双工&a…

2.5D封装与3D IC封装主流产品介绍

2.5D封装和3D IC封装都是新兴的半导体封装技术,它们都可以实现芯片间的高速、高密度互连,从而提高系统的性能和集成度。但是它们之间也存在一些差异和异同点。 1、3D 结构与 2.5D 有何不同? 首先,2.5D封装和3D IC封装的互连方式有…

Chrome浏览器禁止更新策略

在做爬虫过程中,需要用到Selenium驱动浏览器去做动态爬虫 这里我一般用到的是Chrome谷歌浏览器进行爬虫 但是,目前python和Chrome浏览器适配最好的是110.版本 尽管我用了很多种方法 去取消浏览器自动更新 但是 过一段时间 浏览器总是会自动更新到最新…

Linux Docker 安装Nginx

1.21、查看可用的Nginx版本 访问Nginx镜像库地址:https://hub.docker.com/_/nginx 2、拉取指定版本的Nginx镜像 docker pull nginx:latest #安装最新版 docker pull nginx:1.25.3 #安装指定版本的Nginx 3、查看本地镜像 docker images 4、根据镜像创建并运行…

TCP单聊和UDP群聊

TCP协议单聊 服务端: import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.V…

geemap学习笔记022:如何找出一年中最绿的一天?

前言 这虽然是一个问题,但是解决这个问题之后,就会学习到很多的内容。包括如何计算NDVI、如何进行镶嵌、如何获取影像的时间等等。 1 导入库并显示地图 import ee import geemapee.Initialize() Map geemap.Map() Map2 定义一个感兴趣区(…

新书推荐——《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》

《Copilot和ChatGPT编程体验:挑战24个正则表达式难题》呈现了两方竞争的格局。一方是专业程序员David Q. Mertz,是网络上最受欢迎的正则表达式教程的作者。另一方则是强大的AI编程工具OpenAI ChatGPT和GitHub Copilot。 比赛规则如下:David编…

【Flink系列二】如何计算Job并行度及slots数量

接上文的问题 并行的任务,需要占用多少slot ?一个流处理程序,需要包含多少个任务 首先明确一下概念 slot:TM上分配资源的最小单元,它代表的是资源(比如1G内存,而非线程的概念,好多…

PCL 点云最小二乘法拟合二维圆

文章目录 一、原理概述二、实现代码三、实现效果参考资料一、原理概述 二、实现代码 // 标准文件 #include <iostream>// PCL #include <pcl/io/pcd_io.h>

Python中的并发编程(2)线程的实现

Python中线程的实现 1. 线程 在Python中&#xff0c;threading 库提供了线程的接口。我们通过threading 中提供的接口创建、启动、同步线程。 例1. 使用线程旋转指针 想象一个场景&#xff1a;程序执行了一个耗时较长的操作&#xff0c;如复制一个大文件&#xff0c;我们希…

如何加快网络攻击发现速度

网络攻击可能会摧毁受害者。例如&#xff0c;米高梅度假村 (MGM Resorts) 预计将因 9 月份的网络攻击而遭受 1 亿美元的损失。 鲜为人知的是&#xff0c;在许多情况下&#xff0c;借助网络攻击发现可以预防网络攻击或将其消灭在萌芽状态。 威胁行为者变得越来越复杂&#xff…

【计算机网络笔记】物理层——频带传输基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

文件同步及实现简单监控

1. 软件简介 rsync rsync 是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程 数据同步备份的优秀工具。在同步备份数据时&#xff0c;默认情况下&#xff0c;Rsync 通过其 独特的“quick check”算法&#xff0c;它仅同步大小或者最后修改时间发生变化的文 件或…

Linux_CentOS_7.9配置oracle sqlplus、rman实现上下按键切换历史命令等便捷效率功能之简易记录

配置oracle sqlplus以及rman可以上下按键切换历史命令等便捷效率功能 设置前提是已经yum安装了rlwrap软件具体软件下载及配置参考文章http://t.csdnimg.cn/iXuVK su - oracleVim .bash_profile ## 文件中增加如下的别名设置 ---------------- alias sqlplusrlwrap sqlplus…

微信小程序uni.chooseImage()无效解决方案

Bug场景&#xff1a; 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传&#xff0c;这里不再赘述具体参数。一直项目都可以正常使用&#xff0c;突然有一天发现无法使用该方法&#xff0c;于是查了一下&#xff0c;发现是用户隐私协议问题。故记录一下解决方案。…

自然语言处理基础知识 学习

参考&#xff1a;OpenBMB - 让大模型飞入千家万户 【清华NLP】刘知远团队大模型公开课全网首发&#xff5c;带你从入门到实战_哔哩哔哩_bilibili 图灵测试&#xff1a;imitation Game 模仿游戏 Part of speech tagging 词性标注 Named entity recognition &#xff1a; 命名…