当前位置: 首页 > news >正文

Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行

​ 上一篇内容中使用Jenkins(运行服务器)+Gitlab(代码存储库)+Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。

​ 那么假如有这样一个场景:需要把不同技术栈的项目部署到同一台服务器上运行。比如PHP、.NET、Java、Python的程序都部署到同一台服务器,那么可能由于各自依赖包及环境有冲突,或依赖软件版本不同造成无法兼容的问题。

​ 再假如,企业需要搭建一套新的服务,8台服务器,每台都需要Java运行环境、Tomcat都需要去执行安装JDK、配置环境变量、Tomcat配置等相同的流程,重复劳动。

​ 那么要避免这些问题,我们可以使用容器虚拟化技术,如Docker。Docker能使环境隔离,完美规避软件无法兼容的问题。只需要配置好一台服务器,可以把镜像上传到仓库,其他服务器直接拉取下来即可一键使用。

Docker介绍

​ Docker是一个开源项目,非常优秀的开源容器引擎,基于Google公司推出的Go语言实现。Docker能将应用程序间环境隔离,帮助用户更快交付部署,高效利用宿主机资源。Docker很适合微服务架构,单个容器运行单个程序。

​ Docker有3个基本概念:

  • 镜像:镜像定义了运行容器的资源,用户可以使用Dockerfile自定义镜像,可以看作它是由一条条指令构成
  • 容器:镜像运行起来,就是容器,麻雀虽小,五脏俱全,它有自己的文件系统、网络、以及各种软件,相当于是一个微型的操作系统
  • 仓库:仓库主要用于存储,存储镜像的地址。可将镜像上传至仓库,也能从仓库上pull下来镜像(类似gitlab代码存储)

Docker安装

安装Docker的官方文档地址:https://docs.docker.com/engine/install/,Docker支持安装在多种操作系统上,Windows、Mac、Centos、Ubuntu等,笔者这里选择Centos。一般安装一个CE版本的就可以了。

  • 使用yum安装yum-utils软件包和设置稳定的存储库
yum -y install yum-utils # 安装yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  # 设置存储库
  • 安装Docker CE和containerd
yum -y install docker-ce coker-ce-cli containerd.io	# 安装最新版

上面那条命令是安装最新版,若要安装指定版本,先列出可用的版本列表

yum list docker-ce --showduplicates | sort -r

选择一个版本安装

yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 安装指定版本,用版本号替换掉VERSION_STRING即可
  • 安装完成后,可以启动docker了
systemctl start docker	# 启动
systemctl restart docker # 重启
systemctl stop docker	# 关闭
  • 使用docker version看下docker是否安装完毕及版本号
Client: Docker Engine - CommunityVersion:           24.0.6API version:       1.43Go version:        go1.20.7Git commit:        ed223bcBuilt:             Mon Sep  4 12:35:25 2023OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          24.0.6
...

Docker镜像加速器

Docker的镜像默认是在Docker Hub上下载的,但是国内下载很慢,下载大镜像时问题尤为突出,甚至还会断开。我们可以使用其他的镜像源,如阿里云,只需要注册一个账号,进入镜像服务,点击镜像加速器,可以免费获取一个镜像加速的地址。

在这里插入图片描述

命令贴到这里

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://6yqx5sih.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

由于本文针对Docker部署运行项目的,需要点Docker的基础,一些常用的Docker命令就不再赘述了,可以到网上查看一些资料。

Dockerfile常用指令

介绍下Dockerfile的常用指令

命令含义
FROM image_name:tag依赖的基础镜像
MAINTAINER name镜像作者,维护者
ENV key value设置环境变量
RUN command编译镜像时运行的命令
CMD启动容器时运行的命令
ENTRYPOINT设置容器的入口程序
ADD source target复制文件,若是压缩包,复制后会自动解压,路径只能是构建时的上下文内
COPY source target与ADD指令类似,但压缩文件不会被解压,路径只能是构建时的上下文内
WORKDIR path指定工作目录
ARG设置编译镜像时,加入的参数
VOLUME指定挂载的目录
EXPOSE声明暴露的端口
LABEL添加元数据到镜像
USER设置运行镜像时的用户或UID,后续的RUN也会使用指定的用户

