【Docker】Docker Registry(镜像仓库)
文章目录
- 一、什么是 Docker Registry
- 二、镜像仓库分类
- 三、镜像仓库工作机制
- 四、常用的镜像仓库
- 五、常用命令
- 镜像仓库命令
- 镜像命令(部分)
- 容器命令(部分)
- 六、docker镜像仓库实战
- 综合实战一:搭建一个 nginx 服务
- 综合实战二:Docker hub上创建自己私有仓库
- 综合实战三:阿里云创建自己的私有仓库
一、什么是 Docker Registry
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。
镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。
整体视图如下:

- 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如
hub.docker.com。一个 Registry 中可以存在多个Repository,Repository 可分为“顶层仓库”和“用户仓库”;·用户仓库名称格式为“用户名/仓库名”,每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像。 - Repository: 由某特定的 docker 镜像的所有迭代版本组成的镜像仓库。
- 镜像名称(name)+标签(tag): 如
nginx:latest - 认证能力: 提供用户注册、登录、登出能力。
- 索引: 提供镜像的索引信息,方便检索。
一个容器镜像包含了两个部分,一个是 元数据,其实就是由dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的blob里面,真正占有空间的就是这些 blob。
二、镜像仓库分类
按是否对外开放划分,也是研发人员常说的
- 公有仓库: 像阿里云、 dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用
- 私有仓库: 不对外开放,往往位于私有网络,只有公司内部人员可以使用。
按供应商和面向群体划分
- sponsor(赞助)registry: 第三方的 registry,供客户和 docker 社区版使用。
- mirror(镜像)registry: 第三方的 registry,只让客户使用,例如阿里云必须注册才能使用。
- vendor(供应商) registry: 由发布 docker 镜像的供应商提供的registry,例如像Google 和 Redhat 提供了镜像仓库服务
- private registry: 通过没有防火墙和额外的安全层的私有实体提供的registry,仅供内部使用。
三、镜像仓库工作机制
-
镜像仓库使用流程
• 通过docker login登录仓库
•docker pull拉取需要的镜像
• 通过dockerfile或者commit等方式制作完镜像通过docker push上传到仓库 -
实际研发中镜像仓库如何使用
Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境:

- 名词解释
开发环境:开发人员使用的一套环境测试环境:需求开发完成后,发布到供测试人员进行测试的环境预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布生产环境:真正面向客户的环境
- 名词解释
-
镜像仓库的拉取机制
启动容器时, docker daemon 会试图从本地获取相关的镜像、本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地。
四、常用的镜像仓库
- DockerHub
- Docker Hub 是什么?
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。具有以下功能:- 个人可以注册私有仓库,能够发布自己的镜像
- 提供镜像检索能力
- 提供海量官方和认证组织的镜像
- 从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
- 支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL )
- Docker Hub 功能浏览
- 镜像搜索

- 镜像 tag 查找

- 对应版本拉取命令

- 镜像的大小、id、cpu架构查看

