Docker 项目如何使用 Dockerfile 构建镜像

1、Docker 和 Dockerfile 的重要性

1.1、Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。

1.2、Dockerfile 的作用:解释 Dockerfile 是如何帮助自动化 Docker 镜像构建过程的,以及它在确保环境一致性和部署自动化中的关键角色。强调 Dockerfile 的重要性不仅仅在于技术层面,还在于它为团队协作和DevOps实践提供支持。

2、Docker 基础

2.1、Docker 架构简介:详细介绍 Docker 的关键组成部分,包括 Docker 引擎、镜像、容器和仓库,以及它们如何协同工作。

2.2、安装和设置 Docker 环境:提供在不同操作系统(如 Windows、macOS 和 Linux)上安装 Docker 的指南,并说明如何配置 Docker 环境以准备构建和运行容器。

2.3、Docker 命令基础:介绍最常用的 Docker 命令,如拉取镜像、运行容器、查看容器状态等,为读者提供实操的基础。

3、Dockerfile 深入理解

3.1、Dockerfile 是什么:定义 Dockerfile 并解释其用途,即如何使用它来描述和自动化构建 Docker 镜像的过程。

3.2、Dockerfile 语法详解:深入讲解 Dockerfile 的语法,包括各种指令和它们的用途,如何正确编写 Dockerfile 以及如何避免常见错误。

3.3、常用指令介绍:详细介绍 Dockerfile 中的关键指令,如 FROM(指定基础镜像)、RUN(执行命令)、CMD(设置容器默认执行命令)、LABEL(添加元数据)等,以及它们的使用场景和最佳实践。

4、编写你的第一个 Dockerfile

4.1、选择基础镜像

基础镜像是构建你的 Docker 镜像的起点。它可以是任何已存在的镜像,包括轻量级的像 Alpine 或者更全面的像 Ubuntu。选择基础镜像时,需要考虑的是镜像的大小、安全性、兼容性和维护频率。

例如,如果你打算构建一个运行 Java 应用程序的镜像,你可能会从一个带有预安装 JDK 的官方 Java 镜像开始。

示例代码

# 使用官方 Java 11 JDK 镜像作为基础镜像
FROM openjdk:11-jdk

4.2、编写 Dockerfile:步骤和最佳实践

接下来,我们将通过一些基本指令来编写 Dockerfile。

示例代码

# 使用官方 Java 11 JDK 镜像作为基础镜像
FROM openjdk:11-jdk# 设置环境变量,例如时区
ENV TZ=Asia/Shanghai# 设置工作目录,这是容器内部的文件路径
WORKDIR /app# 将本地项目文件复制到容器内的 /app 目录下
COPY . /app# 编译 Java 项目(假设是 Maven 项目)
RUN mvn clean package -DskipTests# 指定容器启动时运行的命令
CMD ["java", "-jar", "target/myapp.jar"]

逐行注释:

FROM openjdk:11-jdk:选择基础镜像。

ENV TZ=Asia/Shanghai:设置容器的环境变量,这里设置时区为上海时间。

WORKDIR /app:指定容器内的工作目录。后续的指令都会在这个目录下执行。

COPY . /app:将当前目录下的文件复制到容器的 /app 目录。

RUN mvn clean package -DskipTests:运行 Maven 命令来构建 Java 项目,这里跳过了测试。

CMD ["java", "-jar", "target/myapp.jar"] :指定容器启动时执行的命令,这里是运行编译后的 Java 应用。

4.3、构建过程详解

现在,让我们通过命令行来构建这个 Docker 镜像。

首先,确保你的 Docker 环境已经安装并运行。然后,在包含 Dockerfile 的目录下执行以下命令:

docker build -t my-java-app .

逐行解释:

docker build:这是 Docker 用来构建镜像的命令。

-t my-java-app:这个标志用于标记你的镜像,并给它一个名字,这里叫做 my-java-app

. :这指示 Docker 使用当前目录下的 Dockerfile。

构建过程中,Docker 会按照 Dockerfile 的指令逐步构建镜像。每个指令都会创建一个新的镜像层,并缓存以便重用。

完成后,你可以通过运行 docker images 命令来查看新构建的镜像。

这样,你就完成了你的第一个 Dockerfile 的编写和构建过程。