Docker部署运行项目

现在可以编写Dockerfile文件构建出镜像,然后通过镜像创建容器启动。

还以上篇文章的三个jar包为例(一个消费者,两个生产者),为它们创建Dockerfile文件。

  1. 消费者Dockerfile
FROM java:8
COPY consumer-1.0-SNAPSHOT.jar consumer-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 9001
ENTRYPOINT ["java","-jar","consumer-1.0-SNAPSHOT.jar"] # 启动jar包

TIPS:文件名称最好命名为Dockerfile,构建镜像的命令可以省事儿,且jar包需要在构建的上下文内。

  1. 生产者1
FROM java:8
COPY provider-8001-1.0-SNAPSHOT.jar provider-8001-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8001
ENTRYPOINT ["java","-jar","provider-8001-1.0-SNAPSHOT.jar"] # 启动jar包
  1. 生产者2
FROM java:8
COPY provider-8002-1.0-SNAPSHOT.jar provider-8002-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8002
ENTRYPOINT ["java","-jar","provider-8002-1.0-SNAPSHOT.jar"] # 启动jar包

分别到三个Dockerfile所在目录下,执行构建命令

docker build -t consumer:0.0.1-SNAPSHOT .
docker build -t provider1:0.0.1-SNAPSHOT .
docker build -t provider2:0.0.1-SNAPSHOT .

后面有个.代表Dockerfile文件的相对位置,表示当前路径

  • 运行完毕后,docker images查看镜像

在这里插入图片描述

3个镜像就已经构建完毕了,分别创建它们的启动容器启动即可。

docker run --name consumer -d -p 9001:9001 consumer:0.0.1-SNAPSHOT
docker run --name provider1 -d -p 8001:8001 provider1:0.0.1-SNAPSHOT
docker run --name provider2 -d -p 8002:8002 provider2:0.0.1-SNAPSHOT

docker ps查看下运行的容器

在这里插入图片描述

Jenkins+Gitlab+Docker普通部署运行

上面介绍的是简单的Docker部署运行,那么完整的一整套流程采用Jenkins+Gitlab+Docker的方式部署运行。

  • 在消费者和提供者项目的pom.xml文件中增加插件,docker-maven-plugin
<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>${artifactId}:${version}</imageName><!--镜像名称--><baseImage>java:8</baseImage><!--依赖的基础镜像--><entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><!--表示target目录--><include>${project.build.finalName}.jar</include><!--表示要复制的文件--></resource></resources></configuration>
</plugin>
  • 定位到服务器Maven安装目录下,修改conf/settings.xml文件,在pluginGroups标签下新增docker插件的配置
<pluginGroup>com.spotify</pluginGroup>

若无此配置,打包将会报错:No plugin found for prefix ‘docker’ in the current project and in the plugin groups.

  • 到Jenkins项目主界面,点击配置,修改之前的配置,定位到构建(Build)一栏

    • 第一步先执行脚本,因为镜像和容器名称都不能重复,所以这段脚本会停止正在运行的容器删除以前的镜像和容器
    array=("consumer" "provider-8001" "provider-8002")
    for item in ${array[@]};
    doinstance=$(docker ps -a | grep $item | head -1);#查找这个容器image=$(docker images | grep $item | awk '{print $1}' | head -1);#查找镜像if [ "$instance"x != ""x ] ; thendocker stop $item # 停止容器docker rm $item # 删除容器fiif [ "$image"x != ""x ] ; thendocker rmi $item:1.0-SNAPSHOT # 删除镜像fi
    done
    
    • 第二步,执行打包构建镜像
    clean package docker:build
    
    • 第三步,创建并执行容器
    docker run --name consumer -d -p 9001:9001 consumer:1.0-SNAPSHOT
    docker run --name provider-8001 -d -p 8001:8001 provider-8001:1.0-SNAPSHOT
    docker run --name provider-8002 -d -p 8002:8002 provider-8002:1.0-SNAPSHOT
    

在这里插入图片描述

