4.docker容器编排(docker compose 与 docker swarm)
本文目录
- 1.容器编排
- 2.Docker Compose
- 1.Docker Compose 安装
- 2.Docker Compose 示例
- 1.使用 docker-compose 启动 nginx
- 2.docker compose 常用命令
- 3.校验 docker-compose.yml 是否有错误
- 4.创建服务,启动容器
- 5.弹性伸缩<扩缩容>
- 3.Docker Swarm
- 1.Swarm 架构图
- 2.Swarm 节点说明
- 3.Swarm 集群部署
- 1.了解docker swarm 命令
- 2.初始化集群
- 3.work节点加入集群
- 4.查看swarm集群节点信息
- 4.部署服务命令
- 5.部署服务
- 6.弹性伸缩<扩缩容>
- 缩容
- 7.节点离开swarm集群
- 8.删除离开的节点
- 9.离开的节点,再次加入swarm集群
- 10.退出 docker swarm 集群
1.容器编排
容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。
实例:一个java程序,依赖了mysql,redis,要想把 java 程序运行起来,则必须要先启动 mysql、redis。那么这三者这件就存在了依赖关联。
容器编排存在的意义:
- 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
- 副本数控制,容器有时候也需要集群,快速的对容器集群进行弹性伸缩
- 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务
容器编排的出现,就是让开发者可以更简单的使用容器,省去频繁的写各种命令,docker 容器编排的出现,就类似 shell 脚本,一键搞定!
容器编排,主要有两种模式:
- 基于Docker Compose(单机)
- 基于Swarm(集群)
2.Docker Compose
Docker Compose 是单机环境下的容器编排。
有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理
docker compose 容器编排,就是基于docker-compose.yml
配置文件进行的容器编排。只要学会如何编写这个配置文件,就会用这个玩意了。
1.Docker Compose 安装
注意:需要注意的是,docker-compose 与docker有版本对应关系,因此在使用docker-compose时需要选择与已安装的docker版本相对应的docker-compose版本,否则可能会出现不兼容或无法正常工作的问题。但是!我在官网一致没有找到 docker 和 docker-compose 的对应关系表啊,有知道的小伙伴能评论发我一下吗??我只找到个 docker compose 发行版本,依赖的 docker 需要升级的版本,docker compose 发行版本地址:https://docs.docker.com/compose/release-notes。如下图所示:
因为 docker 使用的是最新版本:24.0.6
,所以 docker compose 也使用了最新版本2.21.0
还有一个对应关系表,在这里,也没有太看懂。地址:
- https://docs.docker.com/compose/compose-file/compose-file-v2
- https://docs.docker.com/compose/compose-file/compose-file-v3
Docker Compose 下载地址:https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64
# step 1:下载 docker compose 最新版本
curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# $(uname -s) 系统内核,即:linux
# $(uname -m) 系统架构,即:x86_64# step 2:将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose# step 3:创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose# step 4:测试是否安装成功
docker-compose --version
2.Docker Compose 示例
# docker 启动 nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose nginx
# 命令解释:
# -d 后台运行
# --restart=always 出现异常后总是自动重启
# --network xxx 自定义网络
# -v /www/abc:/usr/share/nginx/html 将[本地目录/www/abc]与[容器目录/usr/share/nginx/html] 进行数据卷绑定
# -e APP_ENV=dev 添加环境变量
# -p 80:80 端口映射
# --name 容器名称
# nginx 镜像名
上述命令,就可以在 docker 中启动一个 nginx 容器了。
- 在不使用来回复制、粘贴的方式,如何将这条命令复用呢?
- 这个命令还不算太长,如果命令更长的怎么办呢?
这样就需要用到 docker compose 了。
1.使用 docker-compose 启动 nginx
创建一个
/opt/docker/nginx
文件夹,在nginx文件夹下创建一个docker-compose.yml
文件,进入文件,就可以编写 docker compose了
参考官网进行编写docker compose即可。因为docker compose的配置项太多了。截至
2023-09-14
,使用的docker 24.0.6
和docker compose 2.21.0
,所以此处直接使用 Compose V3版本。地址:https://docs.docker.com/compose/compose-file/compose-file-v3
配置超级多,根本记不住。所以参考官网来写就好了。
如果是一个普通的镜像,更多的关注【服务services】、【网络networks】、【数据卷volumes】这三个配置项就可以了
# docker 启动 nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose nginx
上面的命令,转成 nginx compose 如下:
version: "3.8"
services: nginx-demo-compose:contianer_name: "nginx-compose"image: nginxrestart: alwaysnetworks: nginx_netvolumes:- /www/abc:/usr/share/nginx/htmlenvironment:- APP_ENV=devports:- 80:80networks:nginx_net:ipam:driver: defaultconfig:- subnet: "172.16.238.0/24"
2.docker compose 常用命令
命令 | 说明 |
---|---|
build | 先构建完镜像,然后构建一个docker服务(如果开始就已经是个镜像了,则会跳过,命令不生效) |
config | 规范、验证并查看 compose 文件,验证通过后,控制台会返回 compose 文件内容 |
cp | 在容器和本地文件系统之间复制文件/文件夹 |
create | 为 compose 中的 service 服务创建容器。 |
down | 停止并删除容器、网络 |
events | 从容器接收实时事件 |
exec | 在运行中的容器中执行命令 |
images | 列出创建的容器使用的镜像 |
kill | 强制停止服务容器 |
logs | 查看容器的日志输出 |
ls | 列出正在运行的 compose 项目 |
pause | 暂停 service 服务 |
port | 输出端口绑定的公共端口 |
ps | 列出容器 |
pull | 拉取 service 服务镜像 |
push | 推送 service 服务镜像 |
restart | 重启 service 服务容器 |
rm | 删除停止的服务容器 |
run | 在服务上运行一次性命令 |
start | 启动服务 |
stop | 停止服务 |
top | 显示正在运行的进程 |
unpause | 取消暂停服务 |
up | 创建并启动一个容器 |
version | 显示 Docker Compose 版本信息 |
wait | 等待阻塞直到第一个服务容器停止 |
提示: 更详细命令说明,使用
docker compose [命令] --help
了解。比如:docker compose up --help
扩缩容命令:
命令 | 说明 |
---|---|
docker compose up --scale 服务名=num | 扩容/缩容,服务名为compose文件服务名,num 为数量 |
3.校验 docker-compose.yml 是否有错误
# 进入/opt/docker/nginx 目录,在docker-compose.yml同级下,执行如下命令
docker compose config
4.创建服务,启动容器
进入
/opt/docker/nginx
目录下,在docker-compose.yml
同级目录下,开始操作
# step 1:创建服务(此处也可以启动compose中的特定服务:docker compose create 服务名)
docker compose create
# step 2:查看服务是否创建成功
docker compose ps -a
# step 3:后台启动容器
docker compose up -d
如图所示:
5.弹性伸缩<扩缩容>
扩缩容命令,如下:
docker compose up -d --scale 服务名=num
扩缩容注意:
- 需要删除 container_name (docker 不允许多个容器具有相同的名称)
- 修改 port 端口映射(一个服务只能一个端口,会提示端口占用问题)
修改后的 docker-compose.yaml 如下:
version: "3.8"
services: nginx-demo:image: nginxrestart: alwaysnetworks: - nginx_netvolumes:- /www/abc:/usr/share/nginx/htmlenvironment:- APP_ENV=devports:- 80 # 此处80代表容器中的80端口,映射到本地的随机端口networks:nginx_net:ipam:driver: defaultconfig:- subnet: "172.16.238.0/24"
修改配置信息后,执行
docker compose up -d
,便会重新读取compose配置,启动容器
3.Docker Swarm
Swarm 也是需要提前安装好 Docker Compose !!!
Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的, 它是将一群 Docker 宿主机变成一个单一的虚拟主机,Swarm 使用标准的 Docker API 接口作为其前端的访问入口,换言之,各种形式的DockerClient(compose, docker-py 等) 均可以直接与 Swarm 通信,甚至 Docker 本身都可以很容易的与 Swarm 集成,这大大方便了用户将原本基于单节点的系统移植到 Swarm 上,同时Swarm 内置了对 Docker 网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,所以 swarm 我们无需手动安装。
Swarm deamon只是一个调度器(Scheduler) + 路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。https://github.com/docker/swarm
k8s 的出现早于 swarm,所以 swarm 的诞生,就是为了与 k8s 竞争,k8s 已经很成熟了,所以目前市场上用的 k8s 的还是挺多的,swarm 相对来说用的还不是提多。
1.Swarm 架构图
2.Swarm 节点说明
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
Swarm节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。
来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
3.Swarm 集群部署
三台机器如下:每台机器都安装好 docker
和 docker-compose
IP | 角色 |
---|---|
192.168.204.101 | manager 管理节点 |
192.168.204.102 | worker 工作节点 |
192.168.204.103 | worker 工作节点 |
1.了解docker swarm 命令
# 查看docker swarm 命令
docker swarm --help[root@localhost ~]# docker swarm --helpUsage: docker swarm COMMANDManage SwarmCommands:init Initialize a swarmjoin Join a swarm as a node and/or managerRun 'docker swarm COMMAND --help' for more information on a command.
# 查看 swarm 集群状态
docker info
# 查看 swarm 集群节点信息
docker node ls
2.初始化集群
# 登录管理节点,并执行如下命令
docker swarm init --advertise-addr 192.168.204.101# 返回如下信息
[root@localhost ~]# docker swarm init --advertise-addr 192.168.204.101
Swarm initialized: current node (2tlpn6ywqh9kms9ymgndpoinc) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
3.work节点加入集群
复制初始化集群返回的命令,分别在 两个work 节点执行,将work节点加入 swarm 集群。
记得:关闭防火墙,或者开放端口 2377!!!
先关闭防火墙:systemctl stop firewalld
然后永久关闭防火墙:systemctl disable firewalld
# 加入swarm集群命令
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377
加入成功如图所示:
4.查看swarm集群节点信息
进入 manager 管理节点,通过
docker node ls
查看集群节点信息。work 节点无法查看哦!
4.部署服务命令
在管理节点,通过命令 docker service 部署服务,通过
docker service --help
查看详细命令
命令 | 说明 |
---|---|
create | 创建一个新的服务 |
inspect | 展示一个/多个服务的详细信息 |
logs | 查看服务/任务的日志 |
ls | 显示所有service服务 |
ps | 显示一个/多个服务的所有task |
rm | 删除一个/多个服务 |
rollback | 恢复service服务的配置信息 |
scale | 弹性扩缩容service服务 |
update | 更新service服务 |
5.部署服务
在管理节点,通过命令 docker service 部署服务,此处来部署一个 nginx 服务
# 部署一个nginx服务
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx
# --replicas 1 一个副本
# -p 80:80 端口映射
# --name 自定义名称
# manager管理节点, 查看所有service服务
docker service ls
# 在 manager 和 work 节点,都执行 docker ps 命令,查看服务是否启动成功
docker ps
# 访问服务
curl 192.168.204.101
如果要想在管理端去访问 curl 192.168.204.202 和 192.168.204.203,也显示服务正常。
需要先扩容至副本数为 3,即可。
提示:另一种情况:副本数为3后,现在指定节点203退出swarm集群,此时 3 个副本就会重新分配(比如:201机器2个副本,202机器1个副本,如果此时203节点重新加入后,即使203这个节点上没有这个副本,集群会帮我们自动分发服务,你同样还是可以访问curl 192.168.204.203 成功)
6.弹性伸缩<扩缩容>
以下命令,在
manager 管理节点
执行操作
# 副本数扩容(nginx_swarm:服务名)
docker service update --replicas 3 nginx_swarm
错误提示:error creating external connectivity network: Failed to Setup IP tables: U
解决方案:关闭防火墙后,需要重启 docker 服务
命令:service docker restart
缩容
修改 --replicas 的个数即可。
7.节点离开swarm集群
# 哪个节点要离开集群,在指定节点执行如下命令
docker swarm leave
管理节点查看节点信息,可以看到有个节点已经Down
了
8.删除离开的节点
以下命令,在
manager 管理节点
执行操作
# 删除节点(nodeId 通过 docker node ls 查看)
docker node rm [nodeId]
9.离开的节点,再次加入swarm集群
在要加入集群的节点执行如下命令:
# 查看加入woker的命令
docker swarm join-token worker
# 再次执行刚才的,加入swarm集群命令即可
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377
附:join token其他常见命令:
docker swarm join-token worker:查看加入woker的命令。
docker swarm join-token manager:查看加入manager的命令
docker swarm join-token --rotate worker:重置woker的Token。
docker swarm join-token -q worker:仅打印Token。
10.退出 docker swarm 集群
# work 节点:
docker swarm leave
# manager节点:
docker swarm leave -f
本文结束,谢谢
相关文章:

