第15章 项目部署-Docker

Docker技术能够避免部署对服务器环境的依赖,减少复杂的部署流程。

轻松部署各种常见软件、Java项目

参考文档:‌‬‌‍‍‌‍⁠⁠‍‍‬‌‍‌‬⁠‌‬第十五章:项目部署(Docker) - 飞书云文档

15.1 Docker安装

15.1.1 卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux 

15.1.2 配置Docker的yum库

首先要安装一个yum工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

安装成功后,执行命令,配置Docker的yum源(已更新为阿里云源):

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
​
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

sudo yum makecache fast

15.1.3 安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

15.1.4 启动和校验

# 启动Docker
systemctl start docker
​
# 停止Docker
systemctl stop docker
​
# 重启
systemctl restart docker
​
# 设置开机自启
systemctl enable docker
​
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

15.1.5 配置镜像加速

镜像地址可能会变更,如果失效可以百度找最新的docker镜像。

配置镜像步骤如下:

# 创建目录
rm -f /etc/docker/daemon.json
​
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["http://hub-mirror.c.163.com","https://mirrors.tuna.tsinghua.edu.cn","http://mirrors.sohu.com","https://ustc-edu-cn.mirror.aliyuncs.com","https://ccr.ccs.tencentyun.com","https://docker.m.daocloud.io","https://docker.awsl9527.cn"]
}
EOF
​
# 重新加载配置
systemctl daemon-reload
​
# 重启Docker
systemctl restart docker

15.2 部署-MySQL

传统方式部署MySQL,大概的步骤有:

  • 搜索并下载MySQL安装包

  • 上传至Linux环境

  • 解压和配置环境

  • 安装

  • 初始化和配置

而使用Docker安装,仅仅需要一步即可,在命令行输入下面的命令(建议采用CV大法):

docker run -d \--name mysql \-p 3307:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql:8

如果没有 mysql:8 镜像会先下载镜像image,再部署这个取名叫mysql的容器container

因此,Docker安装软件的过程,就是自动搜索下载镜像,然后创建并运行容器的过程。

运行效果如图(在给大家提供的资料中,已经下载好了mysql 8版本的镜像):

MySQL安装完毕!通过任意客户端工具即可连接到MySQL。

15.3 docker命令解析

docker run运行流程如下:

Docker镜像交流的社区:https://hub.docker.com

利用Docker快速的安装了MySQL,非常的方便,不过我们执行的命令到底是什么意思呢?

docker run -d \--name mysql \-p 3307:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql:8

解读:

  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行

  • --name mysql : 给容器起个名字叫mysql,你可以叫别的

  • -p 3307:3306 : 设置端口映射。

    • 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。

    • 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。

    • 格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3307映射到容器内的3306端口

  • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数

    • 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定

    • 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码

  • mysql:8 : 设置镜像名称,Docker会根据这个名字搜索并下载镜像

    • 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号

    • 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

15.4 docker常见命令

常见的命令有:

命令说明文档地址
docker pull拉取镜像docker pull
docker push推送镜像docker push
docker images查看本地镜像docker images
docker rmi删除本地镜像docker rmi
docker run创建并运行容器docker run
docker stop停止指定容器docker stop
docker start启动指定容器docker start
docker restart重新启动容器docker restart
docker rm删除指定容器docs.docker.com
docker ps [-a]查看容器docker ps
docker logs查看容器运行日志docker logs
docker exec -it [containerName] bash进入容器docker exec
docker save保存镜像到本地压缩文件docker save
docker load加载本地压缩文件到镜像docker load
docker inspect查看容器详细信息docker inspect

用一副图来表示这些命令的关系:

补充:

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:

# Docker开机自启
systemctl enable docker# Docker容器开机自启
docker update --restart=always [容器名/容器id]

用Nginx为例给大家演示命令。

