[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

文章目录
- 1.参考项目
- 2.技能点
- 3.GO的Dockerfile配置
- 后端的结构如图
- Dockerfile
- 先手动docker调试服务是否可以启动
- 报错
- 4.Vue的Dockerfile配置
- 前端的结构如图
- nginx_docker.conf
- Dockerfile
- 构建
- 5.docker-compose 整合前后端
- docker-compose.yml
- 错误记录
- (1)ip+端口改为https域名访问
- 第一种:通过挂载ssl证书文件,增加端口解决,当然可以解决,但是我得物理机现在有80,443端口造成了冲突,这种方式我直接进入到容器内,是可以访问https域名地址的;
- 第二种:直接在物理机的nginx,因为配置了多域名访问,多虚拟主机操作,直接代理转发同时配置ssl证书,也可以正常访问,只是这种是容器+物理机nginx转发操作。
- (2)镜像仓库解决方案
- 推送后端镜像
- 推送前端镜像
- 6.Docker清理缓存操作
将公司物理机项目改为容器化部署,最终方案是通过容器docker-compose部署使项目可以ip+端口访问,再通过物理机nginx代理进行https域名访问。
可能还有更好的方式,开一个nginx的容器,进行代理,但由于跟物理机80,443端口冲突,暂时没有采用。
可能目前处理不是最好的方式,不过容器化已经运用到项目,后续要在不断学习中优化,加油! 过程中参考很多经验的博主的文章,不断成长不断学习
1.参考项目
- 用 Docker 构建一个前后端分离的项目 (go+vue)
- github-gin-vue-blog
- github-compose
- goctl的Ddockerfile
- 一个基于 docker 的 go-zero 本地开发运行环境
- Gin-Vue-Admin文档
- Dockerfile 多阶段构建
- docker-compose 打包部署各种语言开发环境
- docker-compose编排部署多服务Web应用
- 手动在进入容器,在Apache中新建一个测试页面
- Compose 模板文件
- docker-compose nginx + ssl配置
- Docker nginx https二级域名无端口访问多个web项目
2.技能点
-
多段构建
- 作用是减少构建时间、减小镜像体积
-
配置、网络与存储关系

-
Dockerfile基础概念
-
nginx代理
以 community_backend 社区项目为例
技术栈
- go 1.18.10
- vue 3.2.13
- redis 5.0
- mysql 5.7
- ecs 2c4g 10M
3.GO的Dockerfile配置
后端的结构如图
community_backend
--configs
--...
--cmd
----main.go
--go.mod
--Dockerfile
服务在 /cmd/main.go 下,build 的时候使用命令 go build /cmd/main.go
我们把 Dockerfile 建立在项目的根目录下,然后写入以下的文件
Dockerfile
# 使用 golang:alpine作为编译使用的容器, 并且将其命名为build
FROM golang:alpine as build
# FROM golang:1.18.10-alpine as build# 安装gcc等其他编译工具
# RUN apk add build-base# --no-cache 选项用于不将软件包的索引缓存到镜像中,以减小镜像大小。
# ca-certificates 包是一个包含各种根证书的集合,用于验证 HTTPS 连接的证书链的有效性。
# 通过安装该包,Docker 镜像将包含一组常见的根证书,以便应用程序可以验证和建立安全的 HTTPS 连接。
RUN apk --no-cache add ca-certificates# 如果在国内用goproxy
# ENV GOPROXY https://goproxy.cn,direct
# ENV GO111MODULE="on"# 设定一个工作目录
WORKDIR /go/src/community_backend# 复制当前文件夹下所有文件到工作目录中
COPY . .# 编译服务端
# RUN go generate && go env && go build -v -gcflags="all=-N -l" -o vc_community ./cmd/*.go # 配置 golang 环境
RUN go env -w GO111MODULE=on \&& go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct \&& go mod tidy \&& go build -v -gcflags="all=-N -l" -o cmd/vc_community ./cmd/*.go # ===========================================================
# 多阶段构建运行服务端# 因为是在alpine里构建的, 所以同样使用alpine镜像作为运行的容器
FROM alpine:latest# 维护者
LABEL MAINTAINER = "ifanaticfire@gmail.com"# 设定一个工作目录
WORKDIR /go/src/community_backend# 从上一个容器build中复制所有的代码包含可执行文件到当前的工作目录
# COPY --from=build /go/src/community_backend ./COPY --from=build /go/src/community_backend/cmd ./cmd
COPY --from=build /go/src/community_backend/configs ./configs
COPY --from=build /go/src/community_backend/storage ./storage# 暴露端口
EXPOSE 8083# 启动服务端
#ENTRYPOINT ./cmd/vc_community --env=./cmd/env.toml
CMD cd cmd && ./vc_community
先手动docker调试服务是否可以启动
cd community_backend
// 构建镜像, community-backend 为镜像名字
docker build -t community-backend:v0.1 .
// 运行
docker run -it -p "8083:8083" --rm community-backend:v0.1
报错
- returned a non-zero code: 2
- 编译时缺少gcc组件
- 外网ip+端口无法访问后端容器服务
- 配置文件中监听方式由127.0.0.1:8083 改为 0.0.0.0:8083
4.Vue的Dockerfile配置
前端的结构如图
community-Frontend
--src
--vue.config.js
--nginx_docker.conf
--public
--package.json
--Dockerfile
nginx_docker.conf
server {listen 8084;server_name _;client_max_body_size 50M;#listen 443 ssl;#server_name community.humengxu.com;#ssl_certificate /etc/nginx/ssl/fullchain.cer;#ssl_certificate_key /etc/nginx/ssl/humengxu.com.key;#ssl_session_timeout 5m;# 指定SSL服务器端支持的协议版本# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 指定加密算法#ssl_ciphers HIGH:!aNULL:!MD5;# 在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法#ssl_prefer_server_ciphers on;location /v1/ {proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $http_x_real_ip; #$remote_addr;proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://177.7.0.11:8083/v1/;#设置允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "POST, GET, DELETE, OPTIONS";add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";add_header Access-Control-Allow-Credentials true;}location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html last;# proxy_pass http://localhost:8084;}
}#配置转发
#server {
# listen 80;
# server_name community.humengxu.com;
#
# return 301 https://$server_name$request_uri;
#}
Dockerfile
# 声明镜像来源为node:16.14.2,命名为build
FROM node:16.14.2 as build# 声明工作目录
WORKDIR /community_frontend/# 拷贝整个前端项目到当前工作目录
COPY . .# 通过npm下载cnpm
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org# 使用cnpm进行安装依赖
RUN cnpm install || npm install# 安装所有的依赖
RUN npm install# 打包项目,生成的文件保存在./dist下
RUN npm run build# ===========================================================
# 多阶段构建#使用nginx
FROM nginx:alpineLABEL MAINTAINER = "ifanaticfire@gmail.com"# 暴露8084端口
EXPOSE 8084
EXPOSE 8085# 复制打包好的文件到nginx的www目录下
COPY --from=build /community_frontend/dist /usr/share/nginx/html# 把nginx的默认配置改成我们自己的
COPY --from=build /community_frontend/nginx_docker.conf /etc/nginx/conf.d/default.conf
构建
cd community_frontend
// 构建镜像, backend 为镜像名字
docker build -t community-frontend:v0.1 .
// 运行,--rm 在容器停止后自动删除容器
# docker run -it -p "8084:8084" --rm community-frontend:v0.1
5.docker-compose 整合前后端
项目结构
-- community_backend
-- community_frontend
-- docker-compose.yaml
关联的mysql和redis都采用云服务,如没有则需要单独构建mysql容器和redis容器提供服务,这里不做单独容器操作。
我们有两个 service,分别是 frontend,backend
在每个 services 里,我们通过 networks 选项给每个容器分配了一个网络,以及对应的 ip 地址。
比如 backend 就分配到了 177.7.0.11,这就是前端的nginx配置的地址。
同时,frontend 依赖 backend,这样可以让容器按顺序 (backend-frontend) 启动,以此来避免不必要的错误。
docker-compose代码片段创建了一个名为 clinicalapi 的自定义网络,并指定了 IP 地址管理的配置。其中,使用默认的 IPAM 驱动程序,并为网络分配了 177.7.0.0/16 的子网。这样,容器可以在该网络中分配 IP 地址,并可以通过该网络进行通信。
docker-compose.yml
version: "3"networks:clinicalapi:ipam:driver: defaultconfig:- subnet: '177.7.0.0/16'services:frontend:build:context: ./community_frontenddockerfile: ./Dockerfilecontainer_name: community-frontendrestart: alwaysports:- '8084:8084'# - '80:80'# - '443:443'#volumes:# - /usr/local/nginx/conf/ssl/humengxu.com:/etc/nginx/ssldepends_on:- backendcommand: [ 'nginx-debug', '-g', 'daemon off;' ]networks:clinicalapi:ipv4_address: 177.7.0.10backend:build:context: ./community_backenddockerfile: ./Dockerfilecontainer_name: community-backendrestart: alwaysports:- '8083:8083'networks:clinicalapi:ipv4_address: 177.7.0.11
完成 docker-compose.yaml 的编写后就可以尝试运行了
// 强制重写build
docker-compose up --build
// 直接运行
docker-compose up
// 后台运行
docker-compose up -d
错误记录
- 1.容器名称中不能含有除
[a-zA-Z0-9][a-zA-Z0-9_.-]之外的内容,我上线容器采用了_,需要修改 - 2.当docker-compose.yml目录换了位置,就报错
[+] Running 0/0⠿ Network community_clinicalapi Error 0.0sfailed to create network community_clinicalapi: Error response from daemon: Pool overlaps with other one on this address space
解决:由于更换了目录,启动docker-compose.yml,存在网卡冲突的情况,需要删除网卡和对应网卡的容器即可;如下删除clinical_clinicalapi的网卡
```
docker network ls # 查看docker网卡
docker network inspect <网卡id> # 查看具体信息,找到与subnet冲突的是哪个
docker network rm <网卡id> # 删除冲突的网卡docker network ls
NETWORK ID NAME DRIVER SCOPE
3b95a7847c0f bridge bridge local
da49214cfad9 chatgpt_default bridge local
e084524662f9 clinical_clinicalapi bridge local
851e84525446 docker-compose_default bridge local
836d22ebeff8 gitlab_default bridge local
20e8d6149527 host host local
0c37e84ee02c ifanaticfire_default bridge local
74099f10338f none null local```
以上均是由步骤总结
从git clone 代码仓库 -> 通过Dockerfile打镜像,跑容器-> 再通过docker-compose整合前后端容器,并运行;
按照如上部署已经完整的将go+vue项目部署到容器中国,不过还有如下问题:
- (1)目前配置是走ip+端口形式,需要改为域名形式访问,并且要追加ssl证书;原来物理机就是这么访问的,所以目前容器化还需要改造
- (2)没有存储镜像仓库,而是由代码直接打镜像运行,不利于维护
(1)ip+端口改为https域名访问
第一种:通过挂载ssl证书文件,增加端口解决,当然可以解决,但是我得物理机现在有80,443端口造成了冲突,这种方式我直接进入到容器内,是可以访问https域名地址的;
通过 -v 挂载证书,通过-p 映射端口也是可以的,存在docker中有多个nginx的情况,就代理转发一下, 参考地址:Docker多nginx方案:https://juejin.cn/post/6847902222760558599#heading-11
docker run -it -p 443:443 -p 80:80 -v /usr/local/nginx/conf/ssl/humengxu.com:/etc/nginx/ssl --rm community-frontend:v0.1
第二种:直接在物理机的nginx,因为配置了多域名访问,多虚拟主机操作,直接代理转发同时配置ssl证书,也可以正常访问,只是这种是容器+物理机nginx转发操作。
虚拟主机的配置,用于在一台服务器上托管多个网站或应用程序。
虚拟主机允许通过同一个IP地址和端口来访问多个域名或应用程序,并根据请求的域名或其他条件来将请求路由到相应的网站或应用程序。
- 在Apache中,虚拟主机的配置通常是通过在配置文件(如httpd.conf或apache2.conf)中添加VirtualHost块来实现。每个VirtualHost块对应一个虚拟主机的配置,其中包含了该虚拟主机的域名、目录路径、日志文件路径等相关信息。可以根据需要添加多个VirtualHost块,每个块对应一个虚拟主机。
- 在Nginx中,虚拟主机的配置通过server块来实现。每个server块对应一个虚拟主机的配置,其中包含了该虚拟主机的域名、目录路径、日志文件路径等相关信息。可以根据需要添加多个server块,每个块对应一个虚拟主机。
communit_frontend.conf
server
{listen 443 ssl;server_name community.humengxu.com; ssl_certificate /usr/local/nginx/conf/ssl/humengxu.com/fullchain.cer;ssl_certificate_key /usr/local/nginx/conf/ssl/humengxu.com/humengxu.com.key;ssl_session_timeout 5m; # 指定SSL服务器端支持的协议版本# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; 指定加密算法ssl_ciphers HIGH:!aNULL:!MD5;# 在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法ssl_prefer_server_ciphers on; location /v1/ {proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $http_x_real_ip; #$remote_addr;proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;proxy_pass https://community-api.varclear.com/v1/;#设置允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "POST, GET, DELETE, OPTIONS";add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";add_header Access-Control-Allow-Credentials true;}location / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://1.14.34.33:8084/;}
}
# 配置转发
server {listen 80; server_name community.humengxu.com;# return 301 https://$server_name$request_uri;rewrite ^(.*)$ https://${server_name}$1 permanent;
}
(2)镜像仓库解决方案
制作前端和后端的镜像,然后把制作好的镜像发布
推送默认的dockerhub仓库中(当然可以自建仓库,用阿里云oss等都行)
将docker-compose打包的镜像改名字上传仓库
推送后端镜像
docker tag clinical-backend:latest firehmx/clinical-backend:v0.1
docker push firehmx/clinical-backend:v0.1
推送前端镜像
docker tag clinical-frontend:latest firehmx/clinical-frontend:v0.1
docker push firehmx/clinical-frontend:v0.1
接着修改 docker-compose.yml,把 build 参数改为 image,填上我们自己的镜像名字就行了。
services:frontend:build:context: ./community_backenddockerfile: ./Dockerfile... 改为frontend:image: firehmx/clinical-frontend:v0.1...backend:build:context: ./community_backenddockerfile: ./Dockerfile...改为backend:image: firehmx/clinical-backend:v0.1...
配置好docker-compose.yml,然后用 docker-compose up 就可以运行这整一个前后端分离项目
6.Docker清理缓存操作
- 参考地址:https://docs.docker.com/engine/reference/commandline/builder_prune/
- 在构建测试的过程中,由于是自家小服务器,资源紧张,发现磁盘一直爆满,删除一些大镜像还是会占满的情况,就想到是不是也是缓存问题。
经过查询确实是build过程中的缓存启发的占用问题。
因此引出以下知识点,如何清除docker的构建过程中的缓存
Docker 18.09 引入了 BuildKit ,提升了构建过程的性能、安全、存储管理等能力。
docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况:
TYPE 列出了 Docker 使用磁盘的 4 种类型:
| 类型 | 说明 |
|---|---|
| Images | 所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。 |
| Containers | 运行的容器占用的空间,表示每个容器的读写层的空间。 |
| Local Volumes | 容器挂载本地数据卷的空间。 |
| Build Cache | 镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。 |
没清理前:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 46 18 8.928GB 6.253GB (70%)
Containers 29 6 1.779GB 1.779GB (99%)
Local Volumes 5 5 759.8MB 0B (0%)
Build Cache 176 0 5.59GB 5.59GB
清理后:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 46 18 8.928GB 6.253GB (70%)
Containers 29 6 1.779GB 1.779GB (99%)
Local Volumes 5 5 759.8MB 0B (0%)
Build Cache 111 0 0B 0B
一键清理 Build Cache 缓存命令:
docker builder prune
如果你希望保留最近一定时间的缓存,删除时长更久的缓存,可以通过添加 --filter 参数实现,例如保留最近10天的缓存示例命令如下:
docker builder prune --filter 'until=240h'
另外,命令 docker system prune 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。
添加参数 docker system prune -a 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
相关文章:
[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目
文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录(1)ip端…...
springboot-mybatis的增删改查
目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作: 准备数据库表 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动…...
HTML5(H5)的前生今世
目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联…...
抽象工厂模式(Abstract Factory)
抽象工厂模式提供一个创建一组相关或相互依赖的对象的接口,而无须指定它们具体的类,每个子类可以生产一系列相关的产品。 The Abstract Factory Pattern is to provide an interface for creating families of related or dependent objects without s…...
Java 实现下载文件工具类
package com.liunian.utils;import lombok.SneakyThrows;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream;/*** ClassName DownloadFileUtils* Author liuyan 下载文件工具类…...
C# 12 预览版的新功能
作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...
34.利用matlab解 多变量多目标规划问题(matlab程序)
1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...
暑假刷题第18天--7/30
165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...
通向架构师的道路之Apache整合Tomcat
一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…...
如何消除“信息孤岛”对业务增长的威胁?
根据CMSWire的数据,员工平均每天要花36%的时间来查找和整合信息。但44%的情况下,他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛? 当部门存储数据并限制其他人访问数据时,就会出现信息孤岛ÿ…...
Kali部署dvwa和pikachu靶场
kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…...
LeetCode解法汇总722. 删除注释
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给一个 C 程序,删除程序中的注释。这个程序source是一个数组&#x…...
Linux中的firewall-cmd
2023年8月4日,周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务?为什么会有服务?打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones࿰…...
python 最大归一化
最大归一化是将数据转化到[-1,1]范围之间。公式如下 其中|X|max为x特征的绝对值的最大值。 数据标准化算法介绍—数据建模工具_预处理_Max_字段 """ 最大绝对值归一化(max abs normalization ):也就是将数值变为单位长度&…...
Netty:ByteBuf写入数据、读出数据
介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index 1大于ByteBuf的容量,就会抛出IndexO…...
C++(15):面向对象程序设计
面向对象程序设计概述 面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。 1.使用数据抽象,可以将类的接口与实现分离; 2.使用继承,可以定义相似的类型并对其相似关系建模&#x…...
2023牛客暑期多校训练营6-A Tree
2023牛客暑期多校训练营6-A Tree https://ac.nowcoder.com/acm/contest/57360/A 文章目录 2023牛客暑期多校训练营6-A Tree题意解题思路代码 题意 解题思路 最大价值和这个数据范围,一眼 d p dp dp。 直接在树上并不好处理,问题是如何有效转化、处理…...
Vc - Qt - QPainter::SmoothPixmapTransform及QPainter::Antialiasing
QPainter::SmoothPixmapTransform是一个标志,用于指定绘制操作中的平滑像素变换行为。当使用QPainter绘制一幅图像时,设置SmoothPixmapTransform标志可以使图像变换过程更加平滑,减少锯齿状边缘的出现。此标志通常用于绘制缩放后图像的情况。…...
【练习】条件变量:创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC
题目: 创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC......要求使用条件变量 #include <stdio.h> #include <pthread.h> #include <unistd.h>//创建互斥锁 pthread_mutex_t mutex PTHREAD_MUTE…...
SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)
初衷 💢初衷💢 因为一遍遍修改并重启项目觉得很麻烦,所以刚开始就自己给项目配置了热加载,但奈何代码更新还是慢,还不如我重启一遍项目的速度,所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