5、高级 Dockerfile 技巧

5.1、多阶段构建:优化镜像大小和构建时间

多阶段构建允许你在一个 Dockerfile 中使用多个 FROM 指令,每个阶段都可以使用不同的基础镜像,并从前一个阶段中复制所需的文件,这样可以显著减少最终镜像的大小。

示例代码

# 第一阶段:使用 Maven 镜像作为基础来构建 Java 项目
FROM maven:3.6.3-jdk-11 AS build
WORKDIR /app
COPY . /app
RUN mvn clean package -DskipTests# 第二阶段:使用 Java 运行时镜像
FROM openjdk:11-jre
WORKDIR /app
# 从构建阶段复制编译后的 jar 文件到这个新镜像中
COPY --from=build /app/target/myapp.jar /app/
CMD ["java", "-jar", "myapp.jar"]

逐行注释:

FROM maven:3.6.3-jdk-11 AS build:第一阶段,使用 Maven 镜像来构建 Java 项目。

WORKDIR /app 和 COPY . /app:设置工作目录并复制项目文件。

RUN mvn clean package -DskipTests:执行 Maven 命令构建项目。

FROM openjdk:11-jre:第二阶段,使用 Java 运行时镜像。

COPY --from=build /app/target/myapp.jar /app/ :从第一阶段复制构建好的 jar 文件。

CMD ["java", "-jar", "myapp.jar"] :设置容器启动时运行的命令。

5.2、使用 ARG 和 ENV 管理变量

ARG 和 ENV 指令用于设置环境变量。ARG 在构建过程中有效,而 ENV 则是在容器运行时有效。

示例代码

# 使用 ARG 设置构建阶段的变量
ARG VERSION=1.0FROM openjdk:11-jre
# 使用 ENV 设置容器运行时的环境变量
ENV APP_VERSION=${VERSION}WORKDIR /app
COPY ./target/myapp-${APP_VERSION}.jar /app/myapp.jar
CMD ["java", "-jar", "myapp.jar"]

逐行注释:

ARG VERSION=1.0:定义一个名为 VERSION 的构建参数,并设置默认值为 1.0。

FROM openjdk:11-jre:选择基础镜像。

ENV APP_VERSION=${VERSION} :设置环境变量 APP_VERSION,其值来自 ARG 定义的 VERSION。

WORKDIR /app:指定工作目录。

COPY ./target/myapp-${APP_VERSION}.jar /app/myapp.jar:复制构建好的 jar 文件到镜像中,文件名包含版本号。

CMD ["java", "-jar", "myapp.jar"] :指定容器启动时的默认命令。

5.3、添加健康检查:HEALTHCHECK 指令

HEALTHCHECK 指令允许你告诉 Docker 如何测试一个容器来检查它是否仍在正常运行。这在自动化管理容器时非常有用。

示例代码

FROM openjdk:11-jre
WORKDIR /app
COPY ./target/myapp.jar /app/# 设置健康检查指令
HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -f http://localhost:8080/health || exit 1CMD ["java", "-jar", "myapp.jar"]

逐行注释:

FROM openjdk:11-jre:选择基础镜像。

WORKDIR /app 和 COPY ./target/myapp.jar /app/ :设置工作目录并复制 jar 文件到镜像。

HEALTHCHECK --interval=30s --timeout=30s --retries=3 CMD curl -f http://localhost:8080/health || exit 1:定义健康检查指令,每30秒检查一次,超时时间也是30秒,重试3次。使用 curl 命令来检查应用的 /health 端点。

CMD ["java", "-jar", "myapp.jar"] :指定容器启动时运行的命令。

通过这些高级技巧,你的 Dockerfile 不仅会更高效,也会更适合生产环境的要求

6、Dockerfile 调试和优化

6.1、调试 Dockerfile:常见问题和解决方案

调试 Dockerfile 时可能遇到的一些常见问题包括构建错误、运行时错误和性能问题。以下是一些解决这些问题的策略。

示例代码

# 示例 Dockerfile
FROM python:3.8# 安装依赖
RUN pip install flask# 拷贝应用代码
COPY . /app# 设置工作目录
WORKDIR /app# 设置暴露端口
EXPOSE 5000# 运行应用
CMD ["python", "app.py"]