# 第1步,去DockerHub查看nginx镜像仓库及相关信息# 第2步,拉取Nginx镜像 (比较耗时)
docker pull nginx:1.20.2# 第3步,查看镜像
docker images# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看运行中容器
docker ps# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,访问网页,地址:http://虚拟机地址# 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,再次启动nginx容器
docker start nginx# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第11步,查看容器详细信息
docker inspect nginx# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p# 第13步,删除容器
docker rm nginx# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

15.5 数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁。

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源

  • conf:放置配置文件

我们可以配置这两个关键目录的数据卷。

数据卷的相关命令有:

命令说明文档地址
docker volume create创建数据卷docker volume create
docker volume ls查看所有数据卷docs.docker.com
docker volume rm删除指定数据卷docs.docker.com
docker volume inspect查看某个数据卷的详情docs.docker.com
docker volume prune清除数据卷docker volume prune

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

教学演示环节:演示一下nginx的html目录挂载

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx:1.20.2# 2.然后查看数据卷
docker volume ls# 3.查看数据卷详情
docker volume inspect html# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html# 6.打开页面,查看效果# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash

数据卷的默认目录是比较深的,在更多情况下,我们会直接将容器目录与宿主机指定目录挂载。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

注意:本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

15.6 自定义镜像

镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。

因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

所以镜像就是一堆文件的集合

15.6.1 Dockerfile

Dockerfile记录了镜像结构

常用的指令:

指令说明示例
FROM指定基础镜像FROM centos:7
ENV设置环境变量,可在后面指令使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./xx.jar /tmp/app.jar
RUN执行Linux的shell命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

例如,要基于 centos:7 镜像来构建一个Java应用,其Dockerfile内容如下:

# 使用 CentOS 7 作为基础镜像
FROM centos:7# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH# 创建应用目录
RUN mkdir -p /app
WORKDIR /app# 复制应用 JAR 文件到容器
COPY app.jar app.jar# 暴露端口
EXPOSE 8080# 运行命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

Dockerfile文件编写好了之后,就可以使用如下命令来构建镜像了。

docker build -t 镜像名 .
  • -t :是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest

  • . :是指定Dockerfile所在目录,如果就在当前目录,则指定为"."

15.7 docker网络

每一个容器再被创建出来都会被分配一个虚拟的IP地址,可以通过命令查看:

# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql

容器网络相关的常见命令有:

命令说明
docker network create创建一个网络
docker network ls查看所有网络
docker network rm删除指定网络
docker network prune清除未使用的网络
docker network connect使指定容器连接加入某网络
docker network disconnect使指定容器连接离开某网络
docker network inspect查看网络详细信息

教学演示:自定义网络

# 1.首先通过命令创建一个网络
docker network create itheima# 2.然后查看网络
docker network ls# 结果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   itheima     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了itheima以外,其它都是默认的网络# 3.让 myapp 和 mysql 都加入该网络
# 3.1.mysql容器,加入 itheima 网络
docker network connect itheima mysql# 3.2.myapp容器,也就是我们的java项目, 加入 itheima 网络
docker network connect itheima myapp# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it myapp bash# 4.2.用容器名访问
ping mysql# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.itheima (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

也可以在docker run时用--network参数配置该容器的虚拟网络。

15.8 部署-Java项目

需求:将我们开发的 tlias-web-management 项目打包为镜像,并部署。