4.docker容器编排(docker compose 与 docker swarm)
本文目录 1.容器编排2.Docker Compose1.Docker Compose 安装2.Docker Compose 示例1.使用 docker-compose 启动 nginx2.docker compose 常用命令3.校验 docker-compose.yml 是否有错误4.创建服务,启动容器5.弹性伸缩<扩缩容> 3.Docker Swarm1.Swarm 架构图2.S…...
Linux中配置sudo用户访问权限
一、如何在 Linux 中配置 sudo 的访问权限 1.1、添加一个Linux普通用户有 sudo 权限 [root@localhost ~]# useradd test // 创建一个普通用户为:test [root@localhost ~]# [root@localhost ~]# passwd test // 设置用户test密码为:test Changing password for user te…...

ASfP: 增强AOSP平台开发的利器——Android Studio for Platform
ASfP: 增强AOSP平台开发的利器——Android Studio for Platform Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目(AOSP)平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同,…...

【Html】用CSS定义咖啡 - 咖啡配料展示
显示效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>CodePen - For The Love Of Coffee</title><link rel"stylesheet" href"./style.css">&l…...

Learn Prompt-Prompt 高级技巧:AutoGPT
AutoGPT 是一个由Toran Richards创建的流行开源项目。它利用GPT4作为大脑,结合langchain的链接思想,连接各种工具和互联网资源,来完成人类给予的任务。您只需要设定一个目标,AutoGPT就会自主规划并逐步执行任务。如果遇到问题&…...

