14.docker部署应用的两种企业实践

1.介绍

1.1 说明

这里仅仅说明一下在企业应用的两种简单实践,并不包含自动化这套东西。这里说的两种实践,是我在工作中不同公司使用的两种部署方式,仅供大家参考。

1.2 两种部署方式

第一种:是把环境和app都一起打成一个镜像,每次部署都重新打一个镜像,然后启动容器;
第二种:仅仅把环境打成一个镜像,每次部署的时候,通过容器数据卷的方式,将app复制到容器中;

1.3 两种部署方式的物料说明

app: springboot的jar文件,里面加入了日志
java环境:jdk1.8
目录安排:
日志目录:/logs/
应用目录:/code/

2.构建java环境基础镜像

2.1 准备jdk的文件

我在这里准备了jdk-8u261-linux-x64.tar.gz 这个jdk文件:
在这里插入图片描述

2.2 编写的Dockerfile:

内容如下:

FROM centos:7.6.1810
LABEL \
     author="lxc<xincasso.lvxss@126.com>" \
     createTime="2023-09-24 10:20"
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install initscripts
# 安装lib库
RUN yum -y install glibc.i686

ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_261
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JRE_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$PATH:$JAVA_HOME/bin

RUN mkdir -p /code
RUN mkdir -p /logs
WORKDIR /code

2.3 构建java8的基础镜像

docker build -t donkey/java8:1.0.0 .

在这里插入图片描述

3.上线部署

3.1 环境和app都一起打成一个镜像,上线部署

3.1.1 物料准备

镜像打包物料放在了/data/docker/docker-demo 这个目录下
在这里插入图片描述

其中有docker-demo-0.0.1-SNAPSHOT.jar、Dockerfile其中docker-demo-0.0.1-SNAPSHOT.jar代表我们生成的app应用代码,Dockerfile镜像构建文件。
Dockerfile文件内容如下:

FROM donkey/java8:1.0.0
COPY docker-demo-0.0.1-SNAPSHOT.jar /code/app.jar
ENTRYPOINT ["sh", "entry.sh"]

这个文件比较简单,就是基于java的基础镜像,把我们的app拷贝进去,然后执行命令。

3.1.2 构建镜像

执行构建命令:

docker build -t donkey/docker-demo:1.0.0 .

在这里插入图片描述

3.1.3 启动容器

我在/www/demo_1 这个目录下,当了一个entry.sh脚本
在这里插入图片描述
脚本内容很简单,就是启动app.jar

#!/bin/sh
java -jar app.jar

然后启动容器

docker run -d -p 8070:8080 -v /www/demo_1/entry.sh:/code/entry.sh  -v /logs:/logs  --name demo_1 38af11626649

包括端口映射、容器数据卷挂载。
在这里插入图片描述

3.1.4 验证

curl http://127.0.0.1:8070

在这里插入图片描述
查看日志:
在这里插入图片描述
在这里插入图片描述

3.2 将app以数据卷挂载的形式运行容器

3.2.1 重新构建java基础镜像

在/data/docker/java8_1我放了一个Dockerfile文件
在这里插入图片描述
内容如下:

FROM donkey/java8:1.0.0
ENTRYPOINT ["sh", "entry.sh"]

其实就是在基础镜像上加了一个命令执行。
构建

docker build -t donkey/java8_1:1.0.0 .

在这里插入图片描述
在这里插入图片描述

3.2.2 放置应用app服务器指定目录

这里我放到了/www/demo_2下
在这里插入图片描述

3.2.3 运行容器

docker run -d -p 8071:8080 -v /www/demo_2:/code  -v /logs:/logs  --name demo_2 fa14c12a02c1

在这里插入图片描述

3.2.4 验证

curl http://127.0.0.1:8071

在这里插入图片描述

4.小结

4.1 小小说明

我这里介绍的都是手工操作的处理,文章描述的可能不是很完全,实际上我们用jenkins或者云效等流水线来部署,还是比较方便的。我想说的是,这两种部署方式,在企业中我都是用过,只不过说把应用不打进镜像中的方式有点脱离docker的思想。

4.2我的观点

我在实际工作使用中,这种将代码和环境分离的方式还挺好用的。这里我说一下原因:
1.如果部署比较频道,特别是我们开发测试环境,如果将app+环境打成一个镜像,那么每次部署都要重新打包,然后上传远程仓库,然后再启动,那么这就会导致部署时间较长,因为打包时间和上传时间都比较长;
2.由于基础环境镜像本身就比较大,然后再加上app,这样打出来的镜像就更大,每个镜像都会占用磁盘空间,你会发现,随着工作的继续,我们的磁盘空间消耗很大,因为镜像文件很多很大;
3.对于一些java这种app,如果我只是改个页面,那么我也必须要重新打包镜像,上传远程仓库、启动容器,而实际上我并不需要重启容器,只需要把html文件替换就好了;
4.有人说这样把app和基础环境分开,你回滚就比较困难,但我想说的是,我的代码是用git来管理的,直接回滚到之前的代码版本就好了,不需要回滚镜像(当然不如回滚镜像快)。
在自动化部署中:
第一种app+环境,我们只需要在代码文件中创建Dockerfile和entry.sh两个文件,每次从基础镜像来构建出app+基础环境的镜像,然后执行启动脚本就行了;
第二种app和环境分开,我们只需要在代码文件中创建entry.sh文件,甚至我们都不需要创建任何关于docker启动的文件,因为是一类的应用,我们直接在服务器上放置一个默认的entry.sh脚本文件就行,每次都一个基础镜像直接运行容器就行了,这样镜像的管理也简单的很。
当然使用哪种方式,可以根据自己的需求来进行。这里仅仅是我的一点个人观点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP 连接断开