步骤:

  • 修改项目的配置文件,修改数据库服务地址(打包package)。

    • 在logback.xml中修改lombok日志文件的文件输出路径

    • 在application.properties文件中修改数据库信息

  • 编写Dockerfile文件(AI辅助)。

    Dockerfile(文件名):

    # 使用 CentOS 7 作为基础镜像
    FROM centos:7# 添加 JDK 到镜像中
    COPY jdk17.tar.gz /usr/local/
    RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ &&  rm /usr/local/jdk17.tar.gz# 设置环境变量
    ENV JAVA_HOME=/usr/local/jdk-17.0.10
    ENV PATH=$JAVA_HOME/bin:$PATH# 阿里云OSS环境变量
    ENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
    ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot#统一编码
    ENV LANG=en_US.UTF-8
    ENV LANGUAGE=en_US:en
    ENV LC_ALL=en_US.UTF-8# 创建应用目录
    RUN mkdir -p /tlias
    WORKDIR /tlias# 复制应用 JAR 文件到容器
    COPY  tlias.jar  tlias.jar# 暴露端口
    EXPOSE 8080# 运行命令
    ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]
  • 构建Docker镜像,部署Docker容器,运行测试。

    • 除了Dockerfile文件外。

    • 依赖基础镜像Linux

    • 依赖jdk镜像,将例如jdk17.tar.gz放到文件中。

    • 构建Docker镜像

      docker build -t tlias:1.0 .
    • 部署Docker容器

      docker run -d --name tlias-server --network itheima -p 8080:8080  tlias:1.0

通过 docker logs -f 容器名,就可以查看容器的运行日志。

这样后端服务,就已经启动起来了。

15.9 部署-Nginx前端

需求:创建一个新的nginx容器,将资料中提供的前端项目的静态资源部署到nginx中。

步骤:

  • 在宿主机上准备静态文件及配置文件存放目录(在 /usr/local 目录下创建 tlias-web 目录)。

    • -v /usr/local/tlias-web/html:/usr/share/nginx/html

    • -v /usr/local/tlias-web/conf/nginx.conf:/etc/nginx/nginx.conf

  • 部署nginx容器

    docker run -d \
    --name nginx-tlias \
    -v /usr/local/tlias-web/html:/usr/share/nginx/html \
    -v /usr/local/tlias-web/conf/nginx.conf:/etc/nginx/nginx.conf \
    --network itheima \
    -p 80:80 \
    nginx:1.20.2

15.10 DockerCompose自动部署

手动的逐一部署,太麻烦了。

而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署

用户通过一个单独的 docker-compose.yml 模板文件定义一组相关联的应用容器。

举例来说,用docker run部署MySQL的命令如下:

docker run -d \
--name nginx-tlias \
-p 80:80 \
-v /usr/local/app/html:/usr/share/nginx/html \
-v /usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf \  
--network itheima \
nginx:1.20.2

如果用docker-compose.yml文件来定义,就是这样:

services:mysql:image: "nginx:1.20.2"container_name: nginx-tliasports:- "80:80"volumes:- "/usr/local/app/html:/usr/share/nginx/html"- "/usr/local/app/conf/nginx.conf:/etc/nginx/nginx.conf"networks:- itheima
networks:itheima:name: itheima

对比如下:

docker run 参数docker compose 指令说明
--namecontainer_name容器名称
-pports端口映射
-eenvironment环境变量
-vvolumes数据卷配置
--networknetworks网络

明白了其中的对应关系,相信编写docker-compose文件应该难不倒大家。

services:mysql:image: mysql:8container_name: mysqlports:- "3307:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"- "/usr/local/app/mysql/data:/var/lib/mysql"- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"networks:- tlias-nettlias:build: context: .dockerfile: Dockerfilecontainer_name: tlias-serverports:- "8080:8080"networks:- tlias-netdepends_on:- mysqlnginx:image: nginx:1.20.2container_name: nginxports:- "80:80"volumes:- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"- "/usr/local/app/nginx/html:/usr/share/nginx/html"depends_on:- tliasnetworks:- tlias-net
networks:tlias-net:name: itheima

编写好docker-compose.yml文件,就可以部署项目了。语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

类型参数或指令说明
Options-f指定compose文件的路径和名称
-p指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

例如:基于DockerCompose部署项目

docker compose up -d

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

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

相关文章

微软无界鼠标(Mouse without Borders)安装及使用:多台电脑共用鼠标键盘

文章目录一、写在前面二、下载安装1、两台电脑都下载安装2、被控端3、控制端主机三、使用一、写在前面 在办公中&#xff0c;我们经常会遇到这种场景&#xff0c;自己带着笔记本电脑外加公司配置的台式机。由于两台电脑&#xff0c;所以就需要搭配两套键盘鼠标。对于有限的办公…