完事儿后,提交下代码到gitlab,然后webhook或手动触发一下构建即可。执行完毕后,看到images和容器都已经创建好,并且容器已经启动。

在这里插入图片描述

Jenkins+Gitlab+Dockerfile部署运行

当遇到比较复杂的场景时,我们可以使用Dockerfile的方式。具体如下:

  • 首先修改项目的pom.xml文件
<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>${artifactId}:${version}</imageName><!--镜像名称--><dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><!--Dockerfile的文件位置--><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><!--表示target目录--><include>${project.build.finalName}.jar</include><!--表示要复制的文件--></resource></resources></configuration>
</plugin>
  • 那么就需要在项目(各个子工程)的根目录/src/main下,创建一个docker的目录,再创建一个Dockerfile文件

消费者Dockerfile

FROM java:8
COPY consumer-1.0-SNAPSHOT.jar consumer-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 9001
ENTRYPOINT ["java","-jar","consumer-1.0-SNAPSHOT.jar"] # 启动jar包

其他两个生产者

FROM java:8
COPY provider-8001-1.0-SNAPSHOT.jar provider-8001-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8001
ENTRYPOINT ["java","-jar","provider-8001-1.0-SNAPSHOT.jar"] # 启动jar包
FROM java:8
COPY provider-8002-1.0-SNAPSHOT.jar provider-8002-1.0-SNAPSHOT.jar # 复制jar包
EXPOSE 8002
ENTRYPOINT ["java","-jar","provider-8002-1.0-SNAPSHOT.jar"] # 启动jar包

完事儿后,在Jenkins重新构建项目即可。

在这里插入图片描述

看到这里,可能会有读者比较迷茫,Dockerfile中的COPY指令执行时,打包后的jar包是否和Dockerfile文件在同一上下文中呢?

其实,在项目的pom.xml中引入的docker打包插件已经考虑到这种情况了,它会将你的打包后的jar包和Dockerfile文件拷贝到target/docker的目录下,这时你就不需要担心构建时不在同一目录的问题了。

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

相关文章:

Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行 ​ 上一篇内容中使用Jenkins(运行服务器)Gitlab(代码存储库)Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。 ​ 那么假如有这样一个场景&#xff1a;需要把不同技术栈的项目部署到同一台服务器上运行。比如PH…...

Web前端-Vue2+Vue3基础入门到实战项目-Day4(组件的三大组成部分, 组件通信, 案例-组件版小黑记事本, 进阶语法)

Web前端-Vue2Vue3基础入门到实战项目-Day4 组件的三大组成部分(结构/样式/逻辑)scoped样式冲突data是一个函数 组件通信组件通信语法父传子子传父props详解什么是propsprops检验props与data的区别 非父子(扩展)事件总线 (event bus)provide - inject 案例 - 小黑记事本(组件版)…...

【大模型应用开发教程】01_大模型简介

C1 大模型简介 一. 什么是LLM&#xff08;大语言模型&#xff09;&#xff1f;1. 发展历程2. 大语言模型的概念LLM的应用和影响 二、大模型的能力和特点1. 大模型的能力1.1 涌现能力&#xff08;emergent abilities&#xff09;1.2 作为基座模型支持多元应用的能力1.3 支持对话…...

Flume 简介及基本使用

1.Flume简介 Apache Flume 是一个分布式&#xff0c;高可用的数据收集系统。它可以从不同的数据源收集数据&#xff0c;经过聚合后发送到存储系统中&#xff0c;通常用于日志数据的收集。Flume 分为 NG 和 OG (1.0 之前) 两个版本&#xff0c;NG 在 OG 的基础上进行了完全的重构…...

行业追踪,2023-10-11

自动复盘 2023-10-11 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…...

HTTP中的GET方法与POST方法

1、GET 和 POST方法之间的区别 根据 RFC 规范&#xff0c;GET 的语义是从服务器获取指定的资源&#xff0c;这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中&#xff0c;URL 规定只能支持 ASCII&#xff0c;所以 GET 请求的参数只允许 ASCI…...

2023年10月16日-10月22日,(光追+ue+osg继续按部就班进行即可。)

