Docker详解,windows上安装与使用

2023/9/30 16:35:59

Hi I’m Shendi


Docker详解,windows上安装与使用



Docker详解

Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。



通俗理解

可以用船和货物来理解,不同货物需要不同的船来运输,比如化学品,食品,不同货物不能混装

为了节省开销,可以用装货物的集装箱,有了集装箱,就可以一艘船上运输食品又运输化学品了,并且互不影响

虚拟机/操作系统就是一艘艘的船,而Docker是集装箱


例如虚拟机运行一个windows软件,光操作系统就会占用1G左右内存,20G左右磁盘空间,为了运行稳定,甚至需要更多。

如何使应用运行在同一个操作系统上减少资源浪费,但又能避免环境冲突呢?操作系统层虚拟化,容器概念的提出,就是为了解决这个问题

与虚拟机相比,比虚拟机更轻量,更简单,更快速。相对于传统虚拟化技术,Docker有以下几点优势:

  • 资源利用率高:Docker使用宿主机的操作系统内核,不需要虚拟机的额外操作系统和硬件虚拟化的开销,因此能够利用更多的系统资源。
  • 快速启动和部署:Docker镜像可以快速创建和部署,因为它们仅仅包含运行应用程序的必要组件,而不需要安装整个操作系统。
  • 轻量化:Docker利用容器技术,不需要像传统虚拟机一样,每个虚拟机都需要安装一套完整的操作系统。Docker容器共用同一个操作系统内核,使得Docker容器的启动和销毁速度更快,占用的系统资源更少。
  • 可移植性:Docker容器包含了整个应用及其所有的运行时依赖,从而使得应用在不同的环境中可以不做任何修改而直接运行。
  • 更高效的协作和交付:Docker镜像可以轻松地与团队中的其他人共享,它们可以在不同的环境中进行部署,无需担心环境的变化。
  • 高效性: Docker容器的存储方式为镜像,不需要进行传统虚拟机的复制、备份等繁琐操作。此外,Docker容器的存储方式采用分层存储的方式,不同容器之间可以共享相同层,节约了磁盘空间。
  • 灵活性:Docker容器的启动、停止等操作非常灵活,支持快速扩容和缩容。
  • 继承性: Docket容器之间可以通过基础镜像进行继承和定制,易于管理。


Docker的组成

Docker的三大核心概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker的基本组成包括:

  1. Docker守护进程:负责管理Docker容器和镜像,可以通过命令行或API进行访问。
  2. Docker镜像:一个静态的文件,包含了一个应用程序运行所需的所有依赖和配置信息。
  3. Docker容器:Docker镜像的运行实例,可以被启动、停止、删除等。每个Docker容器都是一个独立的运行环境,与宿主机相互隔离。
  4. Docker仓库:提供Docker镜像的存储和分享服务。可以是公共的Docker Hub,也可以是自建的私有仓库。
  5. Docker客户端:通过命令行或API与Docker守护进程进行交互,执行各种操作。

当人们说 “Docker” 时,他们通常指的是Docker Engine,上面的组成也是Docker Engine的组成



在 Windows 上安装docker


版本比较新的操作系统

win10的build 19043及以上,具体参考官方文档,反正装Desktop弹出版本比较旧就不行了

为了在Windows上安装和使用Docker,需要按照以下几个步骤:


1、安装Docker桌面应用程序

下载和安装Docker桌面应用程序,在以下网址下载:

https://docs.docker.com/docker-for-windows/install/

下载完成是一个exe文件,以管理员运行安装,等待安装完成即可


直接安装在了 C:\Program Files\Docker 下


1.1、启用 Hyper-V 和 容器特性

安装好后运行docker会显示 Docker Desktop stopped… 然后闪退

需要启用 Hyper-V 和 容器,如果还不行就需要开启 适用于Linux 系统的 windows 子系统和安装WSL

如果还不行,而且不是系统版本问题,那就卸载重装试试吧


打开控制面板,选择程序和功能,启用或关闭windows功能,勾选Hyper-V和容器确认即可



2、验证是否安装成功

打开PowerShell,输入以下命令:docker --version 如果输出了版本号,则证明安装成功。

在这里插入图片描述



3、运行第一个Docker镜像

打开命令行,输入以下命令:

docker run hello-world

这条命令将会下载一个Docker镜像,并在其中运行一个程序来打印“Hello World”。

如果看到输出了“Hello from Docker! ”,就证明成功了。

现在,您已经在Windows上成功安装Docker并成功运行一个Docker镜像了。



旧版本用 docker-toolbox

可以用 docker-toolbox,是一种替代方案

Docker Toolbox是一个适用于Windows和Mac OS X操作系统的工具箱,可以方便地在本地主机上使用Docker容器。它包含了Docker客户端工具,Docker Machine、Docker Compose、VirtualBox等多个组件,提供一个完整的Docker开发环境。通过Docker Toolbox,开发人员可以更加方便、快捷地进行Docker容器的开发和部署等工作。


在任务管理器检查虚拟化是否打开,没有打开则要先去打开



docker-toolbox 可以在阿里镜像下载

http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/


dockertoolbox


next,选择安装路径

next,根据需求选择比如已经有Git则可以取消勾选Git for windows

next,勾选Install VitualBox with NDIS5 driver

install,等待安装完成,期间会有弹窗询问是否安装驱动,选择是即可

安装完成会在桌面多出以下三个图标

在这里插入图片描述


运行第一个图标,quickstart

如果安装时没有勾选 Git 则需要更改下快捷方式内的目标,右键属性,目标,在最前方的Git地址改为自己的Git安装地址

出现以下这种情况则在安装目录找到 start.sh,打开更改

在这里插入图片描述


将下图的 virtualbox 改为 virtualbox --virtualbox-no-vtx-check 即可

在控制面板,程序->程序和功能->启用或关闭Windows功能,找到Hyper-V并取消勾选

在这里插入图片描述


再次启动,会提示下载 boot2docker ,网速好可以直接等待(Github),不然就自行去Github下载

点击下载boot2docker.iso

也可以微信搜一搜 sddxsck,发送 100003 直接获取

下载完成后,将文件复制到 C:\Users\Administrator.docker\machine\cache 下,没有目录则新建


然后继续启动,安装完默认会新建一个虚拟机

出现以下画面就证明ok了,如果不是,可以复制Error或者Fail部分报错信息百度解决

在这里插入图片描述


接下来就可以正常使用docker了,可以使用 docker-machine ls 查看当前虚拟机的状态

在这里插入图片描述


如果没有default虚拟机的话可以用以下命令来创建一个Docker虚拟机

docker-machine create --driver=virtualbox default


Docker虚拟机文件地址修改

默认虚拟机文件在 C:\Users\Administrator.docker\machine\machines\default 下,如果C盘存储不足,可以考虑转移到其他盘,操作如下

  1. 关闭虚拟机,执行 docker-machine stop default

  2. 打开安装出现的三个图标第三个的 VirtualBox

  3. 点击 管理 -> 虚拟介质管理 在这里插入图片描述

  4. 选中 disk.vmdk 点击复制,复制到想要放到的盘内

  5. 返回主界面,右键虚拟机,设置,存储,将disk.vmdk删除,然后加上复制到新的磁盘的disk.vmdk

    在这里插入图片描述

配置完成,开启虚拟机

docker-machine start default


镜像加速

在国内使用 Docker Hub 很慢,可以配置镜像地址

需要获取镜像地址,可以选择阿里云的(需要登录),个人版免费

进入以下获取阿里云加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors


也可以选择中科大的:https://docker.mirrors.ustc.edu.cn/


移除默认虚拟机,创建一个新的

docker-machine rm -y default
docker-machine create --engine-registry-mirror=地址 -d virtualbox default

查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。


docker-machine env default
eval "$(docker-machine env default)"
docker info

至此,镜像加速就配置完成了





Docker-Machine

在上面使用到了 Docker-Machine 这么一个东西,下面介绍一下docker-Machine是什么

Docker Machine是一种官方的Docker工具,它是一种用于管理Docker主机的命令行工具。通过Docker Machine,您可以使用不同的虚拟化引擎(如VirtualBox、VMware、Hyper-V等)在不同的平台上创建、配置和管理Docker主机。它还可以简化在云平台上创建和管理Docker主机的过程,并提供了与Docker Swarm集群自动化部署和管理的支持。


