【Docker】Linux中Docker镜像结构及自定义镜像,并且上传仓库可提供使用

news2024/9/22 7:28:05

目录

一、镜像结构

1. 基本结构

2. 常用命令

二、自定义镜像

1. 基本镜像

2. 进阶镜像

3. 完善镜像

三、镜像上传仓库

每篇一获


一、镜像结构

自定义 Docker 镜像有很多用途,以下是一些主要的应用场景:

  1. 一致性环境:通过自定义镜像,您可以确保您的应用在不同的环境中(开发、测试、生产等)运行在完全一致的环境中。这可以避免"在我机器上可以运行"的问题。

  2. 快速部署:自定义镜像包含了运行应用所需的所有依赖,这使得部署过程变得非常快速和简单。只需运行一个命令,就可以在任何安装了 Docker 的机器上启动应用。

  3. 版本控制和回滚:每个 Docker 镜像都有一个唯一的标签,这使得版本控制变得非常简单。如果新版本的应用有问题,您可以很容易地回滚到旧版本的镜像。

  4. 微服务架构:在微服务架构中,每个服务都可以有自己的 Docker 镜像。这使得每个服务可以独立地更新和扩展,而不会影响其他服务。

  5. 持续集成/持续部署(CI/CD):在 CI/CD 管道中,自定义镜像可以用于构建、测试和部署应用。这使得整个开发过程更加自动化,提高了开发效率。

1. 基本结构

Dockerfile 是一个文本文件,它包含了一组用户可以调用来创建镜像的指令。以下是 Dockerfile 的基本结构:

  1. FROM:指定基础镜像,所有操作都基于这个基础镜像。例如:FROM ubuntu:18.04

  2. LABEL:为镜像添加元数据及声明镜像的作者或者维护者的信息。

  3. RUN:在镜像中运行命令,这些命令会在新的层上创建新的镜像。例如:RUN apt-get update

  4. CMD:提供容器默认的可执行程序,可以包含可执行程序,也可以省略,如果省略,则必须在运行时通过命令行指定。例如:CMD ["executable","param1","param2"]

  5. EXPOSE:声明运行时容器提供服务的网络端口。例如:EXPOSE 8080

  6. ENV:设置环境变量。例如:ENV myName="John Doe" myDog=Rex\ The\ Dog

  7. ADD 和 COPY:将文件从 Docker 主机复制到 Docker 镜像中。ADD 有自动解压缩功能,COPY 则更为直接明了。

  8. ENTRYPOINT:配置容器启动后执行的命令,并且不会被 docker run 提供的参数覆盖。

  9. VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保存的数据等。

  10. WORKDIR:设置工作目录,所有后续的操作(CMD、ENTRYPOINT、COPY 和 ADD)都会在这个目录下进行。

  11. USER:设置运行容器时的用户名或 UID。

  12. ONBUILD:当构建一个被继承的 Dockerfile 时运行命令,该指令添加到镜像中,稍后触发。

  13. MAINTAINER :用于声明镜像的作者或者维护者的信息,它可以为使用者提供一种联系镜像创建者的方式。

需要注意的是,MAINTAINER 从 Docker 1.13.0 开始,这个指令已经被标记为已废弃,推荐使用 LABEL 指令来替代。

例:

MAINTAINER John Doe <john.doe@example.com>

 如:

LABEL maintainer="John Doe <john.doe@example.com>"

LABEL 指令可以用于添加更多的元数据到镜像中,比如版本号、构建日期等等。

这些指令在 Dockerfile 中按照从上到下的顺序执行。每个指令都会在镜像上创建一个新的层,然后提交。

案例:

# 基于官方的 JDK 镜像
FROM openjdk:8-jdk
# 设置环境变量
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
# 安装 MySQL
RUN apt-get update && apt-get install -y mysql-server
# 安装 Tomcat
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
RUN curl -O https://downloads.apache.org/tomcat/tomcat-8/v8.5.61/bin/apache-tomcat-8.5.61.tar.gz \
&& tar -xvf apache-tomcat-8.5.61.tar.gz \
&& rm apache-tomcat-8.5.61.tar.gz
# 暴露端口
EXPOSE 8080
# 启动 Tomcat
CMD ["catalina.sh", "run"]

这个 Dockerfile 会创建一个包含 JDK、MySQL 和 Tomcat 的 Docker 镜像。在构建镜像时,它会先从 Docker Hub 下载官方的 JDK 镜像作为基础镜像,然后安装 MySQL,接着下载并安装 Tomcat,最后设置启动命令为启动 Tomcat。