nodejs 编程基础01-NPM包管理

1:npm 包管理介绍 npm 是nodejs 的包管理工具&#xff0c;类似于java 的maven 和 gradle 等&#xff0c;用来解决nodejs 的依赖包问题 使用场景&#xff1a;1. 从NPM 服务骑上下载或拉去别人编写好的第三方包到本地进行使用2. 将自己编写代码或软件包发布到npm 服务器供他人使用…

基于Mediapipe_Unity_Plugin实现手势识别

GitHub - homuler/MediaPipeUnityPlugin: Unity plugin to run MediaPipehttps://github.com/homuler/MediaPipeUnityPlugin 实现了以下&#xff1a; public enum HandGesture { None, Stop, ThumbsUp, Victory, OK, OpenHand } 核心脚本&#xff1a…

Android 项目构建编译概述

主要内容是Android AOSP源码的管理方式&#xff0c;项目源码的构建和编译&#xff0c;用到比如git、repo、gerrit一些命令工具&#xff0c;以及使用Soong编译系统&#xff0c;编写Android.bp文件的格式样式。 1. Android操作系统堆栈概述 Android 是一个针对多种不同设备类型打…

Python爬虫08_Requests聚焦批量爬取图片

一、Requests聚焦批量爬取图片 import re import requests import os import timeurl https://www.douban.com/ userAgent {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0}#获取整个浏览页面 page_text requests.get(urlur…

Spring Cloud系列—简介

目录 1 单体架构 2 集群与分布式 3 微服务架构 4 Spring Cloud 5 Spring Cloud环境和工程搭建 5.1 服务拆分 5.2 示例 5.2.1 数据库配置 5.2.2 父子项目创建 5.2.3 order_service子项目结构配置 5.2.4 product_service子项目结构配置 5.2.5 服务之间的远程调用 5.…

【普中STM32精灵开发攻略】--第 1 章 如何使用本攻略

学习本开发攻略主要参考的文档有《STM32F1xx 中文参考手册》和《Cortex M3权威指南(中文)》&#xff0c;这两本都是 ST 官方手册&#xff0c;尤其是《STM32F1xx 中文参考手册》&#xff0c;里面包含了 STM32F1 内部所有外设介绍&#xff0c;非常详细。大家在学习 STM32F103的时…

【Docker】RK3576-Debian上使用Docker安装Ubuntu22.04+ROS2

1、简述 RK3576自带Debian12系统,如果要使用ROS2,可以在Debian上直接安装ROS2,缺点是有的ROS包需要源码编译;当然最好是使用Ubuntu系统,可以使用Docker安装,或者构建Ubuntu系统,替换Debian系统。 推荐使用Docker来安装Ubuntu22.04,这里会有个疑问,是否可以直接使用Do…

解决docker load加载tar镜像报json no such file or directory的错误

在使用docker加载离线镜像文件时&#xff0c;出现了json no such file or directory的错误&#xff0c;刚开始以为是压缩包拷贝坏了&#xff0c;重新拷贝了以后还是出现了问题。经过网上查找方案&#xff0c;并且自己实践&#xff0c;采用下面的简单方法就可以搞定。 归结为一句…

《协作画布的深层架构:React与TypeScript构建多人实时绘图应用的核心逻辑》

多人在线协作绘图应用的构建不仅是技术栈的简单组合,更是对实时性、一致性与用户体验的多维挑战。基于React与TypeScript开发这类应用,需要在图形绘制的基础功能之外,解决多用户并发操作的同步难题、状态回溯的逻辑冲突以及大规模协作的性能瓶颈。每一层架构的设计,都需兼顾…

智慧社区(八)——社区人脸识别出入管理系统设计与实现

