基于Docker、Jenkins实现自动化部署

概述

最近在写一个基于SpringBoot的小项目,由于每次部署到服务器都需要经历几个繁琐的过程,随在自己的服务器上安装了Jenkins和Docker实现自动化部署。至此,将整个过程记录如下。

安装与配置

Jenkins

  1. 安装JDK和Maven

    此处呢内容自行安装,不做描述

  2. 访问官网 下载即可(若下载速度太慢,从华为云镜像站下载即可)

在这里插入图片描述

  1. 个人倾向于使用war包部署,放在Tomcat-webapp目录下启动即可

    注意:将war包放在webapp目录下启动是会提示ClassNotFound等异常,经过一番寻找是项目本地缺少了Jackson依赖包,从Maven中央仓库下载后放置在${path}/tomcat/webapps/jenkins/WEB-INF/lib目录下即可

  2. 启动后从${path}/tomcat/logs/catalina.out获取admin密码,配置JDK和Maven即可

  3. 若代码库在码云平台,在Jekins插件中心安装对应插件即可

在这里插入图片描述

  1. 参照官方文档在Jenkins平台配置即可

在这里插入图片描述

Docker

  1. 安装Docker-CE并设置阿里云加速镜像

至此,自动化部署所需的基础组件已安装完毕。

配置文件编写

此次自动化部署主要依赖两个文件

  • Dockerfile:将我们的项目作为镜像导入Docker中
  • 启动脚本:在重新部署项目时,完成Docker内进程的删除、镜像删除和项目启动

项目结构

在这里插入图片描述

三者应处于同级目录

编写Dockerfile

# 使用基础镜像
FROM java:8
# 环境变量
ENV TIME_ZONE Asia/Shanghai
# 维护者
MAINTAINER lhc <582895699@qq.com>
# 复制jar包
COPY target/adminlte-web-0.0.1-SNAPSHOT.jar /mnt
# 时区同步
RUN echo "${TIME_ZONE}" > /etc/timezone && \
	ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
# 启动
ENTRYPOINT ["java", "-Xmx500m","-XX:+UseG1GC", "-jar","/mnt/adminlte-web-0.0.1-SNAPSHOT.jar","-Dspring.profiles.active=test", "&"]
# 暴露端口
EXPOSE 8080 8090

配置容器内的工作路径为/mnt,启动命令和端口接口

编写启动脚本

#!/usr/bin/env bash
APP_NAME_PREFIX="adminlte"
TAG_NAME=$(date -d today +"%H%M")
IMAGE_NAME=$APP_NAME_PREFIX:"$TAG_NAME"

# 删除镜像进程
delProcess() {
  DOCKER_PS=$(docker ps -a | grep $APP_NAME_PREFIX | awk '{print $1}')
  for i in $DOCKER_PS; do
    if [ -n "$i" ]; then
      docker stop "$i"
      docker rm "$i"
    fi
  done
}

# 删除镜像
delImages() {
  OLD_IMAG_IDS=$(docker images | grep $APP_NAME_PREFIX | awk '{print $1,$2}' | sed 's/[[:space:]]/:/')
  for i in $OLD_IMAG_IDS; do
    if [ -n "$i" ]; then
      docker rmi "$i"
    fi
  done
}

# 构建新镜像
buildImage() {
  docker build -t "$IMAGE_NAME" .
}

# 启动新镜像(部署两个实例)
dockerRun() {
  for i in {8090..8091}; do
    docker run -d --name "$APP_NAME_PREFIX"_$i  -p $i:8080 "$IMAGE_NAME"
  done
}

run() {
  echo "脚本开始执行"
  delProcess
  delImages
  buildImage
  dockerRun
  sleep 1
  echo "执行结束"
}

run