逐行注释:

FROM python:3.8:选择基础镜像。

RUN pip install flask:安装 Flask,如果此处出错,检查网络连接或镜像源。

COPY . /app:将当前目录下的文件复制到镜像的 /app 目录。

WORKDIR /app:设置工作目录。

EXPOSE 5000:暴露端口,对应 Flask 应用的默认端口。

CMD ["python", "app.py"] :设置容器启动时执行的命令。

6.2、性能优化:减少层和缓存利用

Dockerfile 中的每条指令都会创建一个新的层,合理减少层数可以优化镜像的大小和构建时间。

示例代码

FROM python:3.8# 合并 RUN 指令来减少层数
RUN apt-get update && apt-get install -y git \&& pip install flaskCOPY . /appWORKDIR /appEXPOSE 5000CMD ["python", "app.py"]

逐行注释:

RUN apt-get update && apt-get install -y git && pip install flask:合并命令,以减少层数并利用 Docker 的层缓存机制。

6.3、安全最佳实践

在编写 Dockerfile 时考虑安全性是非常重要的。

示例代码

FROM python:3.8# 以非 root 用户运行
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuserCOPY --chown=appuser:appuser . /appWORKDIR /appEXPOSE 5000CMD ["python", "app.py"]

逐行注释:

RUN groupadd -r appuser && useradd -r -g appuser appuser:创建一个新的

用户 appuser 和用户组 appuser,以提高安全性。

USER appuser:指定接下来的指令应该以 appuser 用户身份运行。

COPY --chown=appuser:appuser . /app:将当前目录下的文件复制到镜像的 /app 目录,并将文件的所有权更改为 appuser

WORKDIR /app:设置工作目录。

EXPOSE 5000:暴露端口 5000。

CMD ["python", "app.py"] :设置容器启动时执行的命令。

通过遵循这些调试和优化策略,你可以提高 Dockerfile 的效率和安全性。调试时,注意观察错误信息以便快速定位问题。在优化方面,合理地合并指令和使用非 root 用户运行容器是关键

7、使用 Dockerfile 构建实际项目

为了更好地理解 Dockerfile 的应用,我们将通过一个具体的项目案例来展示如何使用 Dockerfile 构建、测试和部署一个应用。

7.1、项目案例简介

假设我们有一个简单的 Node.js Express 应用,它提供一个基础的 web 服务。项目结构如下:

app.js:Express 应用的主文件。

package.json:定义项目依赖。

views/ :存放视图文件的目录。

public/ :存放静态文件的目录。

7.2、逐步构建项目的 Dockerfile

示例代码

# 使用 Node.js 官方镜像作为基础镜像
FROM node:14# 创建并设置应用的工作目录
WORKDIR /usr/src/app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装项目依赖
RUN npm install# 复制应用源代码到工作目录
COPY . .# 暴露 3000 端口
EXPOSE 3000# 定义运行应用的命令
CMD ["node", "app.js"]

