【CS.SE】端午节特辑:Docker容器化技术详解与实战

端午节, 先祝愿大家端午安康,阖家幸福, 哈哈!这篇讲下Docker这一现代软件开发中不可或缺的技术。软件工程涉及软件开发的整个生命周期,包括需求分析、设计、构建、测试、部署和维护。Docker作为一种容器化技术,直接关联到软件部署、环境一致性保证、持续集成/持续部署(CI/CD)等软件工程领域的关键实践。在这个部分,将会探讨Docker如何改进开发流程、简化部署步骤、保证环境一致性,并支持微服务架构等现代软件工程实践。

文章目录

    • 1 Docker基本概念(容器、镜像、仓库)
      • 1.1 容器
      • 1.2 镜像
      • 1.3 仓库
      • 1.4 Docker架构图
    • 2 使用Docker构建、运行和管理容器 🔥
      • 2.1 构建容器
      • 2.2 运行容器
      • 2.3 管理容器
      • 2.4 Docker操作流程图
    • 3 Docker与开发流程集成(DevOps实践)
      • 3.1 容器化的开发环境
      • 3.2 持续集成/持续部署(CI/CD)
      • 3.2 微服务架构
      • 3.3 配置管理
      • 3.4 日志和监控
      • 3.5 开发流程的优化
    • 4 Docker在微服务架构中的应用
      • 4.1 微服务架构概述
      • 4.2 Docker与微服务架构的契合
      • 4.3 Docker在微服务架构中的应用实践
    • 5 Docker与云计算(AWS、Azure、GCP)
    • 6 案例研究和最佳实践
      • 6.1 Github项目用docker来体验 🔥
        • 6.1.1 创建Dockerfile
        • 6.1.2 构建镜像
        • 6.1.3 启动容器
      • 6.2 [使用docker pull confluentinc/cp-kafka 的全面指南](https://blog.csdn.net/Charlie_Lee_CS/article/details/139550070)
    • 7 总结
    • References

在这里插入图片描述

1 Docker基本概念(容器、镜像、仓库)

1.1 容器

  • 定义:容器是一种轻量级、可执行的软件包,包含运行某个应用程序所需的所有内容——代码、运行时环境、库、环境变量和配置文件。
  • 特点:与虚拟机相比,容器直接运行在操作系统的内核上,没有自己的操作系统,启动快,资源占用少。
  • 生命周期:可通过docker run创建和启动,docker stop停止,docker start重新启动,docker rm删除。

1.2 镜像

  • 定义:镜像是构建Docker容器的蓝本,包含运行容器所需的代码、库、环境变量、配置文件等。
  • 特点:镜像是只读的,当容器启动时,Docker会在镜像的顶部添加一个可写层。
  • 操作:可通过docker build创建,通过docker pull从仓库拉取,通过docker push推送到仓库。

1.3 仓库

  • 定义:仓库是集中存储和分发镜像的地方。
  • 类型:有公共仓库(如Docker Hub)和私有仓库。
  • 用途:允许用户上传和下载镜像,便于版本控制和共享。

1.4 Docker架构图

Docker Engine
CLI/REST API
pull/push
Image Layers
Custom Images
Docker Daemon
Client
Containerd
runc
Buildkit
Registry
Docker Hub
Private Registry
Network Management
Volume Management
Image Management
Base Images
Application Images

通过这个架构图,我们可以清晰地看到Docker是如何通过各个组件协同工作来实现容器化技术的。Docker Client发送命令到Docker Daemon,Daemon则通过Containerd和runc管理容器的生命周期,同时通过Buildkit构建镜像,并与Registry交互存储和分发镜像。网络管理、卷管理和镜像管理等功能确保了容器的正常运行和资源管理。

2 使用Docker构建、运行和管理容器 🔥

2.1 构建容器

  • Dockerfile:使用Dockerfile定义创建镜像的步骤,包括设置环境变量、安装软件、复制代码等。
  • 构建命令:使用docker build -t <tag> .命令根据Dockerfile构建镜像,<tag>是自定义的镜像标签。
  • 日志: 在运行docker build命令时,你可以添加--progress=plain来获得更详细的输出,这有助于发现问题。

2.2 运行容器

  • 启动容器:使用docker run命令从镜像启动新容器。常用参数包括-d(后台运行)、-p(端口映射)、-v(卷挂载)、--name(命名容器)等。
  • 交互模式:使用docker run -it进入容器的交互模式,通常用于调试。
参数含义使用示例
-p <host-port>:<container-port>将容器内的端口映射到宿主机的端口。-p 2222:22 映射容器的22端口到宿主机的2222端口
-v <host-path>:<container-path>将宿主机的目录挂载到容器内的指定路径。-v /path/on/host:/workspace 挂载宿主机的/path/on/host目录到容器的/workspace
--name <name>为容器指定一个名称。--name mycontainer 给容器指定名称mycontainer
-d以后台模式运行容器。-d 启动容器并使其在后台运行
--rm容器退出时自动清理容器文件系统。--rm 容器退出后自动删除
-e <key>=<value>设置环境变量。-e MY_VAR=myvalue 在容器内设置环境变量MY_VAR
--env-file <file>从文件中读取环境变量。--env-file ./env.listenv.list文件读取环境变量
--network <network>连接容器到指定的网络。--network my-net 将容器连接到my-net网络
--link <container>将容器链接到另一个容器。--link db:db 将当前容器与名为db的容器链接
--expose <port>暴露容器的端口或一系列端口。--expose 80 暴露容器的80端口
-it启动一个交互式的容器,通常与/bin/bash一起使用。-it ubuntu /bin/bash 启动一个Ubuntu容器并进入bash交互模式
--entrypoint <cmd>覆盖容器启动后默认执行的命令。--entrypoint /bin/bash 覆盖默认的entrypoint为/bin/bash

2.3 管理容器

  • 查看容器:使用docker ps(正在运行的容器)和docker ps -a(所有容器)查看容器。
  • 停止容器:使用docker stop <container-id/name>停止运行中的容器。
  • 启动容器:使用docker start <container-id/name>启动已停止的容器。
  • 删除容器:使用docker rm <container-id/name>删除容器。如果容器正在运行,需要先停止容器。

2.4 Docker操作流程图

在使用Docker进行开发和部署时,理解其操作流程至关重要。以下是Docker操作的主要步骤,通过一个示意图详细描述了从编写Dockerfile到运行容器的全过程。

Developer Dockerfile Docker CLI Docker Daemon Docker Registry Docker Container Write Dockerfile docker build -t myapp . Send build request Parse Dockerfile Build Image Layer by Layer Image Built Successfully docker run -d -p 80:80 myapp Send run request Pull Image if not locally available Image layers Create and Start Container Running Container Running Container Running and accessible Developer Dockerfile Docker CLI Docker Daemon Docker Registry Docker Container

通过上面的流程图,我们可以看到:

  1. 开发者编写Dockerfile:开发者首先编写Dockerfile,定义镜像构建所需的步骤和依赖。
  2. 构建镜像:开发者使用docker build -t myapp .命令来构建镜像。Docker CLI将构建请求发送给Docker Daemon。
  3. 解析Dockerfile:Docker Daemon解析Dockerfile,逐层构建镜像。
  4. 镜像构建完成:镜像构建成功后,Docker Daemon通知Docker CLI。
  5. 运行容器:开发者使用docker run -d -p 80:80 myapp命令运行容器。Docker CLI将运行请求发送给Docker Daemon。
  6. 拉取镜像:如果镜像在本地不存在,Docker Daemon会从Registry中拉取镜像。
  7. 创建和启动容器:Docker Daemon创建并启动容器。
  8. 容器运行:容器开始运行,并将状态反馈给Docker CLI。
  9. 开发者访问容器:开发者可以通过映射的端口访问正在运行的容器。

3 Docker与开发流程集成(DevOps实践)

3.1 容器化的开发环境

  • 一致性:Docker确保开发、测试、生产环境的一致性,减少了“在我的机器上能运行”的问题。
  • 可重复性:通过使用Docker镜像,开发环境可以快速、可重复地被创建和销毁。

3.2 持续集成/持续部署(CI/CD)

  • 自动化构建:在代码提交后,使用Docker自动化构建应用和运行测试。
  • 自动化部署:在构建成功后,自动化将应用部署到测试或生产环境。使用Docker标签管理不同的版本,确保部署的可追溯性。

3.2 微服务架构

  • 独立部署:在微服务架构中,每个服务可以被封装在独立的容器中,使得各服务独立部署和扩展。
  • 服务隔离:Docker提供的网络和存储隔离,确保了服务之间的安全和数据隔离。

3.3 配置管理

  • 环境变量:使用Docker,可以通过环境变量将配置传递给应用,无需改动代码。
  • 配置文件:可以通过挂载卷的方式将配置文件放入容器,便于管理和更新。

3.4 日志和监控

  • 日志收集:容器的标准输出(stdout)和标准错误(stderr)可以被Docker自动捕获,便于集中日志管理。
  • 性能监控:Docker提供的API和内置命令可以监控容器的性能指标,集成到现有的监控系统中。

3.5 开发流程的优化

  • 快速迭代:Docker容器的快速启动和停止,使得开发和测试的迭代周期大大缩短。
  • 依赖管理:使用Dockerfile明确项目的依赖,确保开发环境和生产环境的一致性。

4 Docker在微服务架构中的应用

4.1 微服务架构概述

微服务架构是一种设计方法,它将一个大型应用程序分解为一组小的、相互独立的服务,每个服务实现特定业务功能,运行在自己的进程中,并通过轻量级通信机制(通常是HTTP RESTful API或消息队列)进行交互。

4.2 Docker与微服务架构的契合

  1. 服务隔离:Docker容器为每个微服务提供了隔离的运行环境,确保服务间相互独立,互不影响。
  2. 环境一致性:Docker保证了从开发到生产环境的一致性,减少了“在我机器上能跑”的问题。
  3. 快速部署和扩展:Docker容器的轻量性质使得启动速度非常快,易于快速部署新服务或扩展现有服务。

4.3 Docker在微服务架构中的应用实践

  1. 服务容器化
    • 每个微服务打包成一个Docker镜像,包含服务的代码、运行时、依赖等。
    • 使用Dockerfile定义服务镜像的构建过程。
  2. 服务编排
    • 使用Docker Compose或Kubernetes等编排工具管理容器。
    • 定义服务间的依赖、网络、存储等配置。
  3. 持续集成/持续部署(CI/CD)
    • 利用Docker容器的一致性和隔离性,实现自动化的测试、构建、部署流程。
    • 每个服务的更新可以独立构建和部署,加快迭代速度。
  4. 负载均衡与服务发现
    • 使用Docker Swarm模式或Kubernetes集群来管理多个服务实例。
    • 利用这些平台提供的负载均衡器和服务发现机制自动分配请求并维护服务健康。
  5. 日志管理和监控
    • 利用Docker的日志驱动收集容器日志。
    • 集成Prometheus、Grafana等监控工具,实现服务的性能监控和告警。
  6. 安全性
    • 利用Docker提供的安全机制,如用户命名空间、只读文件系统等,增强服务安全性。
    • 定期扫描镜像中的安全漏洞。

5 Docker与云计算(AWS、Azure、GCP)

6 案例研究和最佳实践

6.1 Github项目用docker来体验 🔥

6.1.1 创建Dockerfile
# Use an official Ubuntu runtime as a parent image
FROM ubuntu:20.04# Set environment variables to non-interactive (this prevents some prompts)
ENV DEBIAN_FRONTEND=noninteractive# Replace the source list with USA mirrorb
#RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://us.archive.ubuntu.com/ubuntu|g' /etc/apt/sources.list# Replace the source list with China's USTC University mirror
#RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirrors.ustc.edu.cn/ubuntu|g' /etc/apt/sources.list
# Replace the source list with China's Tsinghua University mirror
RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list
# Replace the source list with Alibaba Cloud mirror
#RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.list# Update and install build and utility dependencies
RUN apt-get update && apt-get install -y \build-essential \git \curl \wget \make \cmake \unzip \pkg-config \software-properties-common \openssh-server && \apt-get clean && \rm -rf /var/lib/apt/lists/*# Install GCC, G++ for C++ projects
RUN apt-get install -y gcc g++# Install Go
RUN add-apt-repository ppa:longsleep/golang-backports
RUN apt-get update
RUN apt-get install -y golang-go# (Optional) Install vcpkg for managing C++ libraries
RUN git clone https://github.com/Microsoft/vcpkg.git
RUN ./vcpkg/bootstrap-vcpkg.sh
RUN ./vcpkg/vcpkg integrate install# Install OpenSSH Server
RUN mkdir /var/run/sshd
RUN echo 'root:your_password' | chpasswd# SSH login fix. Otherwise user is kicked off after login
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config# Expose the SSH port
EXPOSE 22# Set the working directory in the container
WORKDIR /workspace# Copy the content of the local src directory to the working directory
COPY . /workspace# Start SSH server
CMD ["/usr/sbin/sshd", "-D"]

为了减少镜像的大小和层数,一个常见的做法是将多个命令合并到一个RUN指令中,通常使用逻辑运算符(如&&)来连接这些命令。这样做不仅能减少镜像的层数,还可以减少中间层的大小,从而减少整体镜像的大小。

通常来说,如果后续的RUN指令并不会显著增加镜像的大小,或者它们之间有逻辑上的分隔(比如一个RUN指令用于安装依赖,另一个用于配置软件),那么将它们保持分开可能会更有利于Dockerfile的可读性和维护性。

合并RUN指令主要用于以下情况:

  1. 减少镜像层数:Docker镜像由多层构成,每个RUN指令都会创建一个新层。过多的层可能会导致镜像变大。
  2. 减少镜像大小:临时文件和中间数据可能会在镜像的层中保留下来。合并命令可以在一个层内完成创建和清理临时文件的操作,避免临时文件占用额外空间。
  3. 提高构建效率:合并多个命令可以减少Docker构建的步骤,可能会略微提高构建的速度。

比如: 你可能想在一个RUN指令中编译你的应用,在另一个RUN指令中配置你的应用环境。在这种情况下,保持命令的分离有助于使Dockerfile更加清晰和易于理解。

# Use an official Ubuntu runtime as a parent image
FROM ubuntu:20.04# Set environment variables to non-interactive (this prevents some prompts)
ENV DEBIAN_FRONTEND=noninteractive# Replace the source list with USTC mirror and install dependencies
# - `--fix-missing`选项尝试修复因为包丢失、损坏或无法下载导致的问题。
# - `apt-get clean`清理了本地仓库的下载的`.deb`包,这些包在安装后不再需要。
# - `rm -rf /var/lib/apt/lists/*`删除了`apt`获取的包列表信息,这些在构建镜像之后不再需要。
RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirrors.ustc.edu.cn/ubuntu|g' /etc/apt/sources.list && \apt-get update && \apt-get install -y --fix-missing\build-essential \git \curl \wget \make \cmake \unzip \pkg-config \software-properties-common \openssh-server && \apt-get clean && \rm -rf /var/lib/apt/lists/*
# ... (rest of your Dockerfile)
6.1.2 构建镜像

docker build -t lyupeichen/dev:0.0.1 .
output:

# docker build -t lyupeichen/dev:0.0.1 .
[+] Building 76.2s (5/19)                                        docker:default=> [internal] load build definition from Dockerfile                       0.0s=> => transferring dockerfile: 1.54kB                                     0.0s => [internal] load .dockerignore                                          0.0s => => transferring context: 2B                                            0.0s => [internal] load metadata for docker.io/library/ubuntu:22.04            3.7s => [internal] load build context                                         12.1s=> => transferring context: 96.90kB                                      12.1s => CACHED [ 1/15] FROM docker.io/library/ubuntu:22.04@sha256:e6173d4dc55  0.0s => [ 2/15] RUN sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirror  72.4s => => # ages [1344 kB]=> => # Get:4 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd6 => => # 4 Packages [44.6 kB]=> => # Get:5 http://security.ubuntu.com/ubuntu jammy-security/restricted amd6 => => # 4 Packages [1600 kB]=> => # Ign:6 http://mirrors.ustc.edu.cn/ubuntu jammy InRelease          .........
6.1.3 启动容器

使用以下命令启动容器,其中:

  • -p 2222:22 将容器的22端口(SSH默认端口)映射到宿主机的2222端口。
  • -v /path/on/host:/workspace 将宿主机上的某个目录映射到容器中的/workspace目录。
docker run -d -p 2222:22 -v /path/on/host:/workspace --name your-container-name your-image-name

6.2 使用docker pull confluentinc/cp-kafka 的全面指南

7 总结

Docker作为一种现代化的容器化技术,为软件开发提供了高效的解决方案。通过容器化,我们可以实现开发环境、测试环境和生产环境的一致性,简化部署步骤,并提高软件的可靠性和可维护性。Docker在持续集成、持续部署和微服务架构中发挥了重要作用,极大地促进了DevOps实践的发展。希望通过本文的介绍,能够帮助读者更好地理解和应用Docker,提升软件开发的效率和质量。

References

  • Docker官方网站:https://www.docker.com
  • Docker文档:https://docs.docker.com
  • 微服务架构设计模式:https://microservices.io

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

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

相关文章

云服务器CPU和内存直接被zzh恶意挖矿程序打满,如何解决?

回顾 最近在服务器上面部署网站&#xff0c;刚开始使用还是没问题的&#xff0c;当时一段时间之后发现CPU和内存总是被打满&#xff0c;本地没有跑大的应用&#xff0c;主要有mysql、nginx、redis&#xff0c;一度还以为是nginx 的问题&#xff0c;但是后来排除了。之后使用ht…

Android 11 低电量自动关机失效

Android 11 低电量自动关机 概述 安卓系统设计了低电关机功能&#xff0c;旨在当手机电池电量过低时自动关机&#xff0c;以保护手机硬件和数据安全。该功能由以下几个部分组成&#xff1a; 电池电量监测: 安卓系统通过 BatteryService 组件持续监测电池电量。BatteryService…

小主机折腾记24

好久不更新&#xff0c;最近折腾的事如下 1.10块钱自提买了个半高机箱&#xff0c;15086140&#xff0c;把之前拆机的H61m-A/M32AA/DP_MB与200w航嘉电源装了进去&#xff0c;额外买了半高pcie转接了个m2位&#xff0c;江波龙64g安装了win10专业版&#xff0c;最后卖了176块钱&a…

实战分析:记录一下线上OOM排查(原创)

记录背景 公司仓库系统经常反馈出现系统使用不了503的情况&#xff0c;自动挂掉。 启动脚本添加命令 以为是程序发生OOM导致内存溢出&#xff0c;添加命令&#xff0c;发生内存溢出输出文件 -XX:HeapDumpOnOutOfMemoryError -XX:ErrorFile./errorfile.log -XX:HeapDumpPath.…

Windows无法安装到这个硬盘空间。选定的分区上启用了BitLocker驱动器加密。请在控制面板中暂停(也称为禁用)BitLocker,然后重新开始安装。

我们安装操作系统的时候&#xff0c;到了选择安装分区的地方&#xff0c;我们选中的分区提示“无法在驱动器的分区上安装Windows”&#xff0c;然后我们点击显示详细信息&#xff0c;提示如图下所示 分析原因&#xff0c;可能是之前的分区未进行格式化。但是这个时候我们无法格…

【Python预处理系列】深入理解过采样技术及其Python实现

目录 一、过采样简介 二、过采样的实现方法 三、过采样和欠采样是数据增强吗 四、Python实现SMOTE过采样 &#xff08;一) 生成不平衡数据集 &#xff08;二&#xff09; 将数据集转换为DataFrame&#xff0c;便于展示 &#xff08;三) 应用SMOTE算法进行过采样 &…

【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南

【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 由于需要跑深度学习&#xff0c;要用到pytorch&a…

重塑楼宇管理:智慧管控可视化开启高效新篇章

借助图扑智慧楼宇管控可视化技术&#xff0c;实现实时监控与智能化管理&#xff0c;快速响应潜在问题&#xff0c;确保楼宇安全、节能和高效运行。

Git之解决重复输入用户名和密码(三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

快速入门Linux及使用VSCode远程连接Linux服务器

在当前的技术环境中&#xff0c;Linux操作系统因其强大的功能和灵活性而广受欢迎。无论你是开发人员、系统管理员还是技术爱好者&#xff0c;学习Linux都是提升技术技能的重要一步。本文将介绍如何快速入门Linux&#xff0c;并使用Visual Studio Code&#xff08;VSCode&#x…

时光正好保剑锋的抱治百病与成年人的世界

《时光正好》&#xff1a;保剑锋的“抱治百病”与成年人的世界在繁忙的都市里&#xff0c;每个角落上演着各自的人生戏码。而在这些戏码中&#xff0c;由保剑锋主演的《时光正好》无疑成为了近期引人注目的焦点。这部电视剧以其真实而深刻的剧情&#xff0c;让我们看到了成年人…

SpringBoot+Vue实现前后端分离基本的环境搭建

目录 一、Vue项目的搭建 &#xff08;1&#xff09;基于vite创建vue项目 &#xff08;2&#xff09;引入elementplus &#xff08;3&#xff09;启动后端服务&#xff0c;并测试 二、SpringBoot项目的搭建 &#xff08;1&#xff09;通过idea创建SpringBoot项目 &#x…

有效的括号(oj题)

一、题目链接 https://leetcode.cn/problems/valid-parentheses/submissions/538110206 二、题目思路 利用栈的性质&#xff0c;后进先出 1.依次读取字符串&#xff0c;判断是否为左括号&#xff0c;如果是&#xff0c;就将其入栈。 2.如果读取的不是左括号&#xff0c;就说…

【网络教程】Iptables官方教程-学习笔记7-简单理解IPTABLES规则的作用流程

前面学习了IPTABLES的所有功能介绍后&#xff0c;一个Linux设备里的IPTABLES规则集是如何运行的&#xff0c;这里简单做个介绍。 在Linux设备里输入"iptables -nvl",得到该设备的所有防火墙规则&#xff0c;得到的结果中可以看到这个设备防火墙里所有的链以及链里的…

Git从入门到放弃

由于我的Git学的不太好&#xff0c;所以为了能够将以后我的学习笔记能够整理的更好&#xff0c;我先要系统的学习一下git&#xff0c;文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网&#xff0c;Git也不例外。ht…

【Python报错】已解决AttributeError: ‘Series’ object has no attribute ‘columns’

成功解决“AttributeError: ‘Series’ object has no attribute ‘columns’”错误的全面指南 一、引言 在Python的数据处理和分析中&#xff0c;Pandas库是一个不可或缺的工具。然而&#xff0c;在使用Pandas时&#xff0c;可能会遇到各种错误&#xff0c;其中之一就是“Att…

HTML静态网页成品作业(HTML+CSS)—— 24节气立夏介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

使用Python创建Word文档

使用Python创建Word文档 安装python-docx库创建Word文档代码效果 在这篇文章中&#xff0c;我们将介绍如何使用 Python创建一个Word文档。首先&#xff0c;我们需要安装python-docx库&#xff0c;然后通过一段简单的代码示例展示如何创建和编辑Word文档。 安装python-docx库 …

RPA影刀 | 变量的使用

1.什么是变量 2.变量的作用 作用1&#xff1a;方便后续流程调用 这里在后续流程“点击元素”中&#xff0c;就可以选中这个变量 作用2&#xff1a;区分相同属性的变量 如果要打开两个网页&#xff0c;总不能都叫web_page吧。 所以这里一个叫百度web_page&#xff0c;一个叫…

C++期末复习总结(2)

目录 1.运算符重载 2.四种运算符重载 &#xff08;1&#xff09;关系运算符的重载 &#xff08;2&#xff09; 左移运算符的重载 &#xff08;3&#xff09;下标运算符的重载 &#xff08;4&#xff09;赋值运算符的重载 3.继承的方式 4.继承的对象模型 5.基类的构造 6…