docker入门(二)之容器命令及私有仓库的部署(本地和harbor)

news2024/11/26 11:47:22
  • 容器命令:

1.启动容器

接下来演示在docker下运行一个ubuntu系统,从中学习各容器命令。

--name="容器新名字" 为容器指定一个名称(不指定的话会随机分配一个名字)。

-d: 后台运行容器并返回容器ID,也就启动守护式容器(后台运行)

-i: 以交互模式运行容器,通常与-t同时使用

-t: 为容器重新分配一个伪输入终端,通常与-i同时使用。

也即启动交互式容器(前台有伪终端,等待交互)

-P: 随机端口映射,大写P

-p: 指定端口映射,小写p  注:一般用这个比较多

--restart=always: 指明docker整体重启后改容器也会重启

/bin/bash: 放在镜像后面是命令,这里希望有个交互式shell,因此使用/bin/bash

先拉取一个ubuntu系统镜像

docker pull ubuntu

启动容器时需要有终端进行交互,不然你会发现执行后啥都没有

这里启动一个Ubuntu的镜像

没有自定义名字启动容器

[root@localhost ~]# docker run -it ubuntu /bin/bash

自定义名字启动容器

[root@localhost ~]# docker run -it  --name myubuntu1 ubuntu /bin/bash

此时可以看到已经进入Ubuntu系统了

上述操作其他的几个参数都用到了,唯独守护进程没有用,为什仫呢?

首先我们先来了解一下什么是守护进程吧

Docker守护进程(Docker daemon)是Docker引擎的核心组件之一,它是一个在后台运行的持续运行的进程。它负责管理Docker容器的生命周期、镜像的构建和管理、网络的管理,以及与Docker客户端的通信等任务。

守护进程是在计算机操作系统中运行的一种特殊类型的进程。它通常在系统启动时启动,并一直运行着,负责处理系统级别的任务和服务。与普通进程不同,守护进程通常不与用户直接交互,而是在后台默默地执行它们的任务。

在Docker中,守护进程充当了Docker引擎的后台管理者。它监听Docker客户端发出的命令和请求,负责启动、停止、管理容器,管理镜像的构建和存储,创建和管理网络等。守护进程还负责监控容器的状态,并根据需要进行自动调整和管理。

通过与Docker客户端的通信,用户可以使用命令行工具或API与Docker守护进程进行交互,从而创建、管理和部署容器化应用程序。

总结来说,Docker守护进程是Docker引擎的核心组件,它在后台运行并负责管理和执行Docker容器的操作。守护进程作为一种特殊类型的后台进程,处理系统级别的任务和服务,与用户不直接交互。

所以我们大致应该能明白守护进程是给需要在后台默默执行的程序。如redis,如果不添加守护进程,ctrl+c,前台进程结束,容器就停止了,显然不能接受。

通过下图可以看到redis开始在正常运行在前台,假如说我要执行其他程序,然后我ctrl+c退出了一下,redis就自动退出了

查看容器的状态,发现也是退出了

但是添加-d后,它会直接在后台运行,不会在前台占用资源

注意:对于一些需要在前台进行的操作的容器,不能随意使用-d,如centos,unbuntu系统这种,需要在终端显现出来进行操作。

2.查看容器状态

格式:docker ps -参数

这里不一一列举了,我认为学习的本质是思维的提升,死记硬背是不倡导的,记不住很正常,重要的是知道如何查询。

常用的参数

-a:查看所有容器

-n:指定一个数字,然后查询指定数字最近启动过的容器

更多参数见 docker ps –help

3.退出容器:

方法一:exit退出

方法二:ctrl+p+q退出

退出容器后相应的进程随之关闭。

4.启动已停止运行的容器

  1. 启动容器:

docker start 容器id或容器名

  1. 重启容器:

docker restart 容器id或容器名

  1. 停止容器:

docker stop 容器id或容器名

  1. 强制停止容器:

docker kill 容器id或容器名

  1. 删除已停止的容器:

容器需要先停止才能删除

docker rm 容器id/容器名

docker rm -f 容器id (强制删除)

注: rmi删的是镜像;rm删的是容器。

  1. 查看容器日志:

docker logs 容器id/容器名

注:docker run之后容器没有成功启动可通过“docker logs 容器id”查看失败日志。

  1. 查看容器内运行的进程:

docker top 容器id/容器名

  1. 查看容器内部结构:
    更细致地查看容器的情况,后续会用到

docker inspect 容器id

5.进入正在运行的容器

有两种方法:

exec交互式进入:
docker exec -it 容器id /bin/bash

exec是在容器中打开一个新的终端,启动了新的进程。用exit退出不会导致容器的停止。下次使用时重新进入即可不需要再启动,这种较方便。

attach方式进入:
docker attach 容器id

attach直接进入容器启动命令的终端,不会启动新的进程。显然此时用exit退出的话会导致容器停止。

  1. 6.从容器内拷贝文件到主机

备份真的很重要!!!

格式:
docker cp 容器id:容器内路径 目的主机路径

模拟一下备份的操作:

进入ubunbu容器,创建一个需要备份的文件

[root@localhost ~]# docker exec -it myubuntu1 /bin/bash

root@7ee020b6f11f:/# mkdir /tmp/backup

root@7ee020b6f11f:/# echo "backup" >/tmp/backup/1.txt

root@7ee020b6f11f:/# cat /tmp/backup/1.txt

backup

回到主机进行备份操作

root@7ee020b6f11f:/# exit

exit

[root@localhost ~]# mkdir /备份

[root@localhost ~]# docker cp 7ee020b6f11f:/tmp/backup/1.txt /备份

                                               Successfully copied 2.05kB to /备份

[root@localhost ~]# ls /备份

1.txt

[root@localhost ~]# cat /备份/1.txt

backup

导入和导出容器:

这是对整个容器进行备份

格式:

备份(导出)到本地:
docker export 容器id > 文件名.tar

导入容器:

cat 文件名.tar | docker import 镜像用户/镜像名:镜像版本号

假设备份的这个容器不小心删除了,进行恢复操作

对容器进行备份

对容器进行删除

对容器进行恢复:

  1. 7.基于容器制作镜像 —— docker commit。

通过docker commit可以提交容器副本使其称为一个新的镜像;就是说对一个具体的容器采用类似“反射”的方式生成模板镜像。

格式:docker commit -m="描述信息" -a="作者" 容器id 要创建的目标镜像名:[TAG]

选择刚才进行恢复操作的容器,对其再进行反向生成镜像ubuntu2

我们知道官网默认的ubuntu是个极简的版本,简略到vim都是没有的。

所以接下来我们进入容器对其进行安装vim编辑器

#先更新管理工具

apt-get update

#安装vim

apt-get -y install vim

然后进去随便编辑一个文件,测试是否安装成功了

8.docker容器数据卷

定义:将容器内的数据保存进宿主机磁盘,以实现容器内数据持久化存储或共享

卷就是目录或文件,可以存在一个或多个容器中,做数据卷的意义就在于让数据持久化,它可以完全独立于容器的生命周期,简而言之即使容器被删除,它也依旧存在。

数据卷的特点:

数据卷可在容器之间共享或重用数据

卷中的更改实时生效

数据卷中的更改不会包含在镜像的更新中

数据卷的生命周期一直持续到没有容器使用它为止

格式:docker run -it --privileged=true -v /宿主机绝对路径:/容器内目录 镜像名

注:该指令会默认创建宿主机、容器中不存在的路径

给宿主机与容器之间添加容器卷映射

[root@localhost ~]# docker run -it --privileged=true -v /tmp/ubuntu_data:/tmp/docker_data --name=ubuntu1 b1e9cef3f297

root@93327d8fc361:/# ls /tmp