- 镜像搜索
- Docker Hub 是什么?
- 国内镜像源
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内镜像加速器服务,例如:- 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器-> 复制加速器地址)
- 网易云加速器地址
- 百度云加速器地址
可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
Shell
{# 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然后确保 json 的格式正确"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}
添加完成后需要重新加载配置,重启 Docker:
Shell
# 加载配置
sudo systemctl daemon-reload
# 重启 docker
sudo systemctl restart docker
#查看 docker 状态
sudo systemctl status docker
- 私有仓库
私有镜像仓库则是指部署在公司或组织内部,用于自身应用 Docker 镜像存储、分发的镜像仓库。在构建公司内部使用的自动化发布系统的过程中,从安全的角度出发,应用的打包镜像一般情况下只会被存储在私有镜像仓库中, CI/CD 流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操作来完成的。- Harbor: Harbor 是 VMware 公司最近开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。 Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。
- Nexus: Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,目前常被用来作为 Maven 私服、 Docker 私服。
- Docker registry: 由 docker 官方提供的私服,类似于 docker hub。用于保存公司内部上传的 Docker 镜像。
五、常用命令
镜像仓库命令
命令清单

docker login: 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
- 语法
docker login [OPTIONS] [SERVER]
- 关键参数
-u登陆的用户名-p登陆的密码
- 样例
#root用户下
docker login

当然我们也可以通过指定选项来登录:
docker login -u cjl1314520

docker pull: 从镜像仓库中拉取或者更新指定镜像
- 语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
- 别名
docker image pull
-
关键参数
○-a拉取所有 tagged 镜像
○--disable-content-trust忽略镜像的校验,默认开启 -
样例一
- 先在dockerhub上找到我们想要下载的镜像:

- 输入下载命令
docker pull nginx:1.23.4

- 先在dockerhub上找到我们想要下载的镜像:
-
样例二
- 找到所要下载的镜像的
DIGEST,如下:

- 输入下载命令
docker pull nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25

- 找到所要下载的镜像的
docker push: 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
- 语法
docker push [OPTIONS] NAME[:TAG]
- 别名
docker image push
-
关键参数
-a推送所有 tagged 镜像--disable-content-trust忽略镜像的校验,默认开启
-
样例
这里我们不能直接往nginx站点里推送镜像

我们需要先在站点上创建仓库:


这里我们需要穿插一条命令:
docker tag: 给镜像取名字- 演示:
docker tag nginx:1.23.4 cjl1314520/mybitnginx:v1.23.4

- 演示:
使用命令推送镜像到我们的仓库:
docker push cjl1314520/mybitnginx:v1.23.4

这里我们可以看到,镜像已经被推送到我们在dockerhub上创建的仓库里了。

下面我们拉取一下我们自己仓库中的镜像:
docker pull cjl1314520/mybitnginx:v1.23.4

当然我们也可以使用 docker push cjl1314520/mybitnginx -a 把所有的镜像都推送到docker hub仓库中。
docker search: 从 Docker Hub 查找镜像
- 语法
docker search [OPTIONS] TERM
-
关键参数
--no-trunc显示完整的镜像描述-f <过滤条件>列出收藏数不小于指定值的镜像
-
样例
docker search nginx

#查找所有stars=10的nginx
docker search -f stars=10 nginx

#查看nginx完整的镜像描述
docker search --no-trunc nginx

docker logout: 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
- 语法
docker logout [SERVER]
- 样例
docker logout

镜像命令(部分)
docker images: 列出本地镜像
- 语法:
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 别名
docker image ls, docker image list
-
关键参数
-a列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)--digests显示镜像的摘要信息;-f显示满足条件的镜像;--format指定返回值的模板文件;--no-trunc显示完整的镜像信息;-q只显示镜像 ID。
-
样例
docker images

#查找nginx
docker images nginx
#查找具体的nginx版本
docker images nginx:1.23.4

当然,docker命令是可以和Linux下的命令结合使用的。

docker image inspect: 查看镜像详细信息
- 语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]
- 样例
#查看镜像详细信息
docker image inspect nginx:1.23.4

#通过ID来查看镜像的详细信息
docker image inspect IMAGE ID

docker tag: 标记本地镜像,将其归入某一仓库
- 语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- 别名
docker image tag
- 样例
docker tag ac232364af84 cjl1314520/mybitnginx:vv

容器命令(部分)
docker run: 创建一个新的容器并运行一个命令
- 语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- 别名
docker container run
-
关键参数
-d: 后台运行容器,并返回容器 ID。-i: 以交互模式运行容器,通常与 -t 同时使用。-P: 随机端口映射,容器内部端口随机映射到主机的端口。-p: 指定端口映射,格式为: 主机(宿主)端口:容器端口。-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。--name="nginx-lb": 为容器指定一个名称。-h "mars": 指定容器的 hostname。-e username="ritchie": 设置环境变量。--cpuset-cpus="0-2"or--cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行。-m:设置容器使用内存最大值。--network="bridge": 指定容器的网络连接类型。--link=[]: 添加链接到另一个容器。- –volume , -v: 绑定一个卷。
--rm:shell 退出的时候自动删除容器。
-
样例一
首先查看我们所在的操作系统的版本:

去docker hub上找一个Ubuntu 20.04的镜像

拉取该镜像

#不带任何参数--没有任何效果
docker run ubuntu:20.04
#带参数--可以看到,终端变成了Ubuntu操作系统
docker run -it ubuntu:20.04


- 样例二
-d参数
后台运行容器
docker run -d nginx:1.24.0

使用 docker ps 查看

- 样例三
-it参数
docker run -it ubuntu:20.04 bash

- 样例四
-P/-p参数
docker run -d -p 8081:80 nginx:1.24.0



docker run -d -P nginx:1.24.0

curl 127.0.0.1:32769

- 样例五
--name、-h、-e参数
#--name选项
docker run -d --name mynginx1 nginx:1.24.0
#-h选项
docker run -it -h myubuntu ubuntu:20.04 bash
#-e选项
docker run -it -h myubuntu -e myenv=test ubuntu:20.04 bash


- 样例六
--cpuset-cpus、-m选项

当我们不指定内存时,可以看一下:
docker run -d --name mynginx1 --cpuset-cpus="1" nginx:1.24.0

