当前位置: 首页 > news >正文

Docker 常用命令基础详解(二)

四、容器操作命令

4.1 运行容器

使用docker run命令可以创建并运行一个容器,它就像是一个神奇的 “启动器”,让镜像中的应用程序在容器中运行起来。其基本语法为:

 

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其中,OPTIONS是可选参数,IMAGE是要使用的镜像名称,COMMAND是在容器启动时要执行的命令,ARG...是命令的参数。常见的参数有:

  • -d:以守护进程(后台)模式运行容器,容器启动后会在后台运行,不会占用当前终端。就像你启动了一个后台服务,它在后台默默地运行,不会干扰你在终端进行其他操作。
  • -it:以交互模式运行容器,通常与-t一起使用。-i表示保持标准输入流打开,-t表示为容器分配一个伪终端,这样我们就可以在容器内进行交互式操作,就像直接在容器内部的终端中操作一样。
  • -p:指定端口映射,格式为宿主机端口:容器端口。例如,-p 8080:80表示将容器的 80 端口映射到宿主机的 8080 端口,这样我们就可以通过访问宿主机的 8080 端口来访问容器内的应用程序。这就好比你在一个大房子里(宿主机),为一个小房间(容器)开了一扇特殊的门(端口映射),通过这扇门可以直接进入小房间。
  • -v:指定卷挂载,格式为宿主机路径:容器路径。通过卷挂载,我们可以将宿主机的目录或文件挂载到容器内,实现数据的共享和持久化。比如,-v /data:/app/data表示将宿主机的/data目录挂载到容器的/app/data目录,这样在容器内对/app/data目录的操作就会同步到宿主机的/data目录。这就像是在两个房间之间打通了一条通道,两边的物品可以互相流通。
  • --name:为容器指定一个名称,方便我们识别和管理容器。如果不指定名称,Docker 会自动生成一个随机的名称。指定一个有意义的名称就像给一个人取了一个容易记住的名字,方便我们在众多容器中找到它。

例如,要以交互模式运行一个基于 ubuntu 镜像的容器,并在容器内执行bash命令,进入容器的交互式终端,可以执行:

 

docker run -it ubuntu bash

如果要以后台模式运行一个 nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口,可以执行:

 

docker run -d -p 8080:80 nginx

4.2 列出容器

查看正在运行的容器,我们使用docker ps命令,它就像是一个 “容器清单查看器”,将正在运行的容器信息展示出来。其基本语法为:

 

docker ps [OPTIONS]

其中,OPTIONS是可选参数。常见的参数有:

  • -a:显示所有容器,包括未运行的容器。默认情况下,docker ps只显示正在运行的容器,使用-a参数可以查看所有容器的历史记录,就像查看一个班级所有学生的出勤记录,包括请假(未运行)的学生。
  • -q:仅显示容器的 ID,简洁明了,适合在需要快速获取容器 ID 的场景中使用,比如在批量操作容器时。
  • -n=INTEGER:显示最近创建的INTEGER个容器,例如docker ps -n 5会显示最近创建的 5 个容器,方便我们查看最新创建的容器情况。
  • -f:根据指定条件过滤结果。例如,docker ps -f "status=exited"可以筛选出状态为已退出的容器,就像在一个大仓库里筛选出特定状态的货物。

执行docker ps命令后,会看到一个类似如下的表格:

 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7d9e6c8d8d8c nginx:latest "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp mynginx

表格中的各列含义如下:

  • CONTAINER ID:容器的唯一标识,类似于人的身份证号码,通过它可以准确地识别和操作容器。
  • IMAGE:容器使用的镜像名称,表明这个容器是基于哪个镜像创建的。
  • COMMAND:容器启动时运行的命令,让我们了解容器启动后执行的具体操作。
  • CREATED:容器的创建时间,记录了容器是什么时候被创建的。
  • STATUS:容器的状态,常见的状态有running(运行中)、exited(已退出)、paused(暂停)等。
  • PORTS:容器的端口映射信息,显示了容器内部端口与宿主机端口的映射关系。
  • NAMES:容器的名称,如果在创建容器时指定了名称,这里就会显示指定的名称;否则,会显示一个自动生成的名称。

4.3 启动、停止与重启容器

  • 启动容器:对于已经停止的容器,我们可以使用docker start命令来启动它,就像重新启动一台暂停的机器。其基本语法为:
 