docker_data

root@93327d8fc361:/# exit

exit

[root@localhost ~]# ls /tmp

systemd-private-c8c86f15dbdc47488d4c4652a466b7e2-chronyd.service-TzIZ9w  ubuntu_data  vmware-root_708-299893653

也可以通过查看容器内部结构,查看绑定情况(docker inspect):

[root@localhost ~]# docker inspect 93327d8fc361 #容器id

容器停止后在宿主机路径下的修改在容器重新启动后也会存在

在本地映射的路径下编辑一个文本

[root@localhost ~]# vi /tmp/ubuntu_data/1.txt

你好,我是来测试的

~重新启动容器并进入

[root@localhost ~]# docker ps -a

CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                      PORTS     NAMES

93327d8fc361   b1e9cef3f297   "/bin/bash"   28 minutes ago   Exited (0) 27 minutes ago             ubuntu1

[root@localhost ~]# docker start 93327d8fc361

93327d8fc361

[root@localhost ~]# docker exec -it 93327d8fc361 /bin/bash

root@93327d8fc361:/# cat /tmp/docker_data/1.txt

你好,我是来测试的

卷的继承和共享:

接下来在创建ubuntu2的时候指定继承ubuntu1的容器数据卷。此时就可以实现容器ubuntu1、容器ubuntu2、宿主机三者之间的数据共享。

创建容器ubuntu2,创建的时候继承ubuntu1的容器卷,验证数据是否共享

注意:ubuntu2继承的是ubuntu1的卷规则,所以u1挂了丝毫不影响u2因为他们是两个完全不同的容器。

  • 私有仓库的部署

这里有两种私有仓库,一种是docker自带的本地私有仓库

另一种是harbor私有仓库。

1、私人建立本地Docker Registry

下载镜像docker registry至本地

docker pull registry

运行私有库registry

[root@localhost ~]# docker run -d -p 5000:5000 -v /tmp/myregistry/:/tmp/registry --privileged=true registry:latest

241b19cd8b20daeee01f1d92fc5140f2da87097fcc0005e601b1350af7c74c71

启动容器

进入docker配置文件

[root@localhost ~]# vi /etc/docker/daemon.json

添加一行数据:

"insecure-registries": ["192.168.143.160:5000"]

重启docker

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl restart docker

查询我们这个库看看有什么镜像(最初一般都啥也没有

[root@localhost ~]# curl http://192.168.143.160:5000/v2/_catalog

{"repositories":[]}

拉取一个redis的镜像,再给镜像打上标签

docker tag redis:latest 192.168.143.5000/redis:latest

推送到本地

[root@localhost ~]# docker push 192.168.143.160:5000/redis:latest

The push refers to repository [192.168.143.160:5000/redis]

32dc2b2f3fdb: Pushed

5f70bf18a086: Pushed

699126e5b0cf: Pushed

f4d5f0e4a5a3: Pushed

67c428dd15b2: Pushed

12968755fd7a: Pushed

ae5bfa089f9f: Pushed

8d853c8add5d: Pushed

latest: digest: sha256:08253b414e0a11ae685bc3eec7e978b85a4c706d2dad1cc1ace92fbe6830953d size: 1986

验证是否拉取到私有仓库

[root@localhost ~]# curl http://192.168.143.160:5000/v2/_catalog

{"repositories":["redis"]}

2.harbor私有仓库的部署

  • 虽然Docker官方提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。
  • Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务。
  • 它主要提供 Dcoker Registry 管理界面UI,可基于角色访问控制,镜像复制, AD/LDAP 集成,日志审核等功能,完全的支持中文。

安装docker-compose:

这里我采用的是离线安装的方式:

上传docker-compose到虚拟机

[root@localhost ~]# ls

anaconda-ks.cfg  backup.tar  docker-compose  my_hello  myhello_world.tar

对文件添加执行权限:

[root@localhost ~]# ll

总用量 120804

-rw-------. 1 root root     1257 9月  23 17:20 anaconda-ks.cfg

-rw-r--r--. 1 root root 80625664 10月 11 13:14 backup.tar

-rw-r--r--. 1 root root 17031320 10月 11 18:09 docker-compose

-rw-------. 1 root root    24577 9月  26 09:13 my_hello

-rw-------. 1 root root 26008064 9月  29 11:44 myhello_world.tar

[root@localhost ~]# chmod +x docker-compose

移动 docker-compose 程序文件到 /usr/bin 目录下

[root@localhost ~]# mv docker-compose /usr/bin

mv:是否覆盖"/usr/bin/docker-compose"? y

查看docker-compose 是否生效

[root@localhost ~]# docker-compose --version

docker-compose version 1.25.0, build 0a186604

安装 Harbor 私有镜像仓库

上传 harbor 离线镜像包

root@localhost ~]# ls

