【docker系列】docker实战之部署SpringBoot项目

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.背景介绍
      • 1.什么是 docker?
      • 2.docker 的优点?
      • 3.部署基本步骤?
    • 二.部署方式 1
      • 1.说明
      • 2.Dockerfile
      • 3.打镜像
      • 4.启动脚本
    • 三.部署方式 2
      • 1.说明
      • 2.项目路径
      • 3.服务器脚本
      • 4.Dockerfile
      • 5.注意事项

一.背景介绍

1.什么是 docker?

Docker 是一种开源的容器化平台,可以将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何支持 Docker 的服务器上。

Docker 的架构由三个主要组件组成:Docker 客户端、Docker 守护进程和 Docker 镜像。

Docker 客户端用于与 Docker 交互,Docker 守护进程负责管理和监控 Docker 的运行,Docker 镜像是一个只读的模板,包含了运行容器所需的文件系统和依赖项。

自从 Docker 发布以来,它迅速获得了广泛的认可和采用。Docker 在不到一年的时间内就实现了 100 万次的下载,并吸引了来自全球各地的开发人员和企业的关注。Docker 的应用场景包括:应用程序的开发、测试和部署、多租户环境下的应用程序隔离、快速搭建开发环境、微服务架构等。

2.docker 的优点?

Docker 的优点如下:

  1. 快速部署:Docker 可以帮助快速部署应用程序,并使其能够在多种环境中运行。您可以将应用程序和它的依赖项打包成容器,并轻松地将其部署到任何支持 Docker 的平台上。
  2. 环境一致性:Docker 可以确保应用程序在不同的环境中运行时具有相同的行为。这是因为 Docker 容器包含了应用程序及其依赖项,因此可以在任何地方运行。
  3. 资源隔离:Docker 可以隔离应用程序及其依赖项,从而确保它们不会干扰其他应用程序或系统组件。这种隔离可以帮助提高应用程序的安全性和可靠性。
  4. 更高的效率:Docker 可以帮助提高应用程序的效率,因为它可以在容器中运行多个应用程序实例,从而最大化利用系统资源。5. 更轻量级:Docker 容器比传统的虚拟机更轻量级,因为它们共享主机操作系统的内核。这意味着 Docker 容器可以更快地启动和停止,并且需要更少的系统资源。

3.部署基本步骤?

以下是 Docker 部署 Spring Boot 项目的基本步骤:

  1. 在 Spring Boot 项目的根目录下创建一个名为 Dockerfile 的文件。
  2. 在 Dockerfile 中编写 Docker 镜像的构建指令,例如:
    FROM openjdk:8-jdk-alpine
    VOLUME /tmp
    ADD target/demo.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    
    其中,FROM 指令指定了使用的基础镜像,VOLUME 指令指定了挂载点,ADD 指令将 Spring Boot 项目的 jar 包添加到镜像中,ENTRYPOINT 指令指定了容器启动时执行的命令。
  3. 在 Spring Boot 项目的根目录下执行以下命令,将 Spring Boot 项目打包成 jar 包:
    mvn clean package
    
  4. 在 Spring Boot 项目的根目录下执行以下命令,使用 Dockerfile 构建 Docker 镜像:
    docker build -t demo .
    
    其中,-t 指令指定了镜像的名称,"."表示 Dockerfile 所在的当前目录。
  5. 在 Docker 中启动容器:
    docker run -p 8080:8080 demo
    
    其中,-p 指令指定了容器端口和主机端口的映射关系,demo 是镜像的名称。

二.部署方式 1

1.说明

  1. 方式 1 是通过在本地打镜像
  2. 上传镜像到仓库
  3. 登录服务器
  4. 拉取镜像
  5. 启动容器
  6. 方式 1 比方式 2 更加稳健规范

2.Dockerfile