执行

  1. 新建一个任务

    在这里插入图片描述

  2. 添加自己的代码库(Gitee或GitHub)

    在这里插入图片描述

  3. 配置构建脚本

    在这里插入图片描述

    脚本内容为

    # 获取Jenkins工作目录为变量
    WORKSPACE=${WORKSPACE}
    # 进入工作目录
    cd $WORKSPACE
    # 执行maven instll命令
    mvn clean install -DskipTests -e
    echo "install 成功"
    # 进入主目录
    cd adminlte-web
    # 执行打包命令
    mvn clean package -DskipTests -e
    # 启动部署脚本
    sh run.sh
    
  4. 保存即可

执行流程

  1. 用户提交代码到代码托管平台

  2. Jenkins从代码托管平台拉取最新的代码到服务器(宿主机)

  3. 在服务器(宿主机)执行maven命令,完成打包

  4. 执行run.sh,删除老进程并启动新镜像

  5. 通过docker logs -f ${容器ID}portainer查看启动日志即可

    在这里插入图片描述

补充

Jenkins 参数化构建

参考资料

  1. Dockerfile reference
  2. Best practices for writing Dockerfiles
  3. Build your Java image

阅读原文

03-19
### IEEE 802.1Q VLAN Tagging Protocol Standard IEEE 802.1Q 是支持虚拟局域网(VLAN)的标准协议之一,通常被称为 Dot1q。该标准定义了一种用于以太网帧的 VLAN 标记系统以及交换机和桥接器处理这些标记帧的操作流程[^2]。 #### 协议结构概述 IEEE 802.1Q 的核心功能在于通过在以太网数据帧中插入特定字段来实现 VLAN 标签的功能。这种标签使得网络设备能够识别哪些流量属于哪个 VLAN,并据此执行转发决策。具体来说: - **Tag Header**: 在原始以太网帧头部增加了一个额外的 4 字节字段作为 VLAN 标签头。这四个字节包含了以下部分: - **Priority Code Point (PCP)**: 使用 3 比特表示优先级级别,范围从 0 到 7,主要用于 QoS 控制。 - **Canonical Format Indicator (CFI)**: 这是一个单比特位,在传统以太网环境中设置为零。 - **VLAN Identifier (VID)**: 使用 12 比特标识具体的 VLAN ID,理论上可以支持多达 4096 个不同的 VLAN(编号从 0 至 4095),其中某些特殊值保留给内部用途或管理目的。 #### 数据包处理机制 当一个带有 VLAN tag 的数据包进入支持 IEEE 802.1Q 的交换机时,它会依据此标签决定如何路由或者过滤该数据流。如果目标端口不属于同一 VLAN,则不会传输至其他无关联的物理接口上;反之亦然——只有相同 VLAN 成员之间才允许互相通信除非经过路由器跨网段访问[^1]。 此外,为了简化管理和配置过程并增强互操作性,还引入了一些辅助性的子协议和服务组件比如 GARP(通用属性注册协议)。GARP 可帮助分发有关 VLAN 成员资格的信息到各个连接节点以便动态调整其行为模式而无需频繁手动干预[^3]。 以下是创建带 VLAN TAG 的 Python 示例代码片段展示如何模拟构建这样的 Ethernet Frame: ```python from scapy.all import Ether, Dot1Q, IP, sendp def create_vlan_packet(src_mac="00:aa:bb:cc:dd:ee", dst_mac="ff:ff:ff:ff:ff:ff", vlan_id=100, src_ip="192.168.1.1", dst_ip="192.168.1.2"): ether = Ether(src=src_mac, dst=dst_mac) dot1q = Dot1Q(vlan=vlan_id) ip_layer = IP(src=src_ip, dst=dst_ip) packet = ether / dot1q / ip_layer return packet packet = create_vlan_packet() sendp(packet, iface="eth0") # Replace 'eth0' with your network interface name. ``` 上述脚本利用 Scapy 库生成包含指定源地址、目的地址及所属 VLAN 编号的数据报文并通过选定的网卡发送出去测试实际效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值