docker run -d --name mynginx2 -m 500m nginx:1.24.0

- 样例七
--link=[]、--rm选项
#在一个终端启动一个容器
docker run -it --name myubuntu1 ubuntu:20.04 bash
#另一个终端启动另一个容器
docker run -it --name myubuntu2 --link myubuntu1:mywebsite1 ubuntu:20.04 bash


docker run -it --name myubuntu1 --rm ubuntu:20.04 bash


docker ps: 列出容器
- 语法
docker ps [OPTIONS]
- 别名
docker container ls, docker container list, docker container ps
-
关键参数
-a:显示所有的容器,包括未运行的-f:根据条件过滤显示的内容--format:指定返回值的模板文件。如 json 或者 table-l:显示 latest 的容器-n:列出最近创建的 n 个容器--no-trunc:不截断输出-q: 静默模式,只显示容器编号。-s:显示总的文件大小
-
样例
docker ps
docker ps -a
docker ps -f name =mynginx1
docker ps -f name=mynginx1
docker ps --format json
docker ps -l
docker ps -n 2
docker ps -q
docker ps -s

六、docker镜像仓库实战
综合实战一:搭建一个 nginx 服务
查找并拉取nginx镜像
- 选择一个nginx镜像,版本最好是比较新的,没有安全漏洞的

- 拉取该镜像

- 运行容器
docker run -p 8099:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.24.0


修改nginx首页
- 使用终端的方式重新运行该容器

- 进入指定目录,修改html文件内容

- 再次刷新,查看效果

综合实战二:Docker hub上创建自己私有仓库
Busybox简介
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。 BusyBox 包含了一些简单的工具,例如 ls、 cat 和 echo 等等,还包含了一些更大、更复杂的工具,例如:grep、 find、 mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。 busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小.因海外带宽较小,我们拉取该镜像推送到自己的仓库。
宿主机CentOS上安装BusyBox
- 创建BusyBox的目录并进入该目录
#创建目录
mkdir -p /data/mybusybox
#进入该目录
cd /data/mybusybox/
- 通过wget下载BusyBox
wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate

- 给它赋予可执行权限
chmod +x busybox

- 查看busybox的功能

Docker hub上创建自己的私有仓库




综合实战三:阿里云创建自己的私有仓库
创建账号
进入 阿里云,点击右上角完成注册,可以使用支付宝快速注册

创建仓库







登录并推送镜像



因为仓库创建时是私有的,所以当我们退出账号时,是不能拉取镜像并推送镜像的。

我入职了一个公司,开发一个镜像,我怎么选择用哪个作为基础镜像啊?
一般大型公司有自己专门的镜像制作组织,他们会选取对应的系统版本作为基础镜
像,例如华为某部门选取欧拉来制作基础镜像,腾讯选择自己的 TLinux 制作基础镜像,
不会因为出现 CentOS 不维护了无法使用的情况,而且这些镜像一般都会经过严格的
安全扫描,然后作为基础组件提供给各个部门。一般的公司往往也会同意镜像的基础
版本,所以这个选择个人一般不用太多纠结。
相关文章:
【Docker】Docker Registry(镜像仓库)
文章目录 一、什么是 Docker Registry二、镜像仓库分类三、镜像仓库工作机制四、常用的镜像仓库五、常用命令镜像仓库命令镜像命令(部分)容器命令(部分) 六、docker镜像仓库实战综合实战一:搭建一个 nginx 服务综合实战二:Docker hub上创建自己私有仓库综…...
TensorFlow2实战-系列教程14:Resnet实战2
🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 Resnet实战1 Resnet实战2 Resnet实战3 4、训练脚本train.py解读------创建模型 def …...
编程笔记 html5cssjs 069 JavaScript Undefined数据类型
编程笔记 html5&css&js 069 JavaScript Undefined数据类型 一、undefined数据类型二、类型运算小结 在JavaScript中,undefined 是一种基本数据类型,它表示一个变量已经声明但未定义(即没有赋值)或者一个对象属性不存在。 …...
《区块链简易速速上手小册》第6章:区块链在金融服务领域的应用(2024 最新版)
文章目录 6.1 金融服务中的区块链6.1.1 金融服务中区块链的基础6.1.2 主要案例:跨境支付6.1.3 拓展案例 1:去中心化金融(DeFi)6.1.4 拓展案例 2:代币化资产 6.2 区块链在支付系统中的作用6.2.1 支付系统中区块链的基础…...
【消息队列】kafka整理
kafka整理 整理kafka基本知识供回顾。...
python--杂识--16--代理密码中包含特殊字符
1 安装nginx 2 centos环境安装 yum install httpd-tools3 nginx.conf /etc/nginx/conf/nginx.conf #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;e…...
【Git】05 分离头指针
文章目录 一、分离头指针二、创建分支三、比较commit内容四、总结 一、分离头指针 正常情况下,在通过git checkout命令切换分支时,在命令后面跟着的是分支名(例如master、temp等)或分支名对应commit的哈希值。 非正常情况下&…...
【Tomcat与网络9】提高Tomcat启动速度的八大措施
本文我们来看一下如何对Tomcat进行调优,我们对于Tomcat的调优主要集中在三个方面:提高启动速度、提高系统稳定性和提高并发能力,后两者很多时候是相辅相成的,我们放在一起看。 Tomcat现在一般都嵌入在SpringBoot里,因…...
蓝桥杯嵌入式第七届真题(完成) STM32G431
蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…...
如何降低视频RTSP解码延迟
降低RTSP(Real-Time Streaming Protocol)视频流的解码延迟涉及到网络传输和解码处理的优化。以下是一些常见的方法: 选择低延迟的解码器:使用专为低延迟优化的解码器,例如一些定制的H.264或H.265解码器。 优化解码器设…...
【Golang】自定义logrus日志保存为日志文件
背景 为了方便查看日志,项目中需要把日志保存到对应的日志文件中,所以需要当前的配置,以使得日志能够保存到对应的日志文件中。 代码 import ("github.com/orandin/lumberjackrus""github.com/sirupsen/logrus" )func …...
【大厂AI课学习笔记】1.4 算法的进步(4)关于李飞飞团队的ImageNet
第一个图像数据库是ImageNet,由斯坦福大学的计算机科学家李飞飞推出。ImageNet是一个大型的可视化数据库,旨在推动计算机视觉领域的研究。这个数据库包含了数以百万计的手工标记的图像,涵盖了数千个不同的类别。 基于ImageNet数据库…...
【Linux笔记】缓冲区的概念到标准库的模拟实现
一、缓冲区 “缓冲区”这个概念相信大家或多或少都听说过,大家其实在C语言阶段就已经接触到“缓冲区”这个东西,但是相信大家在C语言阶段并没有真正弄懂缓冲区到底是个什么东西,也相信大家在C语言阶段也因为缓冲区的问题写出过各种bug。 其…...
【前端收藏】前端小作文-前端八股文知识总结(超万字超详细)持续更新
有了这个八股文不仅对你基础知识的巩固,不管你是几年老前端程序员,还是要去面试的,文章覆盖了前端常用及不常用的方方面面,都是前端日后能用上的,对你的前端知识有总结意义,看完后,懂的不懂的都…...
GNSS模块的惯导技术:引领定位科技的前沿
全球导航卫星系统(GNSS)模块的惯导技术是一项颇具前瞻性的科技,它结合了全球定位系统和惯性导航技术,为各个领域的定位需求提供了更为精准和可靠的解决方案。本文将深入探讨GNSS模块的惯导技术,以及它如何在多个领域中…...
Flutter 和 Android原生(Activity、Fragment)相互跳转、传参
前言 本文主要讲解 Flutter 和 Android原生之间,页面相互跳转、传参, 但其中用到了两端相互通信的知识,非常建议先看完这篇 讲解通信的文章: Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、…...
Kubernetes基础(十一)-CNI网络插件用法和对比
1 CNI概述 1.1 什么是CNI? Kubernetes 本身并没有实现自己的容器网络,而是借助 CNI 标准,通过插件化的方式来集成各种网络插件,实现集群内部网络相互通信。 CNI(Container Network Interface,容器网络的…...
yo!这里是单例模式相关介绍
目录 前言 特殊类设计 只能在堆上创建对象的类 1.方法一(构造函数下手) 2.方法二(析构函数下手) 只能在栈上创建对象的类 单例模式 饿汉模式实现 懒汉模式实现 后记 前言 在面向找工作学习c的过程中,除了基本…...
2023年上-未来几年我要做什么
1月份,离职。 2月份,春节休假回来,中旬去参加了一个月的瑜伽培训,学会了倒立、鹤蝉。。。。 3月份,瑜伽培训结束,开始收拾房子,并调研各类项目。 4月份,参与了朋友的区块链项目 …...
智能汽车竞赛摄像头处理(3)——动态阈值二值化(大津法)
前言 (1)在上一节中,我们学习了对图像的固定二值化处理,可以将原始图像处理成二值化的黑白图像,这里面的本质就是将原来的二维数组进行了处理,处理后的二维数组里的元素都是0和255两个值。 (2…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