IntelliJ IDEA - Maven 在控制台Maven编译正常,但是在IDEA中不正常,表现不一致
文章目录 现象原因解决验证 现象 一个Maven项目,当导入到IDEA后,无法在IDEA中正常的编译和下载jar依赖,类似下面的截图。 但是在Windows控制台却可以正常编译,类似下面的截图。 CMD执行:mvn clean install -Dmaven.te…...
list 用法与模拟
list 用法 list list 模拟 #pragma once #include <assert.h> namespace sjy {//链表节点template <typename T>struct __list_node{__list_node(const T& val T()):_prev(nullptr),_next(nullptr),_val(val){}/*成员变量*/__list_node<T>* _prev;__…...

【操作系统笔记】进程和线程
进程的组成 进程要读取 ELF 文件,那么: ① 要知道文件系统的信息,fs_struct② 要知道打开的文件的信息,files_struct 一个进程除了需要读取 ELF 文件外,还可以读取其他的文件中的数据。 进程中肯定有一个 mm_struct…...
一短文读懂编译型与解释型编程语言
在编程世界中,我们经常听到编译型语言和解释型语言这两个术语。它们是什么,有什么区别呢?让我们一起来探讨一下。 编译型语言 编译型语言,如C、Java等,是一种需要先被编译成机器代码,然后才能被执行的语言…...