请注意,这只是一个基础示例,实际使用时可能需要根据具体需求进行修改和优化。例如,可能需要添加更多的环境变量,或者调整安装命令以适应特定的应用需求。

2. 常用命令

以下是您提到的 Dockerfile 指令的详细解释:

  1. RUN:用于执行后面跟着的命令行命令。有两种格式:RUN <command>(shell 格式)和 RUN ["executable", "param1", "param2"](exec 格式)。

  2. ENV:用于设置环境变量。这些变量以 <key>=<value> 的形式存在,可以在容器中被脚本或程序调用。

  3. COPY:将来自 Dockerfile 所在目录的文件或目录复制到容器中的一个新位置。

  4. ADD:与 COPY 类似,但是 ADD 允许后面的源参数是一个 URL,或者在源文件是一个 tar 文件的情况下,可以自动解压缩这个 tar 文件。

  5. EXPOSE:用于声明容器运行时监听的网络端口。

  6. WORKDIR:用于设置 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令的工作目录。

  7. ONBUILD:当镜像被用作其他 Dockerfile 的基础镜像时,ONBUILD 指令将会被触发执行。

  8. USER:用于设置接下来的 RUN、CMD 和 ENTRYPOINT 指令运行时的 UID。

  9. VOLUME:用于在容器中创建一个挂载点,用于连接 Docker 主机和容器的文件系统。

容器启动时自动执行指令:

CMD 和 ENTRYPOINT 都是 Dockerfile 中用于指定容器启动时运行的命令的指令,但它们的用法和目的有所不同。

  1. CMD:CMD 指令用于提供容器运行时的默认命令及其参数。在启动容器时,我们可以覆盖这些默认的参数。CMD 在 Dockerfile 中只应被定义一次,如果定义了多次,只有最后一次的定义会生效。CMD 有两种格式:

    如果 Dockerfile 中同时存在 CMD 和 ENTRYPOINT,CMD 中的参数会被添加到 ENTRYPOINT 中,作为其参数。

    • CMD ["executable","param1","param2"](exec 格式,推荐)
    • CMD command param1 param2(shell 格式)
  2. ENTRYPOINT:ENTRYPOINT 的目的也是让容器以应用程序或服务的形式运行。与 CMD 不同,我们在启动容器时不能覆盖 ENTRYPOINT 指令提供的命令,但可以添加额外的参数。ENTRYPOINT 有两种格式:

    如果我们既想让容器以应用程序或服务的形式运行,又想让这些应用或服务接受参数,那么最好的做法是使用 ENTRYPOINT 和 CMD 一起使用,让 ENTRYPOINT 指定应用程序,而让 CMD 指定默认参数。

    • ENTRYPOINT ["executable", "param1", "param2"](exec 格式,推荐)
    • ENTRYPOINT command param1 param2(shell 格式)

二、自定义镜像

1. 基本镜像

首先进入虚拟机并且用MobaXterm这个工具连接,进入后先查看docker的服务/进程有没有开:

输入命令:systemctl status docker   (查看docker的服务/进程

以下是没有开启状态:

 以下是开启状态:

创建一个文件夹,来存放创建后的镜像,并且创建并编写 Dockerfile 文件。

创建文件夹:mkdir soft      (名称soft,可以自己修改)

进入文件夹:cd soft/

创建并编辑Dockerfile文件vim Dockerfile    (文件名称不用改)

进入文件后,按 i 进入编辑模式,然后将以下粘贴上,在按Esc退出编辑模式,输入 :wq 

保存编写内容并且退出文件。 

Dockerfile文件中编写:
 

#1.指定基础镜像,并且必须是第一条指令
FROM  centos
#2.指明该镜像的作者和其电子邮件
MAINTAINER  CloudJun  "jun737x@163.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR  /test
#4.将文件从Docker主机复制到Docker镜像中
COPY spring.jar /test

创建编写完成后,通过 docker build 命令来创建镜像。

命令:docker build -t spring:v1 .

创建语句 docker build -t ,创建后这个镜像的名称spring,这个镜像的版本为 v1 ( 版本可以自己定义,如:0.1,1.0,v1,v2都可以),其中的  . 表示在当前目录创建

再查看镜像:docker images

进入:docker run -it spring:v1 (spring为镜像名称,后面的:v1是需要进入镜像的哪个版本)

之后看看当前目录是不是自己在Dockerfile文件中所设置的,及带进来的jar包是否存在

查看当前路径:pwd 

查看文件:ls

2. 进阶镜像

以上的镜像是不可以jar包中的项目运行的,因为镜像中没有jdk配置。

首先,需将本地的属于Linux的jdk和jre的压缩包拖到创建的文件夹中

如图:

 

以下我们来进行完善以上的缺陷: 

以下配置jdk,可以运行jar包项目

输入命令,编辑Dockerfile文件vim Dockerfile   ,将原来的编写全部删除。

删除:进入后先将输入键到第一行,再输入数字(输入的数字是看不到的如:12),再按两下 d ,就会删除12行已编写的内容,当然输入13或者14就删除13或者14行,可以根据自己想删除多少行来进行输入

将以下编写的内容粘贴到Dockerfile文件中,按Esc退出编辑模式,输入 :wq 保存编写内容并且退出文件。 

#1.指定基础镜像,并且必须是第一条指令
FROM  centos
#2.指明该镜像的作者和其电子邮件
MAINTAINER  CloudJun  "jun737x@163.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR  /test
#4.将文件从Docker主机将jdk及jar包复制到Docker镜像中,自动将jdk的压缩包进行解压
COPY  spring.jar /test
ADD  jdk-8u221-linux-x64.tar.gz  /test
#5.将jdk解压后配置环境变量
ENV JAVA_HOME=/test/jdk1.8.0_221
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#6.容器启动时,需要执行的命令(执行jar包)
CMD java -jar spring.jar

如图(粘贴进去后全部注释了,可以手动删除前面的#解除注释): 

创建镜像:docker build -t spring:v2 . 

再查看镜像:docker images

进入容器:docker run -it spring:v2      (这里会自动启动jar包)

已可以通过:docker run -itd spring:v2   (在后台运行)

再进入:docker exec -it 24696887b11eeb7ea229221e94f7b0cac03526551854319db80aef21b2d12ca4 bash

( 其中bash前面是运行后的编号,根据运行后的编号进入到该容器中)

查看jar及解压后的jdk,还可以输入命令查看jdk环境:echo $JAVA_HOME

以下配置jre,可以运行jar包项目及优化储存

输入命令,编辑Dockerfile文件vim Dockerfile   ,将原来的编写全部删除。

将以下编写的内容粘贴到Dockerfile文件中,按Esc退出编辑模式,输入 :wq 保存编写内容并且退出文件。 

#1.指定基础镜像,并且必须是第一条指令
FROM  centos
#2.指明该镜像的作者和其电子邮件
MAINTAINER  CloudJun  "jun737x@163.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR  /test
#4.将文件从Docker主机jre包复制到Docker镜像中,自动将jdk的压缩包进行解压
COPY  spring.jar /test
ADD  jre-8u391-linux-x64.tar.gz  /test
#5.将jre解压后配置环境变量
ENV JAVA_HOME=/test/jre1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#6.容器启动时,需要执行的命令(执行jar包)
CMD java -jar spring.jar

 

创建镜像:docker build -t spring:v3 .

再查看镜像:docker images

运行:docker run -itd spring:v3

虽然储存的减少可能很小,但是当需要量上来是时候也是节省了大量的储存空间的。

3. 完善镜像

需要将储存控制到很少可以使用这个镜像jeanblanchard/alpine-glibc,这个镜像所需的储存很少,而通过这个镜像自定义出来的镜像也会少很多。

首先需要下载这个镜像:docker pull jeanblanchard/alpine-glibc

再查看镜像的信息:docker images

可以看到所需的储存空间很少。

然后我们将指定的镜像修改为这个镜像将Dockerfile文件,再次镜像编辑为以下内容。

#1.指定基础镜像,并且必须是第一条指令
FROM  jeanblanchard/alpine-glibc
#2.指明该镜像的作者和其电子邮件
MAINTAINER  CloudJun  "jun737x@163.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR  /test
#4.将文件从Docker主机jre包复制到Docker镜像中,自动将jdk的压缩包进行解压
COPY  spring.jar /test
ADD  jre-8u391-linux-x64.tar.gz  /test
#5.将jre解压后配置环境变量
ENV JAVA_HOME=/test/jre1.8.0_391
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#6.容器启动时,需要执行的命令(执行jar包)
CMD java -jar spring.jar

创建镜像:docker build -t spring:v4 .

再查看镜像:docker images

现在这样的需要的储存空间就相对少了一半,更加的节省了资源空间。

现在映射端口运行:docker run -itd --name s1 -p 8080:8080 spring:v4

之后在主机浏览器中访问虚拟机IP的访问路径:

三、镜像上传仓库

首先需要在我们的阿里云账号中开启镜像仓库,点击用户左边的控制器,点击容器镜像服务ACR,点击实例列表,在其中点击创建个人版本的,企业版要米,创建后需要设置密码。

之后将以上的登入凭证复制粘贴到虚拟机中执行命令,前面的$不用复制进去,之后会镜像密码的输入,是自己设置的容器镜像服务密码,以下说明登入成功:

创建仓库:在实例列表中点击命名空间——>之后创建命名空间即可

如图:

之后创建一个仓库,仓库名称可以自己取

有其中的之后也可以绑定到账号中去,这里没有就可以选择本地仓库 

之后将需要上传推送到仓库的镜像取个别名,在将这个镜像绑定为阿里云的仓库,阿里云仓库在镜像仓库的第三部的将镜像推送到Registry中有命令。

第一个命令为登入,第二个命令为绑定阿里云仓库,第三个命令为上传推送到仓库

现在我们将虚拟机中共的镜像删除,删除后可以在次重阿里仓库中拉取下来。

删除:docker rmi 镜像名:v1   (v1版本号)

拉取下载命令:docker pull 仓库中的创建名称:v1    

每篇一获

学习并掌握在 Linux 中使用 Dockerfile 自定义镜像以及上传到阿里云仓库的技术,对您的技术能力和职业发展都有着重要的意义。

  1. 提升技术能力:Docker 是一种流行的容器化技术,它可以帮助您将应用及其依赖打包在一起,实现快速、一致的部署。通过学习和使用 Docker,您可以更深入地理解容器化技术,提升您的技术能力。同时,使用 Dockerfile 自定义镜像,可以让您更好地理解 Docker 镜像的构建过程,进一步提升您的 Docker 技术能力。

  2. 提高工作效率:使用 Dockerfile 自定义镜像,可以帮助您快速、一致地构建和部署应用。您只需要编写一次 Dockerfile,就可以在任何支持 Docker 的平台上重复使用,大大提高了您的工作效率。此外,通过将镜像上传到阿里云仓库,您可以方便地在不同的环境中共享和使用这些镜像,进一步提高您的工作效率。

  3. 扩大职业发展机会:掌握 Docker 和阿里云仓库的使用,可以扩大您的职业发展机会。Docker 和阿里云都是目前 IT 行业中非常热门的技术,掌握这些技术可以让您在求职市场上具有更大的竞争优势。

  4. 提升团队协作能力:通过使用阿里云仓库共享 Docker 镜像,您的团队可以更方便地共享和协作开发工作,提升团队的协作能力。

  5. 提高应用的可移植性:使用 Docker 可以提高应用的可移植性,使应用可以在不同的环境中一致地运行,降低了应用部署的复杂性。

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

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

相关文章

PPT文档怎么转换PDF?一个方法教你快速实现

在我们的办公、学习中难免会遇到需要将ppt转pdf文件的需求。现在的网络中有各种各样的PDF转换工具&#xff0c;有些操作很复杂&#xff0c;有些需要下载软件非常麻烦。接下来&#xff0c;给大家分享一款草最简单还不用下载软件的PPT转PDF&#xff08;https://www.yasuotu.com/p…

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(1)准备工作、部门管理

一、准备工作 1.明确需求 根据产品经理绘制的页面原型&#xff0c;对部门和员工进行相应的增删改查操作。 2.环境搭建 将使用相同配置的不同项目作为Module放入同一Project&#xff0c;以提高相同配置的复用性。 准备数据库表&#xff08;dept, emp&#xff09; 资料中包含…

C#基础-空处理

在c#中&#xff0c;值对象是没有办法赋值为null的。比如说&#xff0c;你想要定义一个布尔值&#xff0c;你的赋值数据要么得是true、要么就得是false&#xff0c;默认情况下我们永远没可能给这个布尔赋值为null&#xff0c;即使只是对这个变量进行声明而不初始化数据&#xff…

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点面试题 02.07. 链表相交、142.环形链表II

文档讲解&#xff1a;虚拟头节点&#xff0c;三指针&#xff0c;快慢指针&#xff0c;链表相交&#xff0c;环形链表&#xff0c; 技巧&#xff1a; 1、对于指针的操作要画图&#xff0c;明确步骤后好做了 2、使用虚拟头节点可以避免对头节点单独讨论&#xff0c;且方便对头节点…

详解CAS及ABA问题

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是 CAS 问题。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈️动动…

【工具栏】SequenceDiagram插件的使用(根据代码生成时序图)

1. 安装 2.使用 进入代码页面&#xff0c;点击鼠标右键 选择方法 根据方法中的代码生成时序图

【LangChain学习之旅】—(8) 输出解析:用OutputParser生成鲜花推荐列表

【LangChain学习之旅】—&#xff08;8&#xff09; 输出解析&#xff1a;用OutputParser生成鲜花推荐列表 LangChain 中的输出解析器Pydantic&#xff08;JSON&#xff09;解析器实战第一步&#xff1a;创建模型实例第二步&#xff1a;定义输出数据的格式第三步&#xff1a;创…

AI-数学-高中-4.函数表达式特性-要变一起变

求f(x):换元法&#xff1a;左边代换时&#xff0c;右边也要同时替换&#xff0c;原作者视频&#xff1a;函数】1引导课&#xff1a;高中为什么用f(x)_哔哩哔哩_bilibili 1.什么是函数&#xff1a;给定任意一个x&#xff0c;都有唯一确定的y与之对应&#xff0c;这种x与y的关系就…

猫头虎分享:探索TypeScript的世界 — TS基础入门 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

UML-类图和类图转化为代码

提示&#xff1a;文章详细的讲解了类图的四种关系&#xff0c;以及每种关系如何转化为对应的代码。 UML-类图和类图转化为代码 一、类于类之间的关系1.依赖关系2.关联关系(1) 单向关联(2) 双向关联(3) 自关联(4) 聚合关联(has-a)(5) 组合关联&#xff08;contains-a&#xff09…

当浏览器输入url的时候会发生什么?

说在前面 当我们在浏览器中输入URL并按下回车时&#xff0c;背后发生了一系列神秘的操作。本文将带您深入了解&#xff0c;从URL解析到页面渲染&#xff0c;揭秘浏览器输入URL的完整流程。 具体步骤 当浏览器输入URL时&#xff0c;一般经过以下细节步骤&#xff1a; 1、引言 …

【GDAL】Windows下VS+GDAL开发环境搭建

Step.0 环境说明&#xff08;vs版本&#xff0c;CMake版本&#xff09; 本地的IDE环境是vs2022&#xff0c;安装的CMake版本是3.25.1。 Step.1 下载GDAL和依赖的组件 编译gdal之前需要安装gdal依赖的组件&#xff0c;gdal所依赖的组件可以在官网文档找到&#xff0c;可以根据…

【学习心得】Git深入学习

若您还未安装Git或是只想简单使用&#xff0c;可以先看看我的文章“Git快速上手”http://t.csdnimg.cn/gsaGj 一、深入学习Git必须熟悉两个概念 &#xff08;1&#xff09;【四个区】Git本地有三个区&#xff0c;远程仓库也可以看出成一个区域 工作区、暂存区、本地仓库、远…

AI教我学编程之C#变量及实例演示

前言 在AI教我学编程之AI自刀 这篇文章中&#xff0c;我们知道了变量的基础类型&#xff0c;那么变量在C#中有什么作用呢&#xff1f;我们一起来看看吧&#xff01; 目录 重点先知 变量 变量类型 实例演示 变量声明 实例演示 提出疑问 初始化变量 自动初始化 多变量声明 实…

关于浏览器缓存的一些坑记录

1.js强制刷新浏览器缓存 网络上一搜基本都说用location.reload(true)可以强制刷新缓存&#xff0c;但是没人讲这个方法只准对火狐浏览器生效,火狐浏览器的确可以实现强制刷新并每次请求都是新的没有走缓存&#xff1b;chrome依然是走200 状态 缓存。 MDN解析&#xff1a; 2.m…

Python教程(23)——Python类中常用的特殊成员

在Python中&#xff0c;类特殊成员是指以双下划线开头和结尾的属性和方法&#xff0c;也被称为魔术方法&#xff08;Magic methods&#xff09;或特殊方法&#xff08;Special methods&#xff09;。这些特殊成员在类的定义中具有特殊的语法和功能&#xff0c;用于实现对象的特…

【python入门】day26: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

学习回顾总结

简述 哈喽大家好&#xff0c;记得上一次发文是在2020年的8月&#xff0c;当时是在西工大的长安校区做实验&#xff0c;在那里写了上一篇博客基于STM32f103ZET6单片机按键控制电机正反转&#xff08;带PWM调速&#xff09;。时间过得飞快&#xff0c;现在是2024年的1月&#xff…

【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位

【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位 在实际开发中 有时候会遇到复位状态不同 导致结果不同的情况 比如在上电复位时 电压不稳定 可能导致一些外部芯片无法正常工作 从而导致进行了错误的操作流程 所以 可以在程序运行后 加一个复位状态判断 用来检测是否正常复…

【代码随想录04】24. 两两交换链表中的节点 19. 删除链表的倒数第 N 个结点 面试题 02.07. 链表相交 142. 环形链表 II

24. 两两交换链表中的节点 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 做题思路 可以设置虚拟头结点cur和画图…