1&#xff1a;TCP 四次挥手过程是怎样的&#xff1f; 客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文&#xff0c;之后客户端进入 FIN_WAIT_1 状态。 服务端收到该报文后&#xff0c;就向客户端发送 ACK 应答报文…

【开源】基于Vue.js的超市账单管理系统的设计和实现

项目编号&#xff1a; S 032 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S032&#xff0c;文末获取源码。} 项目编号&#xff1a;S032&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

mybatis数据输入-实体类型的参数

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

Python文件操作,看这篇就足够!

Python中有几个内置模块和方法来处理文件。这些方法被分割到例如os, os.path , shutil 和 pathlib 等等几个模块中。文章将列举Python中对文件最常用的操作和方法。 在这篇文章中&#xff0c;你将学习如何&#xff1a; 获取文件属性创建目录文件名模式匹配遍历目录树创建临时…

python实现获取aws route53域名信息

最近由于工作原因接触到aws的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 1.基础准备 代码环境&#xff1a;python3 第三方库&#xff1a;boto3 &#xff08;安装方法pip install…

【web安全】CSRF漏洞攻击与防御

前言 总结&#xff0c;仅供学习。 csrf的理解 我们了解一个网站有修改信息&#xff0c;密码&#xff0c;添加删除管理&#xff0c;支付转账的功能之后。 通过抓包抓取对方修改操作的数据包样式&#xff0c; 然后在自己网站搭建一个指令。 当别人来访时&#xff0c; 如果…

接口01-Java

接口-Java 一、引入(快速入门案例)二、接口介绍1、概念2、语法 三、应用场景四、接口使用注意事项五、练习题1 一、引入(快速入门案例) usb插槽就是现实中的接口。 你可以把手机、相机、u盘都插在usb插槽上&#xff0c;而不用担心那个插槽是专门插哪个的&#xff0c;原因是做u…

行业唯一!法大大上榜2023德勤深圳明日之星

11月28日&#xff0c;德勤中国在深圳举办2023德勤深圳高科技高成长20强及明日之星&#xff08;以下简称“深圳明日之星”&#xff09;颁奖盛典。法大大作为高速成长、持续创新的卓越企业荣登深圳明日之星榜单。值得一提的是&#xff0c;法大大是唯一一家获奖的电子签企业&#…

PostgreSQL | EXTRACT | 获取时间的年月日字串

EXTRACT EXTRACT 函数是 PostgreSQL 中用于从日期和时间类型中提取特定部分&#xff08;如年、月、日、小时等&#xff09;的函数。 格式 EXTRACT(field FROM source) -- field 参数是要提取的部分&#xff0c;例如 YEAR、MONTH、DAY、HOUR 等。 -- source 参数是包含日期或…

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术&#xff0c;在各个科学和工程领域发挥着关键作用&#xff0c;其应用范围从信号处理到量子力学。近年来&#xff0c;它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …

uniapp上架app store详细攻略

目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用&#xff0c;打包ios应用后&#xff0c;会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上&#xff0c;需要将这个ipa文件上架app store后&#xff0c;才能通…

【经验分享】openGauss 客户端(Data Studio / DBeaver)连接方式

前言 本篇介绍了openGauss常用的客户端连接工具Data Studio和DBeaver 01 客户端工具 openGauss部署之后&#xff0c;在服务器上提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能&#xff0c;还提供了若干高级特性&#xff0c;便于用户使用。…

插槽slot使用

场景&#xff1a;el-button是绝对定位&#xff0c;希望它能根据query组件&#xff08;公共组件&#xff09;定位&#xff0c;query组件是相对定位。 <query :queryArr"queryParams" class"query"><div class"btn"><el-button cla…

王者小游戏

游戏里的经验动物 Bear package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\辛欣\\OneDrive\\桌面\\王者荣耀图片(1)\\王者荣耀图片\\beast\\bear.jp…

豆粕期权 MVIX 指数构建及策略回测

1. VIX指数 VIX 最初被设计出来的目的是为了预警市场的潜在风险&#xff0c;一般来说&#xff0c;当 VIX 指数小于 15 时&#xff0c;表示市场出现非理性繁荣&#xff1b;当 VIX 指数大于 40 时&#xff0c;表示市场对 未来的非理性恐慌&#xff0c;短期内可以出现反弹。VIX 指…

vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

面试官&#xff1a;vue要做权限管理该怎么做&#xff1f;如果控制到按钮级别的权限怎么做&#xff1f; 一、是什么 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权&#xff0c;请求…

联邦学习(Federated Learning)

联邦学习&#xff08;Federated Learning&#xff09;是一种保护用户隐私的分布式机器学习方法&#xff0c;在联邦学习中&#xff0c;模型的训练是在分布式的客户端设备上进行的&#xff0c;而模型的更新则是在中央服务器上进行的。联邦学习的目标是通过共享模型而不是原始数据…

内网协议区别

今天面试的时候被面试官问到内网隧道技术中的协议有什么区别&#xff0c;平时只注重使用不注重原理&#xff0c;学习记录 2023-11-30 网络层&#xff1a;IPV6 隧道、ICMP 隧道、GRE 隧道 传输层&#xff1a;TCP 隧道、UDP 隧道、常规端口转发 应用层&#xff1a;SSH 隧道、HTTP…

力扣题:字符的统计-11.25

力扣题-11.25 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;387. 字符串中的第一个唯一字符 解题思想&#xff1a;直接遍历即可 class Solution(object):def firstUniqChar(self, s):""":type s: str:rtype: int""&qu…

leetcode 611. 有效三角形的个数(优质解法)

代码&#xff1a; class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int lengthnums.length;int n0; //三元组的个数//c 代表三角形最长的那条边for (int clength-1;c>2;c--){int left0;int rightc-1;while (left<right){if(nums[left]nums[r…