anaconda-ks.cfg  backup.tar  harbor-offline-installer-v2.4.3.tgz  my_hello  myhello_world.tar

解压

[root@localhost ~]# tar -zxvf harbor-offline-installer-v2.4.3.tgz

harbor/harbor.v2.4.3.tar.gz

harbor/prepare

harbor/LICENSE

harbor/install.sh

harbor/common.sh

harbor/harbor.yml.tmpl

进入该工作目录,导入harbor镜像文件

[root@localhost harbor]# cd

[root@localhost ~]# cd harbor

[root@localhost harbor]# ls

common.sh  harbor.v2.4.3.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare

[root@localhost harbor]# docker load -i harbor.v2.4.3.tar.gz

这里配置文件需要改名

采用备份的方式改名,既能起到改名的效果,还能备份

[root@localhost harbor]# ls

common.sh  harbor.v2.4.3.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare

[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml

[root@localhost harbor]# ls

common.sh  harbor.v2.4.3.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  LICENSE  prepare

修改配置文件:

[root@localhost harbor]# vi harbor.yml

# Configuration file of Harbor



# The IP address or hostname to access admin UI and registry service.

# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.

hostname: 192.168.143.160  #改为主机ip



# http related config

http:

  # port for http, default is 80. If https enabled, this port will redirect to https port

  port: 80



# https related config

https:
  # https port for harbor, default is 443    注释https方式访问因为他需要有效证书才能使用

  # port: 443                                注释https端口

  # The path of cert and key files for nginx
# The initial password of Harbor admin

# It only works in first time to install harbor

# Remember Change the admin password from UI after launching Harbor.

harbor_admin_password: 12345          #harbor登录密码

  # certificate: /your/certificate/path      注释证书文件

  # private_key: /your/private/key/path      注释证书密钥文件



# # Uncomment following will enable tls communication between all harbor components

# internal_tls:

#   # set enabled to true means internal tls is enabled

#   enabled: true

#   # put your cert and key files on dir

#   dir: /etc/harbor/tls/internal



# Uncomment external_url if you want to enable external proxy

# And when it enabled the hostname will no longer used

# external_url: https://reg.mydomain.com:8433

执行安装脚本

[root@localhost harbor]# ls

common.sh  harbor.v2.4.3.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  LICENSE  prepare

[root@localhost harbor]# ./install.sh

最后出现以下提示安装成功

✔ ----Harbor has been installed and started successfully.----

查看安装的容器

修改docker配置文件:

本机指定 Harbor 仓库地址,指定后可在本机进行镜像文件的上传与下载,其他主机需要使用 Harbor 私有仓库时,也需修改成内容

[root@localhost ~]# vi /etc/docker/daemon.json

   "insecure-registries": ["192.168.143.160"]  #没有只需要添加这一部分,有就在原来的基础上修改

重启docker和配置文件

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl restart docker

重启 Harbor 仓库(docker 重启后,Harbor 相关组件并不会自动重启,需要手动重启)

还需注意必须在harbor工作目录下重启,不然docker-compose找不到位置

先down掉:

[root@localhost ~]# cd harbor

[root@localhost harbor]# docker-compose down

Stopping harbor-log ... done

Removing nginx             ... done

Removing harbor-jobservice ... done

Removing harbor-core       ... done

Removing redis             ... done

Removing registryctl       ... done

Removing registry          ... done

Removing harbor-portal     ... done

Removing harbor-db         ... done

Removing harbor-log        ... done

Removing network harbor_harbor

再启动:

[root@localhost harbor]# docker-compose down

Stopping harbor-log ... done

Removing nginx             ... done

Removing harbor-jobservice ... done

Removing harbor-core       ... done

Removing redis             ... done

Removing registryctl       ... done

Removing registry          ... done

Removing harbor-portal     ... done

Removing harbor-db         ... done

Removing harbor-log        ... done

Removing network harbor_harbor

[root@localhost harbor]# docker-compose up -d

Creating network "harbor_harbor" with the default driver

Creating harbor-log ... done

Creating registry      ... done

Creating redis         ... done
Creating harbor-db     ... done

Creating harbor-portal ... done

Creating registryctl   ... done

Creating harbor-core   ... done

Creating harbor-jobservice ... done

Creating nginx             ... done

浏览器登录

用户名为admin,而密码为在harbor.yml设置的密码

测试上传镜像到私有仓库会不会同步显示

再新建一个项目

这里我已经新建的test1项目,这里主要在于演示

先要给镜像打上标签,才能上传

[root@localhost ~]# docker tag nginx:latest 192.168.143.160/test1/nginx:latest

登录到harbor上

[root@localhost ~]# docker login -u admin -p 12345 http://192.168.143.160

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store



Login Succeeded

这里如果出现登录不上解决办法:

去到系统里的docker服务文件

vi /usr/lib/systemd/system/docker.service

在13行中间添加--insecure-registry 192.168.143.160

13 ExecStart=/usr/bin/dockerd -H fd://  --insecure-registry 192.168.143.160  --containerd=/run/containerd/containerd.sock

然后重启配置文件和docker就能登录了

systemctl daemon-reload

systemctl restart docker

上传镜像

[root@localhost ~]# docker push 192.168.143.160/test1/nginx:latest

The push refers to repository [192.168.143.160/test1/nginx]

11de3d47036d: Pushed

16907864a2d0: Pushed

2bdf51597158: Pushed

0fc6bb94eec5: Pushed

eda13eb24d4c: Pushed

67796e30ff04: Pushed

8e2ab394fabf: Pushed

latest: digest: sha256:596c783ac62b9a43c60edb876fe807376cd5022a4e25e89b9a9ae06c374299d4 size: 1778

去浏览器查看是否同步创建

可以看到已经有了说明成功了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Golang】关于Go语言中的定时器原理与实战应用

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【计算机网络 - 基础问题】每日 3 题(三十八)

✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…

ROS2 “通信方式” 参数服务器

为什么加“通信方式”引号,因为我觉得他就不算通信,最多最多就是一个动态加载参数方式 所以ros通信方式就三种,topic service action 别犟,犟就是你对! 常用的 param参数方法如下: # declare_parameter…

基于Java的旅游网站管理系统—计算机毕业设计源码39235

摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对旅游网站等问题,对旅游网站进行…

项目计划书,项目经理日常文档,项目管理计划,项目总体实施计划,总体测试计划,总体运维计划,总体开发计划(word原件获取)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档: 工作安排任务书…

Shuffle Net系列详解 (4) Shuffle Net V2实践部分讲解 for pytorch版本

Shuffle Net 系列 实践部分1.文件划分2.Block(差异文件)3.Network(差异文件)3.总结 实践部分 在看代码之前先叠加一个甲,本文并未跑出来这个实验结果。实验条件有限,论文中采用的ImageNet dataset 数据集有些太大了。后续会出一个简化版本的代码进行实践…

探索Spring Cloud Config:构建高可用的配置中心

目录 认识Spring Cloud ConfigConfig Server读取配置文件步骤1:(1)创建config-server项目(2)在config-server中开启Config Server功能(3)在config-server配置文件进行相关配置(4&…

深入理解 Transformer:构建先进 NLP 模型的关键技术

目录 一、Transformer 为何如此重要?二、Transformer 的核心组成部分1. 注意力机制2. 位置编码3. 前馈神经网络 三、Transformer 的训练方法1. 无监督预训练2. 有监督微调 四、Transformer 的应用场景五、总结与展望 在自然语言处理(NLP)的领…

【JAVA-数据结构】二叉树

这篇是二叉树相关内容。 1. 树型结构 1.1 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。朝把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶下的。它具有以…

外卖点餐系统小程序的设计

管理员账户功能包括:系统首页,个人中心,外卖员管理,餐厅管理,用户管理,菜品分类管理,菜品信息管理,外卖订单管理,订单配送管理 微信端账号功能包括:系统首页…

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统 (源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着电子商…

人、机不同的学习机理

在人机协同的过程中,断点(或称为障碍点)是指可能导致人机合作效率下降、决策失误或任务失败的关键环节。以下是一些常见的断点及其影响:人类和机器之间的信息传递不畅,可能导致误解或遗漏关键信息,技术术语…

YOLO11改进|注意力机制篇|引入三重注意力机制Triplet Attention

目录 一、【Triplet Attention】注意力机制1.1【Triplet Attention】注意力介绍1.2【Triplet Attention】核心代码 二、添加【Triplet Attention】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【Triplet Attention】注意力机…

ARM嵌入式学习--第二天

-指令流水线 -基础知识 1.流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器的效率和吞吐率 2.增加流水线级数,可以简化流水线的各级逻辑,进一步提高了处理器的性能 3.以三级流水线分析: pc代表程序计数器&#x…

Graph Contrastive Learning 图对比学习GCL

Preamble GCL主要任务:学习一个编码器,可以编码出结构和结点特征信息,得到一个低维的表达 早期大部分GNN模型都是有监督的训练 自监督学习主要分成两种:生成式(用已有信息去预测自己的其他信息) and 对…

C++学习笔记----9、发现继承的技巧(一)---- 使用继承构建类(1)

在前面的章节中,你学到了继承关系是一种真实世界对象以层次存在的模式。在编程世界中,当需要写一个类基于其构建,或进行细微的修改的另一个类时,那种模式就有了关系。完成这个目标的一个方式是拷贝一个类的代码粘贴到另一个类中。…

一个月学会Java 第14天 内部类

Day14 内部类 类有外边的public class,然后还有一个文件多个的class,但是有没有想过,class可以作为成员也就是类内部的类,甚至作为方法内部的属性也就是类内部的方法的内部出现。除了这两个, 还有直接对着上节课讲的抽…

GeoScene Pro教程(008):GeoScenePro数据查询和检索

文章目录 1、工具分类2、数据常用工具2.1 加载数据2.2 查询需求2.2.1 按照属性查询查询1:人口大于300万的城市有哪些查询2:自治州有哪些查询3:城市名字中带有“荆”的有哪些补充2.2.2 按照位置查询需求2:导出湖北省境内的铁路数据需求3:武汉市共有多少条铁路2.2.3 空间连接…

48 Redis

48 Redis 前言 Redis(Remote Dictionary Server ),即远程字典服务。是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 redis会周期性的把更新的数据写入磁盘或者把修改操…

RTSP与ONVIF协议的区别及其在EasyCVR视频汇聚平台中的应用

在视频监控和物联网设备领域,RTSP(Real Time Streaming Protocol)和ONVIF(Open Network Video Interface Forum)是两个重要的协议,它们各自在视频流的传输和控制上发挥着不同的作用,并在实际应用…