其作用就是快速帮助我们搭建 Docker(DockerEngine) 主机环境

  • 允许在较旧的Mac或Windows系统上运行Docker
  • 可以在各种linux上配置远程Docker主机


DockerMachine和DockerEngine的区别

DockerMachine是一个工具,用于在各种环境中创建和管理Docker主机。DockerEngine是Docker的核心组件,用于创建和运行Docker容器。

具体来说,DockerMachine可以帮助用户在本地计算机上、在云中或在虚拟机中创建Docker主机。一旦创建,可以使用DockerMachine来连接到该主机并管理其状态。DockerMachine还允许用户在不同的主机之间交换容器。

DockerEngine是Docker的主要组件,用于创建和运行Docker容器。它负责容器的生命周期管理、容器的网络连接管理、存储卷的管理等。DockerEngine是构建和运行容器化应用程序的核心组件。

因此,DockerMachine和DockerEngine是不同的工具,各自有其独特的功能。DockerMachine使Docker主机的创建和管理更加容易,而DockerEngine是Docker容器化应用程序的核心组件。


我们使用的 docker run 等命令都是发送到默认的Docker主机,而Docker容器是运行在宿主机上



hello,world

Docker允许在容器内运行应用程序,使用 docker run 命令

例如运行 hello-world项目

通过 docker run hello-world 从网络中下载hello-world镜像

运行结果如下

在这里插入图片描述



使用Dockerfile构建自定义镜像

Dockerfile 是自定义镜像的一套规则,每一行代表一个指令,包含了构建镜像所需的指令和说明

Dockerfile镜像分层指的是Docker镜像构建过程中,每一条命令都是在上一条命令的基础上进行的,每一层都可以看作一个增量的变化,最终形成一个完整的镜像文件。


常用指令

