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的目录下,这时你就不需要担心构建时不在同一目录的问题了。

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

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

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

相关文章

7.定时器

定时器资源 CC2530有四个定时器TIM1~TIM4和休眠定时器 TIM1 定时器1 是一个独立的16 位定时器&#xff0c;支持典型的定时/计数功能&#xff0c;比如输入捕获&#xff0c;输出比较和PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个I/O 引脚。定时器用于…

组件协作模式

二、组件协作模式 组件协作模式概念1、模板方法模式&#xff08;Template_Method&#xff09;模式定义动机(Motivation)具体代码举例实现要点总结 2、策略模式&#xff08;Strategy&#xff09;3、观察者模式&#xff08;Observer/Event&#xff09; 组件协作模式概念 现代软件…

智能警用装备管理系统-科技赋能警务

警用物资装备管理系统&#xff08;智装备DW-S304&#xff09;是依托互云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对警用装备进行统一管理、分析的信息化、智能化、规范化的系统。 &#xff08;1&#xff09;感知智能化 装备感知是整个方案的基础&#xff0c;本方…

Python爬虫(二十三)_selenium案例:动态模拟页面点击

本篇主要介绍使用selenium模拟点击下一页&#xff0c;更多内容请参考:Python学习指南 #-*- coding:utf-8 -*-import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import timeclass douyuSelenium…

Linemod算法研究

转载&#xff0c;这篇博客写的比较详细&#xff0c;分析也到位. https://www.cnblogs.com/aoru45/p/16810996.html

【Windows日志】记录系统事件的日志

文章目录 一、概要二、Windows日志介绍 2.1 应用程序日志2.2 系统日志2.3 安全日志 三、查看与分析日志四、常见事件ID 4.1 登录事件 4.1.1 4624登陆成功4.1.2 4625登陆失败 4.2 特权使用4.3 账户管理事件4.4 账户登录事件5.2 事件ID汇总 一、概要 Windows主要有以下三类日…

【Android知识笔记】图片专题(BitmapDrawable)

如何计算一张图片的占用内存大小? 注意是占用内存,不是文件大小可以运行时获取重要的是能直接掌握计算方法基础知识 Android 屏幕像素密度分类: (其实还有一种 ldpi = 120,不过这个已经绝种了,所以最低的只需关心mdpi即可) 上表中的比例为:m : h : xh : xxh: xxxh = …

自动驾驶学习笔记(四)——变道绕行仿真

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 仿真内容 启动Dreamview 开启Sim…

如何降低海康、大华等网络摄像头调用的高延迟问题(一):海康威视网络摄像头的python sdk使用(opencv读取sdk流)

目录 1.python sdk使用 1.海康SDK下载 2.opencv读取sdk流 先说效果&#xff0c;我是用的AI推理的实时流&#xff0c;延迟从高达7秒降到小于1秒 如果觉得这个延迟还不能接受&#xff0c;下一章&#xff0c;给大家介绍点上不得台面的小方法 SDK&#xff08;Software Developme…

《3D 数学基础》几何检测-最近点

目录 1. 直线上的最近点 2. 射线上的最近点 3. 点到平面的距离 4. 圆或球上的最近点 5. AABB上的最近点 1. 直线上的最近点 q是距离q的最近点&#xff0c;也就是q在直线上的投影。 其中p是直线上的点&#xff08;向量表示&#xff09;&#xff0c;n是直线的法向量&#x…

【苍穹外卖 | 项目日记】第四天

前言&#xff1a; 今天状态还可以&#xff0c;既有自己实战独立写接口&#xff0c;又听了课&#xff0c;学习了新的知识 目录 前言&#xff1a; 今日完结任务&#xff1a; 今日收获&#xff1a; 实现店铺状态接口 杂项知识点&#xff1a; 总结&#xff1a; 今日完结任务…

2023.10.14 培训总结

培训内容 数字模型联合仿真及集成测试技术 MBSE(Model-Based-System-Engiaeering&#xff09; 参数化建模参数化仿真 产生的疑问 支持面向对象支持CAE CFD工具优化工具 飞机的业务功能 开发分布式架构 新技术 WSDL协议DDS 发布/订阅SAOPCORBA 明显开发者 Chris Garrett 美…

【基于Kmeans、Kmeans++和二分K均值算法的图像分割】数据挖掘实验三

文章目录 Ⅰ、项目任务要求任务描述&#xff1a;主要任务要求&#xff1a; II、实现过程数据集描述实现描述具体实现过程 III、完整代码代码①代码② Ⅰ、项目任务要求 任务描述&#xff1a; 图像分割是图像处理和计算机视觉中重要的一环&#xff0c;在实际生活中得到了广泛的…

P1433 吃奶酪

#include <iostream> #include <cmath> using namespace std; #define M 15 #define S(n) ((n) * (n)) double indx[M 5], indy[M 5], ans 0, sum 0;//坐标数组&#xff0c;从下标为1开始记录 int n, vis[M 5] { 0 };//vis数组&#xff0c;选过的数字标记为1…

openssl学习——消息认证码原理

消息认证码原理 消息认证码&#xff08;Message Authentication Code, MAC&#xff09;是一种技术&#xff0c;它的原理是通过对消息和密钥进行特定的处理&#xff0c;生成一个固定长度的数据&#xff0c;这个数据就是消息认证码&#xff08;MAC&#xff09;。这个过程可以看作…

openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考

文章目录 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考99.1 参数说明99.2 认证方式 openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文件参考 99.1 参数说明 表 1 参数说明 参数名称描述取值范…

SQL及数据库基础知识点总结

一. SQL&#xff08;Structured Query Language&#xff09;&#xff1a; 结构化查询语言。SQL语法不区分关键字的大小写&#xff0c;多条SQL语句必须以&#xff1b;分隔。 二. SQL的作用&#xff1a; SQL可以访问和处理数据库&#xff0c;包括数据的增删改查&#xff08;插…

SpringCloud-Config

一、介绍 &#xff08;1&#xff09;服务注册中心 &#xff08;2&#xff09;管理各个服务上的application.yml&#xff0c;支持动态修改&#xff0c;但不会影响客户端配置 &#xff08;3&#xff09;一般将application.yml文件放在git上&#xff0c;客户端通过http/https方式…

Maika 与越南童模们受邀请参加中国上海时装周 hanakimi 品牌开幕

金风送爽&#xff0c;秋高气和。2024中国上海时装周以“活力互链”为主题&#xff0c;于10月8日正式启幕。 魅力四射的越南童模身着著名时尚品牌MLB、Hana Kami、Jacadi的精美设计&#xff0c;迈着有力、专业但又不失优雅的步伐走上时尚舞台上海大型现场。无论是拍摄造型照还是…

windows TBB的使用

windows TBB的使用 1. Install with GUI 1. Install with GUI To install oneTBB using GUI, complete the following steps: Go to the Download page.Select the preferred installer Online installer has a smaller file size but requires a permanent Internet connec…