docker start [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS是可选参数,CONTAINER是要启动的容器的 ID 或名称,可以同时指定多个容器。例如,要启动名为mynginx的容器,可以执行:

 

docker start mynginx

  • 停止容器:使用docker stop命令可以停止正在运行的容器,它会向容器发送一个SIGTERM信号,允许容器优雅地停止。如果容器在一段时间内没有停止,它会接收到一个SIGKILL信号强制停止。其基本语法为:
 

docker stop [OPTIONS] CONTAINER [CONTAINER...]

同样,OPTIONS是可选参数,CONTAINER是要停止的容器的 ID 或名称。例如,要停止 ID 为7d9e6c8d8d8c的容器,可以执行:

 

docker stop 7d9e6c8d8d8c

我们还可以在停止时指定一个等待时间,单位是秒,默认是 10 秒。例如,docker stop -t 20 7d9e6c8d8d8c表示等待 20 秒让容器停止,如果 20 秒后容器仍未停止,才会发送SIGKILL信号强制停止。

  • 重启容器:docker restart命令会先停止容器,然后立即重新启动它,就像给一台电脑进行重启操作。其基本语法为:
 

docker restart [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS是可选参数,CONTAINER是要重启的容器的 ID 或名称。例如,要重启名为mynginx的容器,可以执行:

 

docker restart mynginx

也可以指定重启的等待时间,使用-t选项来指定停止容器时的超时时间。例如,docker restart -t 20 mynginx表示在重启mynginx容器时,先停止容器并等待 20 秒,如果 20 秒内容器停止了,就立即重新启动;如果 20 秒后容器仍未停止,才会强制停止并重新启动。

4.4 进入容器

当我们需要在容器内部执行一些操作,如查看文件、调试程序等,就需要进入正在运行的容器。常用的有docker exec和docker attach命令。

  • 使用docker exec命令:这是最常用的进入容器并执行命令的方式,它允许我们在运行中的容器内执行一个新的命令,就像在一个正在运行的房间里(容器)执行新的任务。其基本语法为:
 

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

其中,OPTIONS是可选参数,CONTAINER是容器的 ID 或名称,COMMAND是要在容器内执行的命令,ARG...是命令的参数。常见的参数有:

  • -it:以交互模式运行命令,为容器重新分配一个伪输入终端,这样我们就可以在容器内进行交互式操作,就像直接在容器内部的终端中操作一样。例如,要进入名为mynginx的容器的交互式Bash shell,可以执行:
 

docker exec -it mynginx /bin/bash

如果容器中没有Bash,可以尝试/bin/sh。我们还可以在容器内直接执行命令(不进入shell)。例如,查看容器内的/var/log目录内容,可以执行:

 

docker exec mynginx ls /var/log

  • 使用docker attach命令:这个命令用于连接到一个正在运行的容器的主进程(通常是容器启动时运行的进程),就像直接连接到一个正在运行的机器的核心部分。但要注意,这种方式并不像docker exec那样启动一个新的shell,而是附加到容器的主进程,通常用于查看容器的输出日志。其示例如下:
 

docker attach mynginx

如果你使用docker attach并尝试退出,可能会终止容器的主进程。因此,如果只是想查看输出而不关闭容器,请谨慎使用。例如,当你使用docker attach进入容器后,按下Ctrl + C可能会直接停止容器的主进程,导致容器停止运行。

4.5 删除容器

当我们不再需要某个容器时,可以使用docker rm命令将其删除,它就像是一个 “容器清理器”,帮助我们释放资源,保持系统整洁。其基本语法为:

 

docker rm [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS是可选参数,CONTAINER是要删除的容器的 ID 或名称,可以同时指定多个容器。常见的参数有:

  • -f:强制删除容器,即使该容器正在运行。当容器正在运行时,如果直接使用docker rm命令删除会报错,因为容器正在使用中。使用-f参数可以强制删除,但要注意,强制删除可能会导致数据丢失或其他未预期的问题,就像在一个人正在使用某个工具时强行夺走这个工具,可能会影响工作进度或造成工具损坏。例如,要强制删除名为mynginx的正在运行的容器,可以执行:
 

docker rm -f mynginx

  • -l:移除容器间的网络连接,而非容器本身。有时候我们只是想断开容器之间的网络连接,而不是删除容器,这时就可以使用这个参数。
  • -v:删除与容器关联的卷。如果容器在运行时挂载了卷,使用这个参数可以在删除容器时同时删除这些卷,避免残留无用的卷占用空间。

要删除一个已经停止的容器,例如名为mycontainer的容器,可以执行:

 

docker rm mycontainer

如果要删除所有停止的容器,可以使用以下命令:

 

docker container prune

这个命令会清理所有已停止的容器,并且在执行前会要求用户确认。若要自动确认,可以添加-f或--force参数:

 

docker container prune -f

如果想要一次性删除所有容器(无论是否运行),可以使用以下命令:

 

docker rm -f $(docker ps -aq)

这条命令首先通过docker ps -aq获取所有容器(包括运行中的)的 ID 列表,然后传递给docker rm -f命令进行强制删除。在执行删除所有容器的命令时要特别小心,确保确实不再需要这些容器,以免误删重要的容器和数据。

4.6 查看容器日志

使用docker logs命令可以查看容器的运行日志,这些日志就像是容器运行的 “日记”,记录了容器运行过程中的各种信息,对于调试和排查问题非常有帮助。其基本语法为:

 

docker logs [OPTIONS] CONTAINER

其中,OPTIONS是可选参数,CONTAINER是要查看日志的容器的 ID 或名称。常见的参数有:

  • -f:实时跟踪日志输出,就像实时观看一场比赛的直播,随时了解最新的动态。使用这个参数后,命令会持续输出容器的最新日志,方便我们实时监控容器的运行状态。例如,要实时跟踪名为mynginx的容器的日志输出,可以执行:
 

docker logs -f mynginx

  • --tail:指定输出日志的行数,例如--tail 10表示只输出最后 10 行日志,让我们可以快速查看最近的日志信息。这就像在一本厚厚的日记中,只查看最后几页的内容。
  • --since:指定开始查看日志的时间,格式为YYYY - MM - DD HH:MM:SS,例如--since "2024-11-20 10:00:00"表示从 2024 年 11 月 20 日 10 点开始查看日志,帮助我们精准定位某个时间段内的日志。
  • --until:指定结束查看日志的时间,格式与--since相同,例如--until "2024-11-20 12:00:00"表示查看日志到 2024 年 11 月 20 日 12 点结束。

例如,要查看名为mynginx的容器的最后 50 行日志,可以执行:

 

docker logs --tail 50 mynginx

如果要查看从 2024 年 11 月 20 日 10 点到 12 点之间的日志,可以执行:

 

docker logs --since "2024-11-20 10:00:00" --until "2024-11-20 12:00:00" mynginx

五、数据卷与网络命令

5.1 数据卷管理

在 Docker 的世界里,数据卷就像是一个坚固的 “数据保险箱”,为容器的数据提供了持久化存储和共享的能力。它打破了容器生命周期的限制,即使容器被删除,数据卷中的数据依然得以保留。这就好比你有一个特别的文件柜,无论你的办公室(容器)如何变化,文件柜里的文件(数据)都安全无损。

创建数据卷

使用docker volume create命令可以创建一个新的数据卷,其基本语法为:

 

docker volume create [OPTIONS] VOLUME

其中,OPTIONS是可选参数,VOLUME是数据卷的名称。例如,要创建一个名为myvolume的数据卷,可以执行:

 

docker volume create myvolume

创建成功后,Docker 会在宿主机的默认数据卷存储目录(通常是/var/lib/docker/volumes/)下创建一个以数据卷名称命名的目录,用于存储数据卷的数据。

查看数据卷

查看所有数据卷,我们使用docker volume ls命令,它会列出所有已创建的数据卷及其相关信息,就像一个 “数据卷清单”。执行该命令后,会看到类似如下的输出:

 

DRIVER VOLUME NAME

local myvolume

如果想查看某个具体数据卷的详细信息,比如myvolume的数据卷,可以使用docker volume inspect命令,其语法为:

 

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

执行docker volume inspect myvolume后,会得到一个详细的 JSON 格式的输出,包含数据卷的名称、驱动、挂载点等信息。例如:

 

[

{

"CreatedAt": "2024-11-20T10:00:00Z",

"Driver": "local",

"Labels": {},

"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",

"Name": "myvolume",

"Options": {},

"Scope": "local"

}

]

从输出中可以看到,Mountpoint字段显示了数据卷在宿主机上的实际挂载路径,通过这个路径,我们可以直接在宿主机上访问和管理数据卷中的数据。

删除数据卷

当我们不再需要某个数据卷时,可以使用docker volume rm命令将其删除,其基本语法为:

 

docker volume rm [OPTIONS] VOLUME [VOLUME...]

例如,要删除名为myvolume的数据卷,可以执行:

 

docker volume rm myvolume

需要注意的是,在删除数据卷之前,必须确保该数据卷没有被任何容器挂载使用,否则删除操作会失败。如果数据卷正在被容器使用,你需要先停止相关容器,或者使用docker run --rm命令启动一个临时容器,将数据卷从临时容器中卸载后再进行删除。此外,还可以使用docker volume prune命令删除所有未使用的数据卷,以释放磁盘空间。执行该命令时,会提示确认是否删除,输入y即可确认删除。这就像是清理仓库里长期不用的货物,释放宝贵的空间。

5.2 网络管理

在 Docker 的网络世界中,容器之间的通信以及与外部世界的交互都依赖于精心构建的网络架构。通过一系列强大的网络管理命令,我们可以像搭建一座复杂的通信桥梁一样,灵活地创建、配置和管理 Docker 网络,让容器之间能够顺畅地 “交流”。

创建网络

使用docker network create命令可以创建一个自定义的 Docker 网络,其基本语法为:

 

docker network create [OPTIONS] NETWORK

其中,OPTIONS是可选参数,NETWORK是网络的名称。常见的参数有:

  • --driver:指定网络驱动类型,常用的驱动有bridge(桥接网络,适用于单个主机上的容器通信)、overlay(覆盖网络,适用于跨多个 Docker 主机的容器通信,常用于 Swarm 集群)等。
  • --subnet:指定自定义子网,用于为容器分配 IP 地址。
  • --gateway:为网络指定网关。

例如,要创建一个名为mybridge的桥接网络,可以执行:

 

docker network create --driver bridge mybridge

如果要创建一个自定义子网和网关的桥接网络,可以执行:

 

docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 mybridge

创建好网络后,就可以将容器连接到这个网络中,实现容器之间的通信。

查看网络

查看所有 Docker 网络,我们使用docker network ls命令,它会列出所有已创建的网络及其相关信息,就像一个 “网络清单查看器”。执行该命令后,会看到类似如下的输出:

 

NETWORK ID NAME DRIVER SCOPE

1234567890ab mybridge bridge local

abcdef012345 bridge bridge local

从输出中可以看到每个网络的 ID、名称、驱动类型和作用范围。如果想查看某个具体网络的详细信息,比如mybridge网络,可以使用docker network inspect命令,其语法为:

 

docker network inspect [OPTIONS] NETWORK [NETWORK...]

执行docker network inspect mybridge后,会得到一个详细的 JSON 格式的输出,包含网络的 ID、名称、驱动、子网配置、连接的容器等信息。例如:

 

[

{

"Name": "mybridge",

"Id": "1234567890ab",

"Created": "2024-11-20T10:00:00Z",

"Scope": "local",

"Driver": "bridge",

"EnableIPv6": false,

"IPAM": {

"Driver": "default",

"Options": {},

"Config": [

{

"Subnet": "172.18.0.0/16",

"Gateway": "172.18.0.1"

}

]

},

"Internal": false,

"Attachable": false,

"Ingress": false,

"ConfigFrom": {

"Network": ""

},

"ConfigOnly": false,

"Containers": {},

"Options": {},

"Labels": {}

}

]

通过查看这些详细信息,我们可以了解网络的配置情况,以及哪些容器连接到了这个网络。

连接与断开网络

将容器连接到指定网络,我们使用docker network connect命令,其基本语法为:

 

docker network connect [OPTIONS] NETWORK CONTAINER

其中,NETWORK是网络的名称或 ID,CONTAINER是容器的名称或 ID。例如,要将名为mycontainer的容器连接到mybridge网络,可以执行:

 

docker network connect mybridge mycontainer

连接成功后,容器就可以与该网络中的其他容器进行通信了。

如果要将容器从网络中断开,使用docker network disconnect命令,其基本语法为:

 

docker network disconnect [OPTIONS] NETWORK CONTAINER

例如,要将mycontainer容器从mybridge网络中断开,可以执行:

 

docker network disconnect mybridge mycontainer

断开连接后,容器将无法再与该网络中的其他容器进行通信。需要注意的是,对于一些特殊的网络类型(如host网络),容器一旦连接到该网络,就不能断开连接。

六、综合实战与总结

6.1 实战案例

为了更直观地展示 Docker 常用命令的实际应用,我们以部署一个基于 Flask 框架的简单 Web 应用为例。假设我们已经开发好了一个 Flask 应用,代码如下:

 

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello_world():

return 'Hello, Docker!'

if __name__ == '__main__':

app.run(host='0.0.0.0', port=5000)

将上述代码保存为app.py,并在同一目录下创建一个requirements.txt文件,用于记录项目的依赖:

 

Flask

接下来,我们使用 Docker 来部署这个 Web 应用。

步骤一:创建 Dockerfile

在项目目录下创建一个名为Dockerfile的文件,内容如下:

 

# 使用Python官方镜像作为基础镜像

FROM python:3.9-slim

# 设置工作目录

WORKDIR /app

# 将项目依赖文件复制到容器内

COPY requirements.txt.

# 安装项目依赖

RUN pip install -r requirements.txt

# 将项目代码复制到容器内

COPY.

# 暴露容器的5000端口

EXPOSE 5000

# 定义容器启动时执行的命令

CMD ["python", "app.py"]

步骤二:构建镜像

在项目目录下打开终端,执行以下命令构建 Docker 镜像:

 

docker build -t flask - app.

这里的-t参数用于指定镜像的标签,flask - app是我们给镜像取的名字,最后的.表示当前目录,即 Dockerfile 所在的目录。构建过程中,Docker 会根据 Dockerfile 中的指令逐步构建镜像,你会看到一系列的输出信息,显示构建的进度和状态。

步骤三:运行容器

镜像构建完成后,我们可以使用以下命令运行容器:

 

docker run -d -p 8080:5000 flask - app

-d参数表示在后台运行容器,-p参数用于端口映射,将宿主机的 8080 端口映射到容器的 5000 端口,这样我们就可以通过访问宿主机的 8080 端口来访问容器内运行的 Flask 应用。flask - app是我们刚刚构建的镜像名称。

步骤四:访问应用

打开浏览器,输入http://localhost:8080,你应该能够看到Hello, Docker!的页面,这表明我们的 Web 应用已经成功部署并运行在 Docker 容器中。

步骤五:查看容器日志

如果应用出现问题,我们可以使用docker logs命令查看容器的日志,以排查问题:

 

docker logs <容器ID或容器名>

将<容器ID或容器名>替换为实际的容器 ID 或你在运行容器时指定的名称,就可以查看容器的运行日志,从中找到可能存在的错误信息。

步骤六:停止和删除容器

当我们不再需要这个容器时,可以使用以下命令停止和删除它:

 

# 停止容器

docker stop <容器ID或容器名>

# 删除容器

docker rm <容器ID或容器名>

6.2 总结与展望

通过以上对 Docker 常用命令的详细介绍和实战案例,我们可以看到 Docker 在简化应用部署、提高开发效率和保障环境一致性方面具有巨大的优势。掌握这些常用命令,如镜像操作命令、容器操作命令、数据卷与网络命令等,是熟练使用 Docker 的基础。

希望大家能够深入学习和实践 Docker 技术,不断探索其更多的功能和应用场景。在未来,随着云计算、边缘计算等技术的不断发展,Docker 作为容器化技术的代表,将在软件开发、部署和运维领域发挥更加重要的作用。它将助力企业实现更加高效、灵活和可扩展的应用架构,推动数字化转型的进程。让我们一起拥抱 Docker,开启更加精彩的技术之旅!

相关文章:

Docker 常用命令基础详解(二)

四、容器操作命令 4.1 运行容器 使用docker run命令可以创建并运行一个容器&#xff0c;它就像是一个神奇的 “启动器”&#xff0c;让镜像中的应用程序在容器中运行起来。其基本语法为&#xff1a; docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 其中&#xff0c;OPTIONS…...

初学java 数据库相关学习

创建数据库&#xff1a; 主键: unsigned primary key auto_increment 外键: foreign key(xx) references table_name(xx) 字段: 类型: int ; tinyint ;char(20);varchar(255); date; datetime; text; float(5,2); double(10,2); long; decimal(15,10) 约束:primary key; foreig…...

ARM64 Trust Firmware [一]

ARMv8 启动流程&#xff1a; 在《RK3568上电启动流程 [十五]》中&#xff0c;简单介绍了 RK3568 的上电启动过程&#xff0c;本篇再详细分解其启动流程。 在 ARMv8 架构中&#xff0c;启动流程包含多个阶段&#xff0c;这些阶段被称为 BL &#xff08;bootloader&#xff09; …...

K8S容器启动提示:0/2 nodes are available: 2 Insufficient cpu.

问题&#xff1a;K8S的容器启动报错0/2 nodes are available: 2 Insufficient cpu. 原因&#xff1a;Pod的资源请求&#xff08;requests&#xff09;设置不当&#xff1a;在Kubernetes中&#xff0c;调度器根据Pod的requests字段来决定哪个节点可以运行该Pod。如果一个Pod声明…...

数据结构:图论入门

图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...

DataBase【MySQL基础夯实使用说明(下)】

MySQL数据库 &#x1f3c6;当领导表示关心时&#xff0c;您怎么回复&#xff1f; ⚠️不要傻傻的说应该的&#xff0c;这样不仅会抹杀掉你的辛苦&#xff0c;也让领导没办法接话&#xff01; &#x1f514;文章末尾彩蛋&#xff01; 文章目录 MySQL数据库前言一、约束1.1.外键…...

Golang的多团队协作编程模式与实践经验

Golang的多团队协作编程模式与实践经验 一、多团队协作编程模式概述 在软件开发领域&#xff0c;多团队协作编程是一种常见的工作模式。特别是对于大型项目来说&#xff0c;不同团队间需要协同合作&#xff0c;共同完成复杂的任务。Golang作为一种高效、并发性强的编程语言&…...

详解spotbugs -textui常用命令(包括生成html测试报告)

用命令运行spotbugs 本文默认大家了解spotbugs的基础使用&#xff0c;如果不了解可以参考文章 使用神器Spotbugs&#xff0c;轻松入门静态代码分析-CSDN博客 我们在使用spotbugs 对Java代码进行静态分析&#xff0c;查找相关的漏洞时通常在使用Maven和Gradle进行构建的过程中…...

C++:Map和Set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 A.set的模板参数列表 B.set的构造 C.set的迭代器 D.set的容量 E.set的修改操作 F.set的使用举例 A.map的模板参数列表 B.map的构造 C.map的迭代器 D.map的容量 E.map中元素的修改 operator[ ] insert()…...

【Unity Shader编程】之顶点着色器

来一张AI提供的资料 在shader编程中&#xff0c;定义的结构体&#xff0c;有些是会被自动赋值&#xff0c;有些是必须要手动赋值的&#xff0c;这就涉及到了语义&#xff0c; 例如 struct appdata{float4 vertex : POSITION;float vertex2;float2 uv : TEXCOORD0;};结构体里面定…...

Hive之[Hive]详细安装步骤

hive 是依赖hadoop中的hdfs作为存储&#xff0c;依赖mysql管理元数据 master节点 集群环境 master 192.168.204.130 slave1 192.168.204.131 slave2 192.168.204.132组件下载地址 https://archive.apache.org/dist/hive/hive-1.2.2/ 或 链接: https://pan.baidu.com/s/1…...

3.【线性代数】——矩阵乘法和逆矩阵

三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…...

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…...

unity is running as administrator 管理员权限问题

每次打开工程弹出unity is running as administrator的窗口 unity版本2022.3.34f1&#xff0c;电脑系统是win 11系统解决方法一&#xff1a;解决方法二&#xff1a; unity版本2022.3.34f1&#xff0c;电脑系统是win 11系统 每次打开工程都会出现unity is running as administr…...

AI在电竞比分网中的主要应用场景

AI在电竞体育比分网的数据应用非常广泛&#xff0c;能够显著提升数据分析、预测、用户体验和商业价值。以下是AI在电竞比分网中的主要应用场景&#xff1a; 1. 实时数据采集与分析 比赛数据实时更新&#xff1a;AI通过自动化系统实时采集比赛数据&#xff08;如击杀数、经济差、…...

消息中间件:RabbitMQ镜像集群部署配置全流程

目录 1、特点 2、RabbitMQ的消息传递模式 2.1、简单模式&#xff08;Simple Mode&#xff09; 2.2、工作队列模式&#xff08;Work Queue Mode&#xff09; 2.3、发布/订阅模式&#xff08;Publish/Subscribe Mode&#xff09; 2.4、路由模式&#xff08;Routing Mode&am…...

TCP的拥塞控制

什么是TCP的拥塞控制&#xff1f;它的工作原理是什么&#xff1f;为什么需要拥塞控制&#xff1f; TCP拥塞控制简介 想象一下&#xff0c;你和一群朋友在一条狭窄的小路上跑步。如果每个人都拼命跑&#xff0c;小路很快就会变得拥挤不堪&#xff0c;大家互相碰撞&#xff0c;…...

Jenkins 配置 Git Repository 五

Jenkins 配置 Git Repository 五 这里包含了 Freestyle project 任务类型 和 Pipeline 任务类型 关于 Git 仓库的配置&#xff0c;如下 不同的任务类型&#xff0c;只是在不同的模块找到 配置 Git 仓库 找到 Git 仓库配置位置之后&#xff0c;所有的任务类型配置都是一样的 …...

父组件中循环子组件调用

父组件中循环子组件调用 父组件 //father.vue <template><view><view v-for"(item,index) in list"><son ref"son"></son></view><buton click"submit">123</buton></view> </templ…...

【网络安全.渗透测试】Cobalt strike(CS)工具使用说明

目录 前言 一、工具显著优势 二、安装 Java 运行环境 三、实验环境搭建要点 四、核心操作流程详解 (一)环境准备与连接步骤 (二)主机上线与深度渗透流程 五、其他实用功能应用指南 (一)office 宏 payload 应用 (二)Https Payload 应用 (三)信息收集策略 …...

C++ 设计模式-建造者模式

以下是一个完整的C建造者模式示例&#xff0c;包含产品类、建造者接口、具体建造者、指挥者以及测试代码&#xff1a; #include <iostream> #include <string> #include <memory>// 产品类&#xff1a;汽车 class Car { public:void setBody(const std::str…...

【Unity3D】Unable to detect SDK in the selected directory

某天突然发现SDK选中自己的目录 或 打安卓包时 提示SDK Tools相关的报错 打开Android Studio的SDK Manager更新Android SDK Tools...

QML使用ChartView绘制饼状图

一、工程配置 首先修改CMakeLists.txt&#xff0c;按下图修改&#xff1a; find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp&#xff0c;按下图修改&#xff…...

ollama本地部署 deepseek离线模型安装 一套从安装到UI运行

一、安装本地ollama 1、下载ollama (1)百度网盘windows版本 通过网盘分享的文件&#xff1a;OllamaSetup.exe 链接: https://pan.baidu.com/s/15ca6WAzrc4wWph5H9BEOzw 提取码: 283u (2)进入官网&#xff1a;Ollama 2、选择你的系统 等待下载完成就可以了。 注&#xff1a;这…...

【linux】ubunbu切换到root

在 Ubuntu 中切换到 root 用户有几种方法&#xff0c;具体取决于你的需求和权限配置。以下是常见的几种方式&#xff1a; 1. 使用 sudo 临时切换到 root 如果你当前用户有 sudo 权限&#xff0c;可以使用以下命令临时切换到 root 用户&#xff1a; bash sudo -i 或者&#xff1…...

推理框架对比:ReAct、思维链(COT)和思维树(TOT)谁更胜一筹

推理框架作为 AI 解决复杂问题的核心机制&#xff0c;正逐渐成为研究和应用的焦点。ReAct、思维链&#xff08;Chain-of-Thought&#xff0c;CoT&#xff09;&#xff08;Chain-of-Thought (CoT)&#xff1a;引导大型语言模型解决问题的有效策略&#xff09;和思维树&#xff0…...

electron.vite 项目创建以及better-sqlite3数据库使用

1.安装electron.vite npm create quick-start/electronlatest中文官网&#xff1a;https://cn.electron-vite.org/ 2. 安装项目依赖 npm i3.修改 electron-builder 配置文件 appId: com.electron.app productName: text33 directories:buildResources: build files:- !**/.v…...

Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案

1. RUN 和 CMD 之间有什么区别&#xff1f; RUN : 在镜像构建过程中执行命令&#xff0c;创建一个新的层。通常用于安装软件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器启动时默认运行的命令。它在运行时执行&#xff0c;而不是在构建过程…...

Sentinel——Spring Boot 应用接入 Sentinel 后内存开销增长计算方式

接入 Sentinel 对 Spring Boot 应用的内存消耗影响主要取决于 规则数量、资源数量、监控粒度、并发量 等因素。 1. 核心内存消耗来源 (1) Sentinel 核心库 默认依赖&#xff1a;Sentinel Core 本身占用较小&#xff0c;通常在 10~50MB&#xff08;取决于资源数量和规则复杂度…...

domain 网络安全 网络安全域

文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网&#xff0c;配置IP2.2、安装活动目录2.3、添加用户到指定域2.4、将PC加入域2.5、实验常见问题 3、OU&#xff08;组织单位…...

OpenCV机器学习(2)提升算法类cv::ml::Boost

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::Boost 是 OpenCV 机器学习模块中的一部分&#xff0c;用于实现提升算法&#xff08;Boosting Algorithms&#xff09;。Boosting 是一种…...

【Java 面试 八股文】框架篇

框架篇 1. Spring框架中的单例bean是线程安全的吗&#xff1f;2. 什么是AOP&#xff1f;3. 你们项目中有没有使用到AOP&#xff1f;4. Spring中的事务是如何实现的&#xff1f;5. Spring中事务失效的场景有哪些&#xff1f;6. Spring的bean的生命周期&#xff1f;7. Spring中的…...

基于HAL库的按钮实验

实验目的 掌握STM32 HAL库的GPIO输入配置方法。 实现通过按钮控制LED亮灭&#xff08;支持轮询和中断两种模式&#xff09;。 熟悉STM32CubeMX的外部中断&#xff08;EXTI&#xff09;配置流程。 实验硬件 开发板&#xff1a;STM32系列开发板&#xff08;如STM32F103C8T6、N…...

TCP 端口号为何位于首部前四个字节?协议设计的智慧与启示

知乎的一个问题很有意思&#xff1a;“为什么在TCP首部中要把TCP的端口号放入最开始的四个字节&#xff1f;” 这种问题很适合我这种搞历史的人&#xff0c;大年初一我给出了一个简短的解释&#xff0c;但仔细探究这个问题&#xff0c;我们将会获得 TCP/IP 被定义的过程。 文…...

前端实现在PDF上添加标注(1)

前段时间接到一个需求&#xff0c;用户希望网页上预览PDF&#xff0c;同时能在PDF上添加文字&#xff0c;划线&#xff0c;箭头和用矩形框选的标注&#xff0c;另外还需要对已有的标注进行修改&#xff0c;删除。 期初在互联网上一通搜索&#xff0c;对这个需求来讲发现了两个问…...

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …...

如何优化React应用的性能?

文章目录 1. 引言2. 渲染优化2.1 使用 React.memo 避免不必要的重新渲染2.2 使用 shouldComponentUpdate 或 PureComponent2.3 使用 useMemo 和 useCallback 3. 异步渲染与懒加载3.1 使用 React.lazy 和 Suspense 实现懒加载3.2 分割代码&#xff08;Code-Splitting&#xff09…...

ES的java操作

ES的java操作 一、添加依赖 在pom文件中添加依赖包 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elastic…...

八大排序——简单选择排序

目录 1.1基本操作&#xff1a; 1.2动态图&#xff1a; 1.3代码&#xff1a; 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作&#xff1a; 选择排序&#xff08;select sorting&#xff09;也…...

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…...

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…...

前端大屏适配方案:从设计到实现的全流程指南

引言 随着数据可视化需求的增长&#xff0c;大屏展示项目在前端开发中越来越常见。然而&#xff0c;大屏开发面临独特的挑战&#xff1a; 屏幕分辨率多样&#xff1a;从1080P到4K甚至8K&#xff0c;如何保证清晰度&#xff1f;布局复杂&#xff1a;多图表、多组件如何合理排列…...

10. Hbase Compaction命令

一. 什么是Compaction 在 HBase 中&#xff0c;频繁进行数据插入、更新和删除操作会生成许多小的 HFile&#xff0c;当 HFile 数量增多时&#xff0c;会影响HBase的读写性能。此外&#xff0c;垃圾数据的存在也会增加存储需求。因此&#xff0c;定期进行 Compact操作&#xff…...

完善sql盲注中的其他函数 dnslog+sqlmap外带数据

2. 布尔盲注 布尔盲注是通过观察应用程序的响应&#xff08;如页面内容、HTTP 状态码等&#xff09;来判断查询条件是否为真。 <?php // 数据库连接配置 $host localhost; $dbname testdb; $user root; $password password; // 创建数据库连接 $conn new mysqli($ho…...

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…...

Java 有哪些锁,他们的区别是什么

Java 锁的分类 Java 中的锁可以从多个维度进行分类&#xff1a; 悲观锁 vs. 乐观锁公平锁 vs. 非公平锁独占锁 (互斥锁) vs. 共享锁 (读写锁)可重入锁 vs. 不可重入锁自旋锁偏向锁 vs. 轻量级锁 vs. 重量级锁 (JVM 锁优化) 1. synchronized 关键字&#xff1a; 类型: 悲观锁…...

CSS实现单行、多行文本溢出显示省略号(…)

在网页设计中&#xff0c;我们常常遇到这样的情况&#xff1a;文本内容太长&#xff0c;无法完全显示在一个固定的区域内。为了让界面看起来更整洁&#xff0c;我们可以使用省略号&#xff08;…&#xff09;来表示内容溢出。这不仅能提升用户体验&#xff0c;还能避免内容溢出…...

网络协议/MQTT Paho.MQTT客户端库接口基础知识

开源c版mqtt客户端:https://github.com/eclipse-paho/paho.mqtt.cMQTT 客户端与服务器之间支持的通信协议主要包括: 协议地址格式加密默认端口适用场景服务器地址示例TCPtcp://不加密1883局域网或对安全性要求不高的场景tcp://localhost:1883TLS/SSLssl://加密8883对安全性要…...

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…...

深入解析 Go 中的 `io.Pipe()`:实现高效的并发通信

在 Go 语言中&#xff0c;io.Pipe() 是一个强大且灵活的工具&#xff0c;用于在不同的 goroutine 之间实现高效的同步和通信。它通过创建一对连接的 I/O 流&#xff0c;允许数据在管道的两端安全地传递。本文将详细介绍 io.Pipe() 的工作原理、主要特点、使用方法以及一些实际应…...