Linux操作系统运维-Docker的基础知识梳理总结
Linux操作系统运维-Docker的基础知识梳理总结
- docker用来解决不同开发人员软件调试时环境不统一的问题,保证了程序调试时运行环境的一致性。
- docker的设计理念便是一处镜像,处处运行,即通过产生用户软件,运行环境及其运行配置的统一镜像来解决不一致的开发环境部署。
- docker是基于go语言实现的云开源项目,它是linux容器技术的进一步发展而来。
docker与传统虚拟机的差异
- linux容器(容器虚拟化技术)
Linux容器是一种轻量级的虚拟化技术,它允许在同一主机上运行多个隔离的用户空间实例,每个实例都有自己的文件系统、进程空间和网络资源。容器是基于操作系统级虚拟化实现的,与传统的虚拟机相比,它们更加轻量级、启动更快,并且占用更少的系统资源。
Linux容器的核心技术是Linux内核的命名空间和控制组(cgroup)。命名空间提供了隔离的环境,使得每个容器都具有自己独立的进程、网络、文件系统等资源。控制组用于限制和管理容器的资源使用,例如CPU、内存、磁盘IO等。
容器可以在同一主机上并行运行,互相之间相互隔离,不会相互影响。每个容器都可以运行自己的应用程序和服务,就像在独立的操作系统中一样。容器还可以快速部署、复制和迁移,使得应用程序的部署和管理更加灵活和高效。
常见的Linux容器技术包括Docker、LXC(Linux Containers)、rkt等。它们提供了易于使用的工具和接口,简化了容器的创建、管理和部署过程。
所以docker与传统虚拟机的差异体现在:docker是在操作系统层面实现虚拟化,而传统虚拟机是在硬件层面实现虚拟化
docker快速的底层原因
- docker拥有更少的抽象层,不需要硬件资源虚拟化,直接使用物理机的硬件资源
- docker利用的是宿主机的内核,无需加载操作系统内核,避免了引导加载系统内核等消耗大量时间的过程
Docker帮助启动类命令
- docker概要信息
docker info
- docker帮助文档
docker --hlep
- docker对应指令的文档
docker [command] --help
例如:docker run --help
Docker常见镜像操作命令
- 查看存在镜像列表
docker images
| 选项 | 描述 |
|---|---|
| -a | 列出本地所有镜像,含历史镜像列表 |
| -q | 只显示镜像ID |
- 在仓库检索镜像
docker search [镜像名]
例如:docker search hello-world
--limit选项:用于列出指定数目的镜像(默认列出25个,即不指定数目),因为不同组织或个人提交的镜像是比较多的
例如:docker search --limit 10 redis
- 下载镜像
docker pull [镜像名]
例如:docker pull redis 就是默认下载官方最新版的redis
在此命令后还可以以冒号衔接一个TAG,TAG是镜像的标签或版本号,例如 docker pull [镜像名]:6将下载一个TAG为6的版本
- 查看镜像,容器,数据卷所占空间
docker system df
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 1 954.8MB 954.8MB (100%)
Containers 2 1 106.9MB 15B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
- 删除镜像
docker rmi [镜像名/镜像ID]
删除镜像的两个阶段:
Untagged(取消标签): 如果指定的镜像标签是一个具体的标签(例如
ubuntu:latest),那么这个命令会取消这个标签与镜像的关联。Deleted(删除): 如果删除操作成功,Docker会删除与指定镜像ID相关联的所有层。
Untagged的操作意味着这个镜像不再与特定的标签相关联,但实际的镜像层可能仍然存在,因为可能还有其他标签或镜像依赖于这些层。Deleted的操作则彻底删除了指定的镜像层,释放相关的存储空间。如下正在执行删除
Ubuntu操作的docker[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 56b21e040954 8 days ago 632MB ubuntu latest e34e831650c1 2 weeks ago 77.9MB redis latest bdff4838c172 2 weeks ago 138MB [root@localhost ~]# docker rmi e34e831650c1 Untagged: ubuntu:latest Untagged: ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060a74 Deleted: sha256:e34e831650c1bb0be9b6f61c6755749cb8ea2053ba91c6cda27fded9e089811f Deleted: sha256:8e87ff28f1b5ff2d5131999ccfa1e674cb252631c50683f5ee43fad59cbea8e1
注意:
-
被使用过的镜像有可能删除不了,可以使用
-f选项进行强制删除,例如:docker rmi -f hello-world -
也可以使用镜像id进行删除,例如:
docker rmi -f xxxxxx,值得注意的是镜像的id实际上是sha256加密字符串的前几位 -
删除多个镜像 例如:
docker rmi -f hello-world ubuntu -
删除镜像时在镜像后也可以接TAG,进行指定删除
-
全部删除:
docker rmi -f $(docker images -qa),实际上是将全部镜像作为参数传递给删除命令
docker的虚悬镜像:仓库名与标签均为
<none>的镜像被称为虚悬镜像
Docker常见容器操作命令
以镜像为模板,以容器为实例
命令模板:docker run 指令 镜像名 命令 其他参数
| 指令 | 描述 |
|---|---|
--name="容器新名称" | 为运行的容器指定一个名称 |
-d | 后台运行一个容器,并返回容器ID |
-it | -i与-t常一起使用,前者开启交互式运行,后者用于启动伪终端 |
-P | 进行随机端口映射 |
-p | 指定对应端口进行映射,参数为 [主机端口]:[容器端口] |
-e | 允许你在运行容器时向其中传递环境变量。对于配置应用程序、传递配置信息以及控制应用程序的行为非常有用。 |
注意:在-t指令后是可以开启指定终端的,例如:docker run -it ubuntu /bin/bash
docker run命令的执行过程

图源:尚硅谷
- 查看正在运行的容器
| 命令 | 描述 |
|---|---|
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有容器,包括已停止的 |
docker ps -l | 显示最近创建的容器 |
docker ps -n | 显示最近创建的 n 个容器 |
docker ps -q | 静默模式,只显示容器编号 |
注意:在未指定的情况下,我们每run一个镜像都会产生一个对应的容器,并且在伪终端界面输入exit将会退出容器,并且将容器关闭,使用快捷键
ctrl+q+p将会退出容器,但是容器仍然在后台存活
- 容器的管理与监控
| 命令 | 描述 |
|---|---|
docker start [容器id或者名称] | 启动已经停止的容器 |
docker restart [容器id或者名称] | 重启容器 |
docker stop [容器id或者名称] | 停止容器 |
docker kill [容器id或者名称] | 强制停止容器 |
docker rm [容器ID] | 删除已经停止的容器 |
docker rm -f [容器ID/容器名称] | 强制删除一个容器 |
docker rm -f $(docker ps -a -q) | 强制删除多个停止的容器 |
docker run -d [容器id或者名称] | 在后台运行服务 |
docker logs [容器id或者名称] | 查看对应容器的日志 |
需要注意的是,使用后台运行指令时,在容器的前台必须要存在一个前台进程,否则容器将会自动退出
| 命令 | 描述 |
|---|---|
docker inspect [容器ID] | 用于检查Docker容器的详细信息 |
docker exec -it [容器ID] [shell程序] | 在容器中打开新的终端进程,使用exit命令退出不会导致容器停止 |
docker attach [容器ID] | 不会在容器中打开新的终端进程,使用exit命令退出将导致容器停止 |
docker cp [容器ID]:[容器内路径] [目标主机路径] | 将容器中的文件复制到主机磁盘 |
docker export [容器ID] > [文件名.tar] | 导出整个容器作为tar归档文件,即备份容器 |
| `cat [文件名.tar] | docker import - [镜像用户]/[镜像名]:[镜像版本号]` |
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0e00969856e ubuntu "/bin/bash" 2 minutes ago Up 2 minutes focused_napier
[root@localhost ~]# docker inspect f0e00969856e
[{"Id": "f0e00969856e0a81bfb3d625d799be247734be9fae09339a11c40bba6f4232c2","Created": "2024-01-29T02:57:21.589434796Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,...
容器启动时的行为
已知如下命令默认不会在容器中启动前台进程,所以会在容器创建完成后直接退出:
docker run ubuntu
那么我们考虑如下行为:
docker run -it ubuntu
docker stop [容器ID]
docker start [容器ID]
docker exec -it [容器ID] [shell程序]
我们进行逐步解析:
-
docker run -it ubuntu启动容器时将会默认开启bash作为前台的主进程,保证了容器不会关闭,而是等待用户的输入 -
当通过
docker stop [容器ID]命令停止一个正常运行的容器时,Docker 会尝试关闭容器内的应用程序,并发送一个 SIGTERM 信号给主进程。如果容器内的应用程序在收到 SIGTERM 信号后能够正确处理并正常退出,那么容器会在一定时间内停止。如果容器内的应用程序没有正确响应 SIGTERM 信号,Docker 将发送一个 SIGKILL 信号,强制终止容器。 -
docker start [容器ID]启动容器时,docker start不会重新运行docker run中指定的启动命令,而是尝试重新运行容器最初启动时的主进程。主进程即docker run -it ubuntu启动的交互式shell。如果容器内的应用程序在启动时没有遇到问题,它将继续在后台运行。即处于挂起状态 -
docker exec -it [容器ID] [shell程序]将会在容器内新建一个可交互shell进程,我们通过在容器内运行ps -aux即可发现以下内容root@fc68f54b4133:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 4612 2088 pts/0 Ss+ 09:37 0:00 /bin/bash root 9 0.0 0.2 4612 2324 pts/1 Ss 09:38 0:00 /bin/bash root 229 0.0 0.1 7048 1444 pts/1 R+ 09:47 0:00 ps aux我们会发现有两个bash进程,根据STAT与PID可知第一个bash是会话的领导者,并且处于挂起状态,并且还是一个前台进程组成员
程序状态表:
状态 描述 R 进程正在运行或可运行(runnable)。这表示进程目前正在执行或等待执行。 S 进程处于休眠状态。通常是因为在等待某个事件而挂起。 D 不可中断的休眠状态。进程正在等待硬件操作的完成,无法被中断。 Z 僵尸进程。进程已经终止,但其父进程还没有等待回收它的状态信息。 T 停止状态。进程被停止或暂停执行。
Ss表示进程是会话领导者,同时进程处于休眠状态。S<表示进程是会话领导者,同时进程处于非休眠状态。
Docker镜像分层与加载原理
镜像的分层概念与特性
Docker镜像是Docker容器的基础构建块,它是一个轻量级、独立、可执行的软件包,其中包含运行一个应用所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。
Docker的镜像分层是指镜像是由多个只读层(layers)组成的结构。这些层是对文件系统的一系列叠加操作,每一层都包含了一组文件和配置,与前一层相比有所修改。这种分层结构的设计使得镜像更加轻量、高效、可维护,同时具备一些重要的优势:
-
缓存和重用: 因为每一层都是只读的,且具有唯一标识,Docker可以缓存这些层,从而在构建和推送镜像时更加高效。如果多个镜像共享相同的层,这些层只需存储一次,节省了存储空间。
-
分布式构建: 当构建一个镜像时,Docker可以将各个层分布式地下载和构建,从多个源获取。这使得构建过程更加快速,尤其是当镜像的各个层已经存在于本地或远程的镜像仓库时。
-
可继承性: 镜像的分层结构允许基于现有镜像构建新的镜像,只需添加或修改几个层,而不必重新构建整个镜像。这提高了镜像的可继承性和可重用性。
-
更容易管理和更新: 当一个容器运行时,Docker在其上添加一个可写层(即容器层,用于存储容器的运行时状态和文件修改。这个可写层是容器特有的,而镜像的只读层是共享的。这使得容器可以轻松地更新、删除和重新创建,而不影响镜像的原始只读层。
联合文件系统概念与镜像构建
联合文件系统(Union File System)是一种文件系统技术,它将多个文件系统层联合在一起,形成一个单一的文件系统视图。Union文件系统(UnionES)是一种分层、轻量级并目高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。它的使用使得docker具有以下特性:
-
分层文件系统: Docker镜像是由多个只读层(layers)组成的,每一层都包含文件和配置。这些只读层采用分层结构,每一层相对于前一层表示一系列文件的添加、修改或删除。
-
联合挂载: Docker使用联合挂载技术将这些只读层联合在一起,形成一个单一的文件系统视图。这样,当容器运行时,这个文件系统视图包含了所有必要的文件和配置,提供了容器的运行环境。
-
可写层: 在容器运行时,Docker在只读层之上添加一个可写层,用于存储容器的运行时状态和文件修改。这个可写层是容器特有的,允许容器在运行时进行文件修改而不影响镜像的原始只读层。
-
镜像的不可变性: 由于只读层的不可变性,Docker镜像具有不可变性的特性。一旦镜像被构建,它的只读层就不再改变,这样可以确保镜像的一致性和可重复性。
如下正在执行分层拉取MySQL镜像的docker
[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
558b7d69a2e5: Downloading [==========> ] 11MB/51.32MB
2cb5a921059e: Download complete
b85878fb9bb2: Download complete
d16f3fd26a82: Downloading [======> ] 593.1kB/4.591MB
afd51b5329cb: Waiting
374d2f7f3267: Waiting
4ea1bb2c9574: Waiting
1c9054053605: Waiting
d79cd2da03be: Waiting
e3a1aa788d17: Waiting
Docker的镜像加载原理
docker加载镜像的过程与Linux/Unix系统启动是类似的,它也有bootfs用来引导镜像,不过docker中的bootfs是Docker引擎用于引导容器的一部分。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root file system)在bootfs之上。包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs就是各科不同的操作系统发行版,比如Ubuntu,Centos等等。
Docker的镜像为何如此轻量
首先需要明白镜像的linux是精简的,并没有许多不必要的基础组件。对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs
当我们将一个镜像进行实例化开启容器后,一个新的可写层将会加载到镜像顶部变为我们的容器,也被称为容器层。其下的镜像层均是不可写的
提交容器副本构建新镜像
docker commit -m="容器描述信息" -a="作者信息" [容器ID] 新的镜像名:标签名
[root@localhost ~]# docker commit -m="installed the vim" -a="2333" f0e00969856e vim/ubuntu:2333333
sha256:9926edd5141d5adf6104f0ac1ea14b2881423f6fb10e816aff905e137b835e52
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vim/ubuntu 2333333 9926edd5141d 12 seconds ago 185MB
mysql latest 56b21e040954 10 days ago 632MB
ubuntu latest e34e831650c1 2 weeks ago 77.9MB
redis latest bdff4838c172 2 weeks ago 138MB
[root@localhost ~]#
修改自定义镜像的tag
docker tag [原有镜像名]:[原有tag] [新镜像名]:[新的tag]
正在运行的镜像也是可以进行构建新镜像的,在上述命令的过程中,我们扩展了现有的镜像,类似于Java的继承,新的镜像是从base镜像一层一层叠加生成的,每提交一个镜像就在现有的镜像上增加一层,则我们上述的内容可以得出一个大致的模型:
Docker镜像构建模型

Docker容器数据卷概念与使用
Docker容器数据卷是在Docker容器之间共享和持久化数据的一种方式。它们允许在容器之间共享文件、目录或者数据,并且可以在容器的生命周期内保留数据,即使容器停止或被删除(类似于虚拟机上的共享文件夹)。它具有以下特性:
-
容器与主机之间的数据传输: 数据卷不仅仅可以在容器之间共享,还可以在容器与主机之间传输数据。这使得容器中的数据可以持久化保存在主机上。
-
数据卷的生命周期: 数据卷的生命周期独立于容器。即使容器被删除,数据卷中的数据仍然存在,除非显式删除数据卷。
-
数据卷的备份和恢复: Docker提供了一些工具,如
docker cp命令,允许将数据卷中的数据复制到主机上,从而实现备份和恢复操作。 -
容器之间的解耦: 使用数据卷可以实现容器之间的解耦,允许更新或替换一个容器而不影响其它容器的数据。
为什么会谈到容器停止时会保留数据?
默认情况下,Docker容器停止后,容器内的数据是不会丢失的。Docker 使用一种称为写时复制(Copy-On-Write)的技术,使得容器在运行时可以修改其文件系统,但在容器停止后,对文件系统的修改将被保存在容器的镜像中。
然而,需要注意的是,虽然容器内的数据在停止时不会丢失,但容器本身可能会被删除。如果你使用了临时性的容器(例如通过
docker run --rm命令启动的容器),容器停止后会被自动删除,但数据卷仍然存在。临时性容器是一种短暂存在的、用于执行特定任务的 Docker 容器。它们与长期运行的常规容器不同,因为它们在任务完成后会自动删除。临时性容器通常用于执行一次性的、短暂的操作,例如调试、测试、数据备份或手动操作。--rm标志表示容器在停止后应该被自动删除。
- 进行容器卷挂载
docker run -it -v [宿主机的绝对路径]:[容器内的路径]:[读写模式] [镜像名]
需要注意的是,在宿主机或容器内的路径不存在的情况下将会自动创建,并且可以使用多个v来挂载多个容器卷,读写模式默认是rw,只读模式ro,不过读写模式只限制容器,该选项默认挂载的主机路径为/var/lib/docker/volumes
使用–privileged=true来进行挂载权限不足的问题
在Docker中,
--privileged=true是一个非常强大且潜在危险的选项,它赋予了容器超级用户的权限,使得容器内的进程具有对主机上所有设备的访问权限。这包括了对主机上的特权操作系统功能的完全访问,这可能会导致安全风险。使用
--privileged=true的主要目的是为了让容器内的进程能够执行一些需要特殊权限的操作,比如在容器内运行一些需要访问主机设备或进行底层系统操作的应用。然而,这样的权限可能会被滥用,因此建议仅在确切了解和信任容器中运行的应用程序的情况下使用该选项。
- 下方命令将创建一个数据卷,它的默认路径为
/var/lib/docker/volumes,通常需要我们自己指定
docker volume create [数据卷名]
- 第二种挂载数据卷的方式
docker run -d --name [新容器的名称] --mount source=[数据卷路径],target=[容器内路径] [新容器镜像名]
- 继承容器卷
docker run -d --name [新容器的名称] --volumes-from [已存在容器名称] [新容器镜像名]
新的容器将继承选定的已存在容器上的容器数据卷
配置阿里云镜像加速服务
可以在登录阿里云后在容器服务->容器工具里找到镜像加速服务及使用文档

点击进入控制台,有以下界面:

根据操作指南,里面会有你自己的加速链接(我这里使用的是CentOS):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
本地镜像发布到阿里云
在上述界面中找到以下内容,创建个人实例:

然后创建自己的命名空间,在自定义的命名空间中创建仓库后,根据页面提示的命令操作即可,和GitHub是类似的
私人镜像仓库的部署
抓取官方的镜像
docker pull registry
创建私有仓库运行实例
docker run -d -p [主机端口]:5000 registry
例如:
docker run -d -p 8080:5000 registry
查看仓库中的镜像有哪些
curl -X GET http://仓库的地址/v2/_catalog
也可以将默认镜像储存目录作为容器数据卷进行挂载,例如以下命令
docker run -d -p 8080:5000 -v ~/tmp_docker/:/var/lib/registry --name docker_test registry
例如在宿主机的仓库映射端口为8080时
[root@localhost ~]# curl -X GET http://127.0.0.1:8080/v2/_catalog
{"repositories":[]}
Docker Registry 提供了一个 API 端点,可以使用
curl或其他 HTTP 客户端工具进行访问。通过调用/v2/_catalog端点,可以列出所有仓库。
创建自定义的镜像
docker commit -m="容器描述信息" -a="作者信息" [容器ID] 新的镜像名:标签名
修改镜像tag为规范格式
docker tag [原有镜像名]:[原有tag] [仓库地址/新镜像名]:[新的tag]
以看HTTP方式推送自定义镜像
- 配置信任HTTP推送
[root@localhost ~]# vim /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json
{"insecure-registries":["127.0.0.1:5000"]
}
进行推送
[root@localhost ~]# docker push 127.0.0.1:8080/vim_ubuntu:233
The push refers to repository [127.0.0.1:8080/vim_ubuntu]
14501abaf824: Pushed
8e87ff28f1b5: Pushed
233: digest: sha256:b1a9da2a1fa274bea7c2ad57bd6d7775156ba288d62261124f646fe95edc393f size: 741
[root@localhost ~]# curl -X GET http://127.0.0.1:8080/v2/_catalog
{"repositories":["vim_ubuntu"]}
拉取该镜像
[root@localhost ~]# docker pull 127.0.0.1:8080/vim_ubuntu:233
233: Pulling from vim_ubuntu
df2fac849a45: Already exists
314a19a38b7c: Pull complete
Digest: sha256:b1a9da2a1fa274bea7c2ad57bd6d7775156ba288d62261124f646fe95edc393f
Status: Downloaded newer image for 127.0.0.1:8080/vim_ubuntu:233
127.0.0.1:8080/vim_ubuntu:233
相关文章:
Linux操作系统运维-Docker的基础知识梳理总结
Linux操作系统运维-Docker的基础知识梳理总结 docker用来解决不同开发人员软件调试时环境不统一的问题,保证了程序调试时运行环境的一致性。docker的设计理念便是一处镜像,处处运行,即通过产生用户软件,运行环境及其运行配置的统一…...
PMP考试成绩如何查询?
PMP考试成绩已经陆续出来了,出成绩时间大概一周左右,没收到的别着急,先把如何查询成绩路径弄清楚。 【如何查询成绩】 1、输入网址(PMI官网,不知道网址的私戳),点击 Log In 如果忘记 PMI 的账…...
【Scala】 2. 函数
2. 函数 scala运算符、if … else …两部分和C语言类型,这里不再赘述,这里从for循环开始讲讲scala和c/c的不同之处。 2.1 for循环 scala中主要包含to和until两个关键字,下面分别看看两者的用法,看例子就行了。 (1) to的用法 …...
14.0 Zookeeper环球锁实现原理
全局锁是控制全局系统之间同步访问共享资源的一种方式。 下面介绍zookeeper如何实现全民锁,讲解他锁和共享锁两类全民锁。 排他锁 排他锁(Exclusive Locks),又被称为写锁或独占锁,如果事务T1对数据对象O1加上排他锁…...
课时16:本地变量_普通变量
2.2.2 普通变量 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 变量分类 所谓的本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。本地变量按照变量值的生成方式包含两种:普通…...
阿里云服务器centos_7_9_x64位,3台,搭建k8s集群
目录 1.环境信息 2.搭建过程 2.1 安装Docker源 2.2 安装Docker 2.3 安装kubeadm,kubelet和kubectl 2.4 部署Kubernetes Master(node1) 2.5 安装Pod网络插件(CNI) 2.6 加入Kubernetes Node 2.7 测试kubernetes集群 3.部署 Dashboard…...
代码随想录第二十八天
第七章 回溯算法part04 ● 93.复原IP地址 ● 78.子集 ● 90.子集II 详细布置 93.复原IP地址 本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了 题目链接/文章讲解:https://programmercarl.com/0093.%E5…...
【python】绘制爱心图案
以下是一个简单的Python代码示例,它使用turtle模块绘制一个代表爱和情人节的心形图案。 首先,请确保计算机上安装了Python和turtle模块。然后,将以下代码保存到一个.py文件中,运行它就可以看到爱心图案的绘制过程。 import turt…...
在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS
要将数据从 Elastic Agent 安全地发送到 Logstash,你需要配置传输层安全性 (TLS)。 使用 TLS 可确保你的 Elastic Agent 将加密数据发送到受信任的 Logstash 服务器,并且你的 Logstash 服务器从受信任的 Elastic Agent 客户端接收数据。 先决条件 确保你…...
Vue中对虚拟DOM的理解
作为现代前端开发中的主流框架之一,Vue.js是一个非常流行的JavaScript框架,其核心概念之一就是虚拟DOM(Virtual DOM)。在本篇文章中,我们将深入探讨Vue中虚拟DOM的概念,并讨论为什么它在前端开发中如此重要…...
golang通用后台管理项目——Go+Vue通用后台管理项目实战
GoVue通用后台管理项目实战 1、掌握组件中业务逻辑抽离的方法 2、掌握jwt,日志,跨域,鉴权中间件的使用 3、掌握基于gorm的sql多表查询 4、掌握gin-swag的应用 5、掌握go语言开发前后端分离项目的能力 6、从0到1开发完整前后端分离项目的能力 技术栈: go后端 ging…...
推动海外云手机发展的几个因素
随着科技的不断发展,海外云手机作为一种新兴技术,在未来呈现出令人瞩目的发展趋势。本文将在用户需求、技术创新和全球市场前景等方面,探讨海外云手机在未来的发展。 1. 用户需求的引领: 随着人们对移动性和便捷性的需求不断增长&…...
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
相关推荐 python coding with ChatGPT 打卡第12天| 二叉树:理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树:翻转…...
2020年通信工程师初级 综合能力 真题
文章目录 第1章 通信职业道德,1-4第2章 法律法规,5-16第3章 计算机应用基础,第5章 现代通信网,38英语题,91 第1章 通信职业道德,1-4 1、职业道德在形式上具有()特点。 A.一致性 B.统一性 C.多样性 D.一般性…...
12.0 Zookeeper 数据同步流程
在 Zookeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性。 ZAB 协议分为两部分: 消息广播崩溃恢复 消息广播 Zookeeper 使用单一的主进程 Leader 来接收和处理客户端所有事务请求,并采用 ZAB 协议的原子广播协议,将事务请求…...
作业2.6
一、填空题 1、一个类的头文件如下所示,num初始化值为5,程序产生对象T,且修改num为10,并使用show()函数输出num的值10。 #include <iostream.h> class Test { private: static int num; public: Test(int); void sh…...
Qt应用软件【协议篇】TCP示例
文章目录 TCP协议简介Qt中的TCP编程完整代码示例实际使用中的技巧实际使用中的注意事项TCP协议简介 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。与UDP不同,TCP提供了数据包排序、重传机制、流量控制和拥塞控制,确保了数据传输的可靠性和顺序…...
C# CAD交互界面-自定义面板集(四)
运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System.Windows.Forms; 二、程序说明 创建自定义面板集(PaletteSet)的C#命令方法实现。该方法名为CreatePaletteÿ…...
物流自动化移动机器人|HEGERLS三维智能四向穿梭车助力优化企业供应链
智能化仓库/仓储贯穿于物流的各个环节,不局限于存储、输送、分拣、搬运等单一作业环节的自动化,更多的是利用科技手段实现整个物流供应链流程的自动化与智能化,将传统自动化仓储物流各环节进行多维度的有效融合。 例如在数智化物流仓储的建设…...
EasyExcel下载带下拉框和批注模板
EasyExcel下载带下拉框和批注模板 一、 代码实现 controller下载入口 /***下载excel模板* author youlu* date 2023/8/14 17:31* param response* param request* return void*/PostMapping("/downloadTemplate")public void downloadExcel(HttpServletResponse r…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