根据月计划&#xff0c; 本周计划如下&#xff1a; 2023年10月16日-10月22日&#xff0c;光追10.7-10.13&#xff0c;ue rpg(p47-p53),ue5底层渲染01A19-01B4,osg29,osg30,filament文档每天看 落实到天就是 2023年10月16日光追10.7&#xff0c;ue rpg(p47),ue5底层渲染01A19,o…...

【Docker】命令使用大全

【Docker】命令使用大全 目录 【Docker】命令使用大全 简述 Docker 的主要用途 基本概念 容器周期管理 run start/stop/restart kill rm pause/unpause create exec 容器操作 ps inspect top attach events logs wait export port 容器 rootfs 命令 c…...

查找算法:二分查找、插值查找、斐波那契查找

二分查找 查找的前提是数组有序 思路分析 代码实现 # 二分查找&#xff08;递归法实现&#xff09; # 找到一个相等的值就返回该值的下标 def binary_search(arr: list, find_val: int, left: int, right: int):mid (left right) // 2 # 寻找数组中间位置的下标if left &…...

python+django高校教室资源预约管理系统lqg8u

技术栈 后端&#xff1a;pythondjango 前端&#xff1a;vueCSSJavaScriptjQueryelementui 开发语言&#xff1a;Python 框架&#xff1a;django/flask Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyChar…...

Potato靶机

信息搜集 设备发现 扫描端口 综合扫描 开放了80端口的HTTP服务和7120端口的SSH服务 目录扫描 扫描目录 看看这个info.php&#xff0c;发现只有php的版本信息&#xff0c;没有可以利用的注入点 SSH突破 hydra 爆破 考虑到 7120 端口是 ssh 服务&#xff0c;尝试利用 hydra …...

【环境搭建】linux docker-compose安装gitlab和redis

gitlab需要redis&#xff0c;一起安装了 新建gitlab和redis挂载目录 mkdir -p /data/docker/redis/data mkdir -p /data/docker/redis/logs mkdir -p /data/docker/redis/confmkdir -p /data/docker/gitlab/data mkdir -p /data/docker/gitlab/logs mkdir -p /data/docker/gi…...

JAVAEE初阶相关内容第十三弹--文件操作 IO

写在前 终于完成了&#xff01;&#xff01;&#xff01;&#xff01;内容不多就是本人太拖拉&#xff01; 这里主要介绍文件input&#xff0c;output操作。File类&#xff0c;流对象&#xff08;分为字节流、字符流&#xff09; 需要掌握每个流对象的使用方式&#xff1a;打…...

POI报表的高级应用

POI报表的高级应用 掌握基于模板打印的POI报表导出理解自定义工具类的执行流程 熟练使用SXSSFWorkbook完成百万数据报表打印理解基于事件驱动的POI报表导入 模板打印 概述 自定义生成Excel报表文件还是有很多不尽如意的地方&#xff0c;特别是针对复杂报表头&#xff0c;单…...

【计算机毕设选题推荐】超市管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的超市管理系统 技术栈 SpringBootVueMySQLMaven 文章目录 一、超市管理系统…...

【算法1-4】递推与递归-P1002 [NOIP2002 普及组] 过河卒

## 题目描述 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#…...

浅谈压力测试的作用是什么

随着现代应用程序变得越来越复杂&#xff0c;用户的期望也在不断提高&#xff0c;对性能和可靠性的要求变得更加苛刻。在应用程序开发和维护的过程中&#xff0c;压力测试是一项至关重要的活动&#xff0c;它可以帮助发现潜在的问题、评估系统的性能极限&#xff0c;以及确保在…...

互联网Java工程师面试题·Java 总结篇·第一弹

目录 1、面向对象的特征有哪些方面&#xff1f; 2、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff09;时的区别&#xff1f; 3、String 是最基本的数据类型吗&#xff1f; 4、float f3.4;是否正确&#xff1f; 5、short s1 1; s1 s1 1;有错吗…...

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件&#xff0c;拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后&#xff0c;在你需要读取的地方进行写代码&#xff0c; //定义开始读取的行数 //这里设为2&#xff0c;是因为第一行是数据名称 int row12; //读取excel文件信…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...