FROM openjdk:8RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezoneWORKDIR /home
USER rootENV PROFILE="dev"
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8ENV PARAMS=""COPY /target/*.jar /home/app.jarEXPOSE 80RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN echo -e 'mkdir -p ./logs/gc && java $JAVA_OPTS -jar ./app.jar --spring.profiles.active=$PROFILE $PARAMS' > entrypoint.shENTRYPOINT ["sh", "entrypoint.sh"]

3.打镜像

以下脚本写在 push.sh 中,主要是编译打包,打镜像,推送到远程仓库。

#!/usr/bin/env bash#版本
VERSION=latestmvn clean package -P test
export DOCKER_SCAN_SUGGEST=falsedocker build -t xxx-xxx-xxx-xxx-kwan:$VERSION .
docker tag xxx-xxx-xxx-xxx-kwan:$VERSION deploy.xxx.com/xxx-test/xxx-xxx-xxx-xxx-kwan:$VERSION
docker push deploy.xxx.com/xxx-test/xxx-xxx-xxx-xxx-kwan:$VERSION
docker rmi xxx-xxx-xxx-xxx-kwan:$VERSION deploy.xxx.com/xxx-test/xxx-xxx-xxx-xxx-kwan:$VERSION
#打包时间
echo "打包时间为="$(date +%F%n%T)

4.启动脚本

#!/usr/bin/env bash#设置容器名称
CONTAINER_NAME=xxx-xxx-xxx-xxx-kwan#镜像位置与名称
IMAGE_NAME=deploy.xxx.com/xxx-test/xxx-xxx-xxx-xxx-kwan:latest#删除容器
docker rm -f ${CONTAINER_NAME}#删除镜像
docker rmi ${IMAGE_NAME}#拉取镜像
docker pull ${IMAGE_NAME}#启动容器
docker run -d --name ${CONTAINER_NAME} --privileged=true  -e PROFILE=test -w /home -p 8888:80 \-v $PWD/logs:/home/logs -v /home/uploads:/home/uploads --restart=always ${IMAGE_NAME}
docker logs -f  --tail 500  ${CONTAINER_NAME}

三.部署方式 2

1.说明

部署方式 2 的方式其实是省去了部署方式 1 的仓库,通过 git 进行本地代码和服务器代码的同步。

  1. 本地提交代码到 gitlab
  2. 登录服务器,并到达指定 gitlab 仓库的目录
  3. git pull 拉取代码
  4. 通过 maven 打包
  5. 根据 Dockerfile 对打的包进行构建镜像
  6. 根据镜像启动容器
  7. 通过 docker 完成后端项目部署

2.项目路径

/kwan/chatbot-vue/end/vue-springboot-kwan/

3.服务器脚本

#!/bin/bash#进入项目目录
cd /kwan/chatbot-vue/end/vue-springboot-kwan/#拉取最新代码
git pull#maven打包
mvn package -Dmaven.test.skip=true#移动jar包到指定目录
yes | mv /kwan/chatbot-vue/end/vue-springboot-kwan/target/vue-springboot-kwan-0.0.1-SNAPSHOT.jar /kwan/chatbot-vue/end#到达指定目录
cd /kwan/chatbot-vue/end#构建镜像
docker build -t chatbox-vue-8888 .#删除镜像
docker rm -f chatbox-vue-8888#启动容器
docker run -d -p 8888:80 --restart=always --name chatbox-vue-8888 -v /kwan/img:/kwan/img chatbox-vue-8888

4.Dockerfile

Dockerfile 所在位置为/kwan/chatbot-vue/end 目录下

FROM openjdk:8
VOLUME /tmp
ENV TZ=Asia/Shanghai
ADD vue-springboot-kwan-0.0.1-SNAPSHOT.jar  app.jar
EXPOSE 80
ENTRYPOINT ["java","-jar","/app.jar"]

5.注意事项

  • 注意 Dockerfile 要和 jar 包在同一目录
  • git pull 不定期需要密码
  • 注意指定容器时区
  • 存在上传下载文件时需要指定文件挂载目录

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

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

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

相关文章

基于SpringBoot房产销售系统

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产销售系统,它彻底改变了过去传统的…

【MySQL】事务(事务四大特性+四种隔离级别+MVCC)

事务 前言正式开始事务的四大特性为什么会出现事务事务的版本支持事务提交方式事务常见操作方式启动事务回滚演示提交事务事务的异常autocommit 事务的隔离性隔离级别查看隔离级别修改隔离级别验证四种隔离级别读未提交(read uncommitted) —— 缩写为RU读提交(read committed)…

3款厉害的小工具,小黑子都在用!

大家好,我是 Javapub。 程序员与普通人最大的区别是什么,当然是会使用工具。基于一些同学经常问我的问题,接下来给大家分享几款我经常使用的工具,主打一个提升效率。 第一款 Everything 用 windwos 的同学都体会过,…

ERP软件对Oracle安全产品的支持

这里的ERP软件仅指SAP ECC和Oracle EBS。 先来看Oracle EBS: EBS的认证查询方式,和数据库认证是一样的。这个体验到时不错。 结果中和安全相关的有: Oracle Database VaultTransparent Data Encryption TDE被支持很容易理解,…

指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)

文章目录 🚀前言🚀两段有趣的代码✈️typedef关键字 🚀指针数组🚀简易计算器的实现 🚀前言 基于阿辉前两篇博客指针的基础篇和进阶篇对于指针的了解,那么今天阿辉将为大家介绍C语言的指针剩下的部分&#…

2021年9月15日 Go生态洞察:TLS加密套件的自动排序机制

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Linux CentOS7 fdisk

Centos7的磁盘管理包括添加磁盘、查看磁盘信息、磁盘分区、格式化、挂载和卸载,逻辑卷管理等。 对分区后的磁盘格式化比较简单,执行mkfs命令即可;而挂载可以使用的分区执行mount命令很方便地完成。本文仅讨论新添加磁盘的分区操作。 一、添…

C++学习之继承中修改成员权限细节

看看下面的代码 这是错误的 class A { public:int x 10; }; class B :public A {using A::x;int x 100; };看看函数 class A { public:void fun(){cout << "uuuu" << endl;} }; class B :public A { public:using A::fun;void fun(){cout << …

【C++】了解模板

这里是目录 前言函数模板函数模板的实例化类模板 前言 如果我们要交换两个数字&#xff0c;那么我们就需要写一个Swap函数来进行交换&#xff0c;那如果我们要交换char类型的数据呢&#xff1f;那又要写一份Swap的函数重载&#xff0c;参数的两个类型是char&#xff0c;那我们…

phpoffice在tp框架中如何实现导入导出功能

安装 phpoffice/phpspreadsheet 库 composer require phpoffice/phpspreadsheet 导入功能 创建一个用于上传文件的视图&#xff0c;可以使用元素来实现文件上传。 <!-- application/view/your/import.html --><form action"{:url(your/import)}" method&q…

2021年8月18日 Go生态洞察:整合Go的网络体验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

WIN10系统自带硬盘测速工具使用

前段时间在捣腾电脑硬盘这一块&#xff0c;因为现在固态硬盘价格比较低了&#xff0c;所以想换一下&#xff0c;给自己的电脑升个级。现在硬盘有多种接口&#xff0c;常见的就是SATA&#xff0c;mSATA&#xff0c;m.2, NVME&#xff0c;PCIE。这里PCIE的接口是直连的&#xff0…

C语言--每日选择题--Day31

第一题 1. 下面程序 i 的值为&#xff08;&#xff09; int main() {int i 10;int j 0;if (j 0)i; elsei--; return 0; } A&#xff1a;11 B&#xff1a;9 答案及解析 B if语句中的条件判断为赋值语句的时候&#xff0c;因为赋值语句的返回值是右操作数&#xff1b; …

机器学习模型验证——以数据为中心的方法

构建机器学习模型时&#xff0c;人们往往将激情和精力集中于收集数据和训练模型&#xff0c;对测试模型和验证结果往往缺少应有的关注。正确的验证技术有助于估计无偏见的广义模型的性能&#xff0c;并更好地理解模型训练的效果。您需要确保机器学习模型经过准确的训练&#xf…

EUREKA: HUMAN-LEVEL REWARD DESIGN VIACODING LARGE LANGUAGE MODELS

目录 一、论文速读 1.1 摘要 1.2 论文概要总结 相关工作 主要贡献 论文主要方法 实验数据 未来研究方向 二、论文精度 2.1 论文试图解决什么问题&#xff1f; 2.2 论文中提到的解决方案之关键是什么&#xff1f; 2.3 用于定量评估的数据集是什么&#xff1f;代码有…

2023.11.28 使用tensorflow进行“三好“权重分析

2023.11.28 使用tensorflow进行"三好"权重分析 这是最基础的一个神经网络问题。许久没有再使用&#xff0c;用来做恢复训练比较好。 x1w1 x2w2 x3*w3 y&#xff0c;已知x1,x2,x3和y&#xff0c;求w1,w2,w3 这是一个三元一次方程&#xff0c;正常需要三组数据就能…

软件工程--需求工程--学习笔记(超详细)

软件需求工程是软件开发周期的第一个阶段&#xff0c;也是关系到软件开发成败最关键阶段&#xff0c;本章讲解需求的基础知识和需求工程的关键活动。这些知识对于结构化方法、面向对象方法、面向服务方法等都是适用的 本文参考教材&#xff1a;沈备军老师的《软件工程原理》 目…

js提取iconfont项目的图标

iconfont 可以让我们轻松使用字体图标&#xff0c;比如使用 iconfont 提供的 js&#xff0c;就可以愉快的码代码了。 //at.alicdn.com/t/c/font_xxxxx.js通常公司会有提供一套图标供所有系统使用&#xff0c;比如图标库里有 1000 个图标&#xff0c;但某个项目只需要使用 10 个…

系列十九、Spring实例化bean的方式

一、概述 所谓实例化bean&#xff0c;大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种&#xff0c;即&#xff1a; ① 构造器方式&#xff1b; ② 静态工厂方式&#xff1b; ③ 实例工厂方式&#xff1b;…

关于mybatis插入返回主键id和SpringBoot事务注解自调用演示

文章目录 一. 插入返回任意规则主键ID二. SpringBoot自调用事务2.1 场景12.2 场景2 自调用结论总结 一. 插入返回任意规则主键ID 实体对象 TableName("bank") Data public class Entity {TableId("id")Integer id;TableField("money")Integer …