修炼离线:(三)sqoop插入hbase 报错权限问题
一:报错现象。 二:解决方式。 方法一:修改文件所有者。 切换hadoop用户:export HADOOP_USER_NAMEhdfs hadoop fs -chown -R root:root /方法二:修改权限 切换hadoop用户:export HADOOP_USER_NAMEhdfs ha…...

【JavaEE】多线程(四)
多线程(四) 在开始讲之前,我们先来回顾回顾前三篇所讲过的内容~ 线程的概念 并发编程,多进程,比较重,频繁创建销毁,开销大 Thread的使用 创建线程 继承Thread实现Runnable继承Threadÿ…...
第一章:最新版零基础学习 PYTHON 教程(第七节 - Python 中的语句、缩进和注释)
在这里,我们将讨论Python中的语句、Python中的缩进和Python中的注释。我们还将讨论 Python 语句、Python 缩进、Python 注释的不同规则和示例,以及“文档字符串”和“多行注释”之间的区别。 Python中的语句是什么 Python语句是Python 解释器可以执行的指令。Python 语言中…...
C++ 【2】
1.指针基础 字符:C 一个字符占一个字节 在C中 << 这个为插入运算符 >> 这个为提取运算符 一个变量的地址称为该变量的指针;如果在程序中定义了一个变量或者数组, 那么,这个变量或数组的地址(指针…...
Java学习笔记40——Lambda表达式
Lambda表达式 Lambda表达式函数式编程思想概述Lambda表达式的标准格式Lambda表达式练习练习1练习2练习3 Lambda表达式的省略模式Lambda表达式的注意事项Lambda表达式与接口的区别 Lambda表达式 函数式编程思想概述 面向对象思想强调“必须通过对象的形式做事” 在函数式思想中…...
【考研数学】线性代数第五章 —— 特征值和特征向量(3,矩阵对角化理论)
文章目录 引言三、矩阵对角化理论3.1 一般矩阵的相似对角化3.2 实对称矩阵的相似对角化3.2.1 实对称矩阵相似对角化定理3.2.2 实对称矩阵相似对角化过程 写在最后 引言 承接前文,我们来看看矩阵的对角化理论。 我们前面提到对角化是在矩阵相似那里,若存…...

【计算机网络】IP数据报首部格式、最大传输单元MTU、最大分段大小MSS
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 更多计算机网络知识专栏:计算机网络🔥 给大家跳段…...
shell脚本之文件读写
shell脚本之文件读写 1、读取文件内容并打印2、将内容写入文件3、追加内容到文件末尾4、读取文件内容到变量中5、逐行读取文件内容并处理6、逐行追加内容到文件末尾7、获取文件行数8、获取文件最后一个单词 Shell 脚本读写文件的方法有很多种,下面是一些常见的方法&…...

SAP 刷新Fiori Apps缓存的方法(解决修改CDS后Fiori无法重载新配置)
1. 问题 修改CDS Annotation后,基于Fiori Element发布的Fiori App无法应用新的界面 2. 解决办法 2319491 - How to clean up the cache after applying changes that affect SAP Fiori apps刷新Frontend: SE38: /UI5/APP_INDEX_CALCULATE…...

如何在 Excel 中计算日期之间的天数
计算两个日期之间的天数是 Excel中的常见操作。无论您是规划项目时间表、跟踪时间还是分析一段时间内的趋势,了解如何在 Excel 中查找日期之间的天数都可以提供强大的日期计算功能。 幸运的是,Excel 提供了多种简单的方法来获取两个日期之间的天数。继续…...

Java高级-注解
注解 1.介绍2.元注解3.注解的解析4.注解的应用场景 1.介绍 注解 Annotation 就是Java代码里的特殊标记,作用是让其他程序根据注解信息来决定什么是执行该程序注解:注解可以在类上、构造器上、方法上、成员变量上、参数上等位置 自定义注解 /*** 自定…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...