在社区安全管理日益智能化的背景下&#xff0c;传统的人工登记方式已难以满足高效、精准的管理需求。本文将详细介绍一套基于人脸识别技术的社区出入管理系统&#xff0c;该系统通过整合腾讯云 AI 接口、数据库设计与业务逻辑&#xff0c;实现了居民出入自动识别、记录追踪与访…

嵌入式开发学习———Linux环境下IO进程线程学习(四)

进程相关函数fork创建一个子进程&#xff0c;子进程复制父进程的地址空间。父进程返回子进程PID&#xff0c;子进程返回0。pid_t pid fork(); if (pid 0) { /* 子进程代码 */ } else { /* 父进程代码 */ }getpid获取当前进程的PID。pid_t pid getpid();getppid获取父进程的P…

标记-清除算法中的可达性判定与Chrome DevTools内存分析实践

引言 在现代前端开发中&#xff0c;内存管理是保证应用性能与用户体验的核心技术之一。作为JavaScript运行时的基础机制&#xff0c;标记-清除算法(Mark-and-Sweep) 通过可达性判定决定哪些内存需要回收&#xff0c;而Chrome DevTools提供的Memory工具则为开发者提供了深度的内…

微算法科技(NASDAQ:MLGO)基于量子重加密技术构建区块链数据共享解决方案

随着信息技术的飞速发展&#xff0c;数据已成为数字经济时代的核心生产要素。数据的共享和安全往往是一对难以调和的矛盾。传统的加密方法在面对日益强大的计算能力和复杂的网络攻击时&#xff0c;安全性受到了挑战。微算法科技(NASDAQ&#xff1a;MLGO)通过引入量子重加密技术…

FastAPI快速入门P2:与SpringBoot比较

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录引言1 FastAPI事件管理2 类的使用2.1 初始化方法对…

SAP-ABAP: Open SQL集合函数COUNT(统计行数)、SUM(数值求和)、AVG(平均值)、MAX/MIN(极值)深度指南

SAP Open SQL集合函数深度指南 1. 核心价值与特性函数作用关键特性COUNT统计行数用COUNT(*)包含NULL值行&#xff0c;COUNT(字段)排除NULLSUM数值求和自动过滤NULL值&#xff0c;结果类型与源字段相同AVG平均值必须用TYPE f接收&#xff0c;否则四舍五入导致精度丢失MAX/MIN极值…

【docker】UnionFS联合操作系统

Linux 的 Namespace、CGroups 和 UnionFS 三大技术支撑了 Docker 的实现。 一、为什么需要联合文件系统&#xff1f;在传统操作系统中&#xff0c;每个文件系统都是独立的孤岛。但当我们需要&#xff1a;合并多个目录的内容保持基础系统不变的同时进行修改高效共享重复文件内容…

CTF-XXE 漏洞解题思路总结

一、XXE 漏洞简介XXE (XML External Entity) 漏洞允许攻击者通过构造恶意的 XML 输入&#xff0c;强迫服务器的 XML 解析器执行非预期的操作。在 CTF 场景中&#xff0c;最常见的利用方式是让解析器读取服务器上的敏感文件&#xff0c;并将其内容返回给攻击者。二、核心攻击载荷…

GitLab:一站式 DevOps 平台的全方位解析

GitLab&#xff1a;一站式 DevOps 平台的全方位解析 在当今数字化时代&#xff0c;软件研发的效率与质量直接决定企业的市场竞争力。GitLab 作为全球领先的 DevOps 平台&#xff0c;凭借 “从构思到部署” 的全流程管理能力&#xff0c;已成为无数企业加速软件交付的核心工具。…

Flink富函数:一种更灵活、可扩展的方式来定义数据流的处理逻辑

本文重点 Flink中的富函数类是一组用于处理数据流的函数接口和实现类。富函数类提供了一种更灵活和可扩展的方式来定义数据流的处理逻辑。 富函数类 富函数类是DataStream API提供的一个函数类的接口,所有的Flink函数类都有其Rich版本。富函数类一般是以抽象类的形式出现的。…