名称描述语法语法描述示例
FROM指定基础镜像,只能出现一次FROM [镜像名称]:[标签]其中,镜像名称是指要使用的Docker镜像的名称,标签用于指定具体的版本号。Docker镜像名称和标签可以使用官方Docker Hub上的镜像,也可以使用本地的镜像FROM openjdk:8-jdk-alpine
MAINTAINER维护者信息,可选MAINTAINER maintainer_name <maintainer_email>maintainer_name表示维护者的姓名,maintainer_email表示维护者的邮箱。这个信息将会在docker image inspect命令输出中显示MAINTAINER Shendi “shendi@sdpro.top”
LABEL用以取代MAINTAINER,键值对LABEL <key>=<value>key名称,value内容,可以定义多个元数据LABEL author=“Shendi” \
description=“Docker test” \
version=“1.0”
RUN执行命令,多个使用&&,每一个命令代表一层,所以不要过多无意义的层,会造成镜像膨胀过大RUN commandRUN echo test && echo test2
ADD将文件添加到镜像,压缩文件会自动解压,支持从远程地址下载文件。仅复制推荐用COPYADD <src>… <dest>src指本地主机上要复制的文件或目录路径,可多个,dest指容器中要复制到的文件或目录路径ADD target/*.jar test.jar
COPY将本地文件或目录复制到Docker容器中COPY [–chown=<user>:<group>] <src>… <dest>--chown=<user>:<group>:指定复制后的文件或目录的所属用户和所属组。 <src>:要复制的本地文件或目录的路径,支持使用通配符。 <dest>:复制到Docker容器中的路径,可以是相对路径或绝对路径。COPY app/* /app/
WORKDIR指定Docker容器的工作目录,相当于cd到了指定目录WORKDIR path在使用Docker容器时,可以通过-w选项来指定容器的工作目录
例如docker run -w /path/to/work/dir myimage
WORKDIR /path/to/work/dir
VOLUME用于为容器添加卷,相当于硬盘VOLUME [“/path/to/dir”]/path/to/dir指定了需要挂载的目录,可以在启动容器时使用-v参数将该目录挂载到本地主机VOLUME “/path/to/dir”
EXPOSE用于标识容器运行的服务端口,相当于防火墙开放指定端口EXPOSE <port> [<port> …]port表示需要暴露的端口号。可以指定多个端口号,用空格隔开。
需要注意的是,EXPOSE 指令并不会自动将容器的端口映射到宿主机上,而是仅仅声明容器会使用指定的端口号。如果需要将容器的端口映射到宿主机上,需要使用 docker run 命令的 -p-P 参数。
EXPOSE 80
CMD用于定义容器启动时默认执行的命令CMD <command>

CMD [“executable”, “param1”, “param2”]
只能在Dockerfile文件中出现一次,如果多次使用,则会覆盖前一个CMD。同时,如果在Dockerfile中指定了ENTRYPOINT,则CMD会被作为ENTRYPOINT的参数CMD “nginx”
ENTRYPOINT指定在运行容器时要执行的默认命令,它与CMD一起构成了容器的启动命令ENTRYPOINT [“executable”, “param1”, “param2”]该命令是不可被覆盖的,即使在 docker run 命令中指定了其他命令也会被忽略ENTRYPOINT [“java”, “-jar”, “/app.jar”]
ARG在构建镜像过程中传递参数。这些参数可以用于设置环境变量、默认值和镜像版本等信息ARG <name>[=<default-value>]name表示参数的名称,default-value表示默认值。ARG VERSION=latest
可以在FROM或者RUN命令中引用,例如
FROM node:$VERSION
在构建镜像时,可以通过–build-arg参数传递参数的值

根据上面的指令,编写 Dockerfile,将需要的文件全部放到一个文件夹内

例如运行一个java jar包,files是配置文件的文件夹,使用jdk17

FROM openjdk:17-jdk-alpine
COPY app.jar /
COPY files /files
ENTRYPOINT ["java","-jar","app.jar"]

提示:

当不是根目录时需要在结尾加斜杠,例如复制files到 app 文件夹内,COPY files /app/files/

并且需要设置工作目录 WORKDIR,这样项目获取根目录就为工作目录,否则为 / 导致找不到文件



目录结构为

|-files
	|-config.properties
|-app.jar
|-Dockerfile

将docker命令行用cd命令到目录,通过以下命令构建镜像

docker build -t test:1.0 .

test代表镜像名称,1.0代表版本(镜像名称:镜像标签),版本可选,后面那个点代表当前目录(Dockerfile所在目录)

创建完成可以用 docker images 命令查看


docker run test:1.0 来运行刚刚创建的镜像

在这里插入图片描述


可以通过 docker ps 来查看正在运行的容器,通过 docker stop 容器id 来停止指定容器运行

如果程序有端口需要访问,则需要通过增加 -p 参数,例如让容器内的899端口关联到本机的889端口

docker run -p 889:899 镜像名

然后可以直接通过端口访问了

在 Dockerfile 内要增加 EXPORT 指定端口


需要注意的是,在Windows中运行docker,实际上是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker,所以“本机”指的是Linux的地址(这个坑坑死我了,导致我一直在找为什么无法访问的问题)

通过 docker-machine ip default 查看Docker主机IP,default为主机名称,一般为 192.168.99.100


访问效果如下

在这里插入图片描述



挂载目录(日志,配置文件等)

当容器关闭后,容器内的所有内容都会被清空,对于日志这些需要保存下来的,就需要使用到挂载目录

Docker挂载目录是将本地主机的目录或文件夹与Docker容器内的目录或文件夹进行映射,使得容器内的数据可以被持久化保存并能够进行共享。

Dockerfile中可以使用VOLUME来指定挂载目录,也可以在 run 的时候使用 -v 指定


例如上面自定义镜像的例子,运行起来会在工作目录生成日志文件及文件夹,使用以下命令启动增加挂载目录

docker run -p 889:899 -v 宿主机地址:容器内工作目录地址 镜像名

需要注意的是,挂载目录优先于容器内目录,所以容器内的路径不能与挂载目录重名,否则导致找不到文件

上面的例子使用的是Java,所以还需要调整一下镜像Dockerfile重新构建

FROM openjdk:17-jdk-alpine
COPY app.jar /
COPY files /app/files
WORKDIR /app/
EXPOSE 899
ENTRYPOINT ["java","-jar","../app.jar"]

如果配置文件有动态修改的需求,可以不一起打包成镜像(例如去掉COPY files),而是放到挂载目录,程序找文件是从工作目录查找,挂载目录与工作目录一致即可



Widnows挂载配置

如果本机是windows,宿主机实际上是Linux,可以通过之前说过的VirtualBox或者 docker-machine ssh default 进入Linux虚拟机操作


当然还有更简便的方法,给Linux虚拟机增加挂载目录挂载到本机

打开 VirtualBox,选择 default 虚拟机,点击设置 - 共享文件夹

在这里插入图片描述

上面的共享文件夹路径为本机要共享的文件夹地址,共享文件夹名称为虚拟机内地址,勾选自动挂载,固定分配

重启虚拟机,即可在虚拟机内看到新增的目录


例如 容器挂载 /app 目录,linux内就有 app 目录与容器共享

然后windows将linux内的app目录挂载到H:/tmp,那么 H:/tmp 等同于容器内的 /app 目录


至此,Docker的基本使用已经OK,其余就就是一些命令之类的了,可以随时查阅




END


http://www.jnnr.cn/a/369257.html

相关文章

面试时被问:为什么裁员只裁你,不裁别人,该怎么回答?

面试官总有各种奇奇怪怪的问题&#xff0c;比如这个&#xff1a;为什么裁员裁了你&#xff0c;而不是裁别人&#xff1f;这个充满恶意的问题该怎么回答&#xff1f;网友给出了各种各样的答案&#xff0c;有人说&#xff0c;就说行业动荡&#xff0c;不稳定。有人说&#xff0c;…

Golang每日一练(leetDay0023)

目录 67. 二进制求和 Add Binary &#x1f31f; 68. 文本左右对齐 Text Justification &#x1f31f;&#x1f31f;&#x1f31f; 69. x 的平方根 Sqrt x &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C…

vscode软件设置头文件路径的方法

一. 设置头文件路径原因 在使用 vscode 软件进行 C 开发过程中&#xff0c;有些 .c 文件引用的头文件&#xff0c;提示会找不到头文件路径。因此&#xff0c;vscode 软件需要设置头文件路径。 二. vscode设置头文件路径 在 vscode 软件打开的情况下&#xff0c;默认打开一…

UNIX环境高级编程——UNIX基础知识

1.1 引言 所有操作系统都为它们所运行的程序提供服务&#xff0c;典型的服务包括&#xff1a; 执行新程序打开文件读文件分配存储区获得当前时间… 1.2 UNIX体系结构 可将操作系统定义为一种软件&#xff0c;它控制计算机硬件资源&#xff0c;提供程序运行环境&#xff0c;…

JAVA打飞机游戏的设计与实现

手机软件现状 在信息社会中&#xff0c;手机及其他无线设备越来越多的走进普通百姓的工作和生活&#xff0c;随着信息网络化的不断进展&#xff0c;手机及其他无线设备上网络势在必行。但是传统手机存在以下弊端&#xff1a; 1. 传统手机出厂时均由硬件厂商固化程序&#xf…

Spring Boot使用GraphQL开发Web API

目录前言Spring Boot中GraphQL的实现方案前言 传统的Restful API 存在诸多的问题&#xff0c;首先它无法控制返回的字段&#xff0c;前端也无法预判后端的返回结果&#xff0c;另外不同的返回结果对应不同的请求地址&#xff0c;这就导致了多次请求的问题。而GraphQL正是基于这…

9.网络爬虫—MySQL基础

网络爬虫—MySQL基础MySQL安装教程MySQL登录Mysql数据库操作显示数据库创建数据库删除数据库查询数据库使用数据库Mysql数据类型Mysql数据表创建Mysql增删查改PyMysql安装Python的MySQL库连接数据库增添字段操作游标PyMysql插入PyMysql查询PyMysql更新PyMysql删除前言&#xff…

生成式 AI 背后的共同框架:Stable Diffusion、DALL-E、Imagen

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 框架 这些生成式 AI 的整体功能为&#xff1a;输入「文字」&#xff0c;返回「图像」&#xff0c;即 Text-to-image Gener…

计算机发展史之阿达·洛芙莱斯

你一定想不到世界上最早的程序员竟然是一位女士&#xff0c;而且还有专门的编程语言为了纪念她而命名&#xff0c;她就是阿达洛芙莱斯&#xff08;Ada Lovelace&#xff09; 奥古斯塔阿达拜伦是她的原名&#xff0c;因为嫁给威廉金后晋封为洛芙莱斯伯爵&#xff0c;而后改的名字…

R -- 卡方检验--原理及应用

1.单样本方差同质性检验 2.适合性/拟合优度/吻合性检验 或者公式书写如下&#xff1a; 图片来源&#xff1a;https://www.bilibili.com/opus/730576389651038260?fromsearch&spm_id_from333.337.0.0 例题 3.独立性检验 如何理根据列联表推算论值 E11 sum(Row1) * sum(…

(九)大数据实战——hadoop集群的历史服务器配置与日志聚集

前言 前面的章节我们已经介绍过了关于hadoop集群部署的内容&#xff0c;延续上一节的内容。本节我们主要介绍一下关于hadoop集群历史服务器的配置与启动&#xff0c;方便我们查看hadoop操作过程中的一些任务执行情况。同时我们也配置一下hadoop集群的日志聚集功能&#xff0c;…

linux系统安装JDK(我的系统是ubunut20.04)

一、下载jdk包 # 下载解压wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gztar -zxvf jdk-17_linux-x64_bin.tar.gz # 将jdk-17改名为javamv jdk-17 java# 拷贝到/usr/local目录下sudo cp -rap java /usr/local 二、添加环境变量 # 进入profile文…

信息系统项目管理师第四版知识摘编:第13章 项目资源管理​

第13章 项目资源管理​ 项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程&#xff0c;这些过程有助于确保项目经理和项目团队在正确的时间和地点使用正确的资源。​ 13.1管理基础​ 13.1.1相关术语和定义​ 1项目团队​ 项目团队是执行项目工作&#xf…

linux入门---程序地址空间

之前学习的地址空间 在之前的学习中我们知道操作系统将内存划分为好几个区域&#xff0c;比如说栈区&#xff0c;堆区&#xff0c;未初始化区&#xff0c;已初始化区&#xff0c;代码区&#xff0c;每个区的大小不同所对应的功能也不同&#xff0c;并且在内存中每个字节大小的…

还在用xmind破解版?快来康康这个,墙裂推荐

我之前一直在用XMind破解 首先不是不支持&#xff0c;只是囊中有点羞涩....... 言归正传&#xff0c;我很是特别喜欢XMind的这些小功能&#xff0c;简直是神助攻 XMind 推荐指数&#xff1a;☆☆☆☆☆ 点击直达 >>XMind.cn 01 一键提取风格 魔力值 No.1 的非创建风…

【进阶C语言】各大常用库函数的模拟实现

前言 今天恒川带给大家的是平常应用的库函数&#xff0c;恒川来给大家都模拟实现一下&#xff0c;希望对大家有帮助&#xff01;&#xff01; 各大常用库函数的模拟实现1. 模拟实现strlen2. 模拟实现strcpy3. 模拟实现strcat4. 模拟实现strstr5. 模拟实现strcmp6. 模拟实现memc…

[Java] synchronized的锁优化机制

目录 一 . 锁膨胀(锁升级) 二 . 锁消除 三 . 锁粗化 附加 : Callable 接口 ReentrantLock ReentrantLock 与 synchronized 的区别 Semaphore (信号量) CountDownLatch 多线程下使用哈希表 1. HashTable 2 .ConcurrentHashMap ConcurrentHashMap 优点 CopyOnWri…

华为交换机 链路聚合

前言 随着网络规模不断扩大&#xff0c;用户对骨干链路的带宽和可靠性提出了越来越高的要求。在传统技术中&#xff0c;常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽&#xff0c;但这种方案需要付出高额的费用&#xff0c;而且不够灵活。 采用链路聚合…

Java锁深入理解2——ReentrantLock

前言 本篇博客是《Java锁深入理解》系列博客的第二篇&#xff0c;建议依次阅读。 各篇博客链接如下&#xff1a; Java锁深入理解1——概述及总结 Java锁深入理解2——ReentrantLock Java锁深入理解3——synchronized Java锁深入理解4——ReentrantLock VS synchronized Java锁…

Set的底层实现

一、二分搜索树 最核心的操作在于查找 a.是一棵二叉树 b.若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值. c.若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值. 特点&#xff1a; 中序遍历为递增排序 二、哈希函数 哈希函数…
最新文章