逐行注释:

  • FROM node:14:以 Node.js 14 的官方镜像为基础。

  • WORKDIR /usr/src/app:设置容器内的工作目录。

  • COPY package.json ./* :复制 package.json 和 package-lock.json 到工作目录。

  • RUN npm install:安装项目依赖。

  • COPY . . :复制剩余的项目文件到工作目录。

  • EXPOSE 3000:暴露 3000 端口,Node.js 应用默认的监听端口。

  • CMD ["node", "app.js"] :容器启动时运行的命令。

7.3、测试和部署

测试:

  1. 构建镜像:在 Dockerfile 所在的目录运行 docker build -t my-node-app . 。

  2. 运行容器:执行 docker run -p 3000:3000 my-node-app,将容器的 3000 端口映射到主机的 3000 端口。

  3. 访问应用:在浏览器中访问 http://localhost:3000 查看应用是否正常运行。

部署:

  1. 将构建好的镜像推送到 Docker Hub 或其他容器镜像仓库。

  2. 在生产环境的服务器上,从仓库拉取镜像并运行。

例如,推送到 Docker Hub:

docker tag my-node-app yourusername/my-node-app
docker push yourusername/my-node-app

在生产服务器上运行:

docker pull yourusername/my-node-app
docker run -p

3000:3000 yourusername/my-node-app

逐行注释:

docker tag my-node-app yourusername/my-node-app:给构建的镜像添加标签,以便推送到 Docker Hub。

docker push yourusername/my-node-app:将镜像推送到 Docker Hub。

docker pull yourusername/my-node-app:在生产服务器上从 Docker Hub 拉取镜像。

docker run -p 3000:3000 yourusername/my-node-app:在生产环境运行容器,并映射端口。

通过这样的流程,你可以将一个 Node.js 应用容器化,并进行测试和部署。使用 Dockerfile 的好处在于,你可以确保应用在开发、测试和生产环境中的一致性。这简化了部署过程并减少了与环境相关的问题。

8、Dockerfile 在 DevOps 中的应用

Dockerfile 在 DevOps 实践中扮演着重要角色,特别是在持续集成(CI)、持续部署(CD)和微服务架构中。

8.1、Dockerfile 与持续集成(CI)

在持续集成流程中,Dockerfile 能确保应用在各种环境中的一致性和可重复性。Dockerfile 用于构建 Docker 镜像,这些镜像可以在 CI 系统中被用来运行自动化测试和其他质量保证步骤。

示例:集成到 Jenkins

假设有一个 Jenkins pipeline,用于构建和测试 Node.js 应用。

pipeline {agent anystages {stage('Build') {steps {script {docker.build("my-node-app")}}}stage('Test') {steps {script {docker.image("my-node-app").inside {sh 'npm test'}}}}}
}

逐行注释:

pipeline { ... } :定义 Jenkins pipeline。

agent any:在任何可用的 agent 上运行。

stage('Build') { ... } :定义构建阶段。

docker.build("my-node-app") :使用 Dockerfile 构建镜像。

stage('Test') { ... } :定义测试阶段。

docker.image("my-node-app").inside { ... } :在构建的 Docker 容器内运行命令。

sh 'npm test' :运行 npm 测试。

8.2、Dockerfile 在持续部署(CD)中的作用

在持续部署环境中,Dockerfile 提供了一种方便的方式来封装应用和其依赖,确保在不同环境中的一致运行。通过自动化部署 Docker 镜像,可以减少部署过程中的人为错误。

示例:使用 Docker 镜像进行部署

假设你使用 Kubernetes 作为部署环境,以下是一个简单的部署配置示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-node-app
spec:replicas: 3selector:matchLabels:app: my-node-apptemplate:metadata:labels:app: my-node-appspec:containers:- name: my-node-appimage: yourusername/my-node-appports:- containerPort: 3000

逐行注释:

apiVersion: apps/v1:指定 Kubernetes API 版本。

kind: Deployment:定义一个部署对象。

metadata: { name: my-node-app } :设置部署的名称。

spec: { replicas: 3 ... } :定义三个副本。

containers: - name: my-node-app:定义使用的容器。

image: yourusername/my-node-app:指定从 Docker Hub 拉取的镜像。

containerPort: 3000:暴露容器的端口。

8.3、Docker

file 和微服务架构在微服务架构中,每个服务通常是独立部署和扩展的。Dockerfile 在这种环境中提供了一个标准化的方法来封装各个微服务,确保它们在不同环境下运行一致。

示例:构建微服务的 Dockerfile

假设你有一个 Python 编写的微服务,以下是它的 Dockerfile 示例:

# 使用 Python 官方镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /usr/src/app# 安装 Python 依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt# 复制源代码
COPY . .# 暴露服务端口
EXPOSE 5000# 运行服务
CMD ["python", "./my_service.py"]

逐行注释:

FROM python:3.8-slim:选择基础镜像。

WORKDIR /usr/src/app:设置工作目录。

COPY requirements.txt ./ :复制依赖文件。

RUN pip install --no-cache-dir -r requirements.txt:安装依赖。

COPY . . :复制源代码到工作目录。

EXPOSE 5000:暴露 5000 端口。

CMD ["python", "./my_service.py"] :容器启动时运行的命令。

每个微服务都可以有类似的 Dockerfile,确保它们可以在任何 Docker 环境中一致运行。这样,不同的服务可以被独立开发、测试、部署和扩展,从而充分发挥微服务架构的优势。

通过将 Docker 和 Dockerfile 集成到 DevOps 流程中,可以大大提升软件开发、测试、部署的效率和可靠性。

总结 Dockerfile 的最佳实践和未来趋势

1、Dockerfile 最佳实践

1.1、保持镜像尽可能小:选择合适的基础镜像,例如 Alpine Linux,因为它非常小巧。在构建过程中,只安装必要的包和依赖。

1.2、使用多阶段构建:多阶段构建可以帮助减小最终镜像的大小,通过在一个阶段构建应用,然后在另一个阶段只复制必要的文件。

1.3、避免安装不必要的软件包:只安装运行应用所必需的软件包,减少安全漏洞的风险。

1.4、使用 .dockerignore 文件:类似 .gitignore,可以避免不必要的文件被复制到镜像中。

1.5、利用构建缓存:合理安排 Dockerfile 指令顺序,使得频繁变动的层放在后面,以利用 Docker 的构建缓存。

1.6、安全性:尽可能使用非 root 用户运行应用,减少安全风险。

1.7、明确标记:使用 LABEL 指令为镜像添加元数据,比如维护者信息、版本号等。

2、Dockerfile 未来趋势

2.1、与云原生技术的整合:随着云原生技术的发展,Docker 和 Kubernetes 将更加紧密地协同工作,Dockerfile 在构建云原生应用中将发挥更大的作用。

2.2、安全性关注增加:随着安全意识的提高,未来 Dockerfile 的编写将更加注重安全性,比如通过更安全的基础镜像和更严格的安全扫描。

2.3、自动化和智能化:可能会出现更多工具来自动化生成和优化 Dockerfile,甚至在某些情况下,AI 可能参与 Dockerfile 的生成和优化过程。

2.4、更紧密的 DevOps 集成:Dockerfile 的设计和应用将更加贴近 DevOps 流程,特别是在持续集成和持续部署方面,它将成为自动化管道的核心组件。

2.5、可复用性和模块化:随着容器化技术的成熟,Dockerfile 的可复用性和模块化将越来越受到重视。我们可能会看到更多针对特定应用或服务的预制 Dockerfile 模板。

2.6、性能优化:Dockerfile 的未来版本可能会集成更多性能优化的特性,比如更高效的层压缩和缓存机制,以减少构建和部署时间。

通过遵循这些最佳实践并关注未来的趋势,你可以更有效地利用 Dockerfile 来构建、测试和部署你的应用。Dockerfile 不仅是一个工具,它还代表了一种思维方式,即如何更好地在不同环境中一致地部署和管理应用。随着技术的不断进步,Dockerfile 和容器技术将继续演化,为软件开发和部署带来更多的便利和创新。

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

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

相关文章

线性回归实例

1、线性回归(linear Regression)和逻辑回归(logistic Regression)的区别 线性回归主要是用来拟合数据,逻辑回归主要是用来区分数据,找到决策边界。 线性回归的代价函数常用平方误差函数,逻辑回…

AI在保护环境、应对气候变化中的作用

对于AI生命周期数据领域的全球领导者而言,暂时搁置我们惯常的AI见解和AI生命周期数据内容产出,来认识诸如世界地球日这样的自然环境类活动日,似乎是个奇怪的事情。我们想要知道,数据是否真的会影响我们的地球环境? 简而…

5.5G来了!全球首次采用,就在福建

近日,在以滨海风景优美而闻名的福建厦门马拉松赛道沿线区域,福建移动携手华为采用5G-A通感一体技术率先完成了低空多站连续组网的通感能力验证,基于4.9GHz频段实现了对城市低空120米下多无人驾驶飞行器的探测与及时预警。这一成果为城市低空资…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后,之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git ?大神给出解决方案 手动添加Git Bash Here到右键菜单(超详细) 安装路径:我老的 ? vs的gi…

Kafka系列(四)

本文接kafka三,代码实践kafkaStream的应用,用来完成流式计算。 kafkastream 关于流式计算也就是实时处理,无时间概念边界的处理一些数据。想要更有性价比地和java程序进行结合,因此了解了kafka。但是本人阅读了kafka地官网&#…

论文笔记:信息融合的门控多模态单元(GMU)

整理了GMU(ICLR2017 GATED MULTIMODAL UNITS FOR INFORMATION FUSION)论文的阅读笔记 背景模型实验 论文地址: GMU 背景 多模态指的是同一个现实世界的概念可以用不同的视图或数据类型来描述。比如维基百科有时会用音频的混合来描述一个名人…

vue+echarts 几个案例

普通柱状图 <template><!-- 容器默认宽高是0 如果不设置 页面不显示--><div ref"mychart" id"mychart"></div> </template><script> import * as echarts from "echarts" import axios from axiosexport …

(Matlab)基于CNN-Bi_LSTM的多维回归预测(卷积神经网络-双向长短期记忆网络)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整程序数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平…

数字电源简介

数字电源简介 定义主要应用场景数字电源的基本组成常见算法常见电源拓扑PFCLLC 数字电源与模拟电源对比参考链接 定义 常见定义有以下四种&#xff1a; 通过数字接口控制的开关电源&#xff0c;强调的是数字电源的“通信”功能。可通过I2C或类似的数字总线来对数字信号进行控…

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…

九:day01_ 消息队列01

第一章 RabbitMQ 概念 1.1.1 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 1.1.2 消息 两台计算机间传送的数据单位。消息可以非常简单&#xff0c;例如只包含文本字符串&#x…

【目标检测】YOLOv5算法实现(九):模型预测

本系列文章记录本人硕士阶段YOLO系列目标检测算法自学及其代码实现的过程。其中算法具体实现借鉴于ultralytics YOLO源码Github&#xff0c;删减了源码中部分内容&#xff0c;满足个人科研需求。   本系列文章主要以YOLOv5为例完成算法的实现&#xff0c;后续修改、增加相关模…

深入解析JavaScript属性的getter和setter

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在JavaScript中,对象属性除了直接设置值之外,还可以通过getter和sett…

鸿蒙OS4.0兼容性测试

背景 OpenHarmony兼容性测评主要是验证合作伙伴的设备和业务应用满足OpenHarmony开源兼容性定义的技术要求&#xff0c;确保运行在OpenHarmony上的设备和业务应用能稳定、正常运行&#xff0c;同时使用OpenHarmony的设备和业务应用有一致性的接口和业务体验。 OpenHarmony兼容…

MongoDB调优

三大导致 MongoDB 性能不佳的原因 1&#xff09;慢查询2&#xff09;阻塞等待3&#xff09;硬件资源不足1,2通常是因为模型/索引设计不佳导致的。排查思路&#xff1a;按1-2-3依次排查。 影响 MongoDB 性能的因素 MongoDB 性能监控工具 Free Monitoring 从版本 4.0 开始&am…

redis经典面试题

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库&#xff0c;也是一种NoSQL数据库。 它支持多种数据类型&#xff0c;包括String、Map、Set、ZSet和List&#xff0c;以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础&#xff0c;提…

Python爬虫实战:IP代理池助你突破限制,高效采集数据

当今互联网环境中&#xff0c;为了应对反爬虫、匿名访问或绕过某些地域限制等需求&#xff0c;IP代理池成为了一种常用的解决方案。IP代理池是一个包含多个可用代理IP地址的集合&#xff0c;可以通过该代理池随机选择可用IP地址来进行网络请求。 IP代理池是一组可用的代理IP地址…

网页设计(十一)JavaScript事件分析

一、设计校园办公系统认证页面 校园办公系统认证页面 校园办公系统认证页面初始布局 卡号有效性检查页面 口令有效性检查页面 二次口令有效性检查页面 QQ/微信有效性检查图 <!-- prj_11_1.html --> <!doctype html> <html lang"en"><…

Java设计模式-迭代器模式

迭代器模式 一、概述二、结构三、案例实现四、优缺点五、使用场景六、JDK源码解析 一、概述 定义&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 二、结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xf…

postman做接口测试

之前搞自动化接口测试&#xff0c;由于接口的特性&#xff0c;要验证接口返回xml中的数据&#xff0c;所以没找到合适的轮子&#xff0c;就自己用requests造了个轮子&#xff0c;用着也还行&#xff0c;不过就是case管理有些麻烦&#xff0c;近几天又回头看了看postman也可以玩…