网络运维Day16

文章目录

  • Docker简介
    • 什么是容器
      • 命名空间:
    • Docker 的优缺点
  • Docker安装
  • Docker镜像管理
    • 什么是镜像
    • 镜像管理
  • Docker容器管理
    • 运行容器
    • 容器启动、停止、重启
    • 拷贝文件
    • 进入容器
    • 容器与应用
  • Dockerfile
    • Dockerfile 语法
    • 案例
  • 总结

Docker简介

什么是容器

  • 容器是用来装东西的,Linux 里面的容器是用来装应用的;

  • 容器就是将软件打包成标准化单元,以用于开发、交付和部署;

  • 容器技术已经成为应用程序封装和交付的核心技术;

  • 容器原理:容器技术的核心,由以下几个内核技术组成:

    • Cgroups (Control Groups) :资源管理
    • SELinux:安全 (是针对于文件系统,文件的管理措施)
    • NameSpace:命名空间

命名空间:

  • 是指可以对系统资源空间进行分割隔离的技术
  • 例如:创建一个虚拟机,在虚拟机里的所有操作,都不会对真实机造成影响。
  • 命名空间分为六大类,可以从各个方面来对系统资源空间进行隔离;
    • UTS:主机名隔离
    • NETWORK:网络隔离
    • MOUNT:文件系统隔离
    • USER:用户隔离
    • PID:进程隔离
    • IPC:信号向量隔离

Docker 的优缺点

  • 优点

    • 相比于传统的虚拟化技术,容器更加简洁高效
    • 传统虚拟机需要给每个 VM 安装操作系统
    • 容器使用的共享公共库和程序
  • 缺点

    • 容器的隔离性没有虚拟机强
    • 共用Linux内核,安全性有先天缺陷

在这里插入图片描述

Docker

使用模板机的克隆以下机器,配置如下

主机名IP地址内存CPU
docker-0001192.168.8.1072G2
docker-0002192.168.8.1082G2

docker-0001配置IP地址和主机名

[root@localhost ~]# hostnamectl set-hostname docker-0001
[root@docker-0001 ~]# nmcli connection modify ens33 ipv4.method auto  connection.autoconnect yes
[root@docker-0001 ~]# nmcli connection up ens33
[root@docker-0002 ~]# yum clean all
[root@docker-0002 ~]# yum repolist

docker-0002配置IP地址和主机名

[root@localhost ~]# hostnamectl set-hostname docker-0002
[root@docker-0002 ~]# nmcli connection modify ens33 ipv4.method auto  connection.autoconnect yes
[root@docker-0002 ~]# nmcli connection up ens33
[root@docker-0002 ~]# yum clean all
[root@docker-0002 ~]# yum repolist

Docker安装

docker安装(两台主机都要安装,以docker-0001为例)

开启路由转发,docker是通过虚拟交换机来进行通讯的,需要开启路由转发的功能

[root@docker-0001 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@docker-0001 ~]# sysctl -p              #sysctl -p 让配置立刻生效(否则需要重启虚拟机)
[root@docker-0001 ~]# yum -y install docker
[root@docker-0001 ~]# systemctl enable --now docker        #启动docker服务

Docker镜像管理

什么是镜像

  • 镜像是启动容器的核心

  • 在Docker 中容器是基于镜像启动的

  • 镜像采用分层设计,使用 COW 技术

在这里插入图片描述

  • 容器本身是没有操作系统,和宿主机共用一个操作系统;

  • 容器是docker(容器的管理工具)使用镜像文件来启动的;

  • 镜像是启动容器的模板,镜像中存放的是应用程序(服务软件),例如: 有一个http的镜像文件,在这个镜像中就存放的是http的所有文件和变量;

  • 用户使用镜像启动容器时,会生成一个独立于镜像的容器层,并不会对镜像层产生任何影响;

  • 而且容器采用了cow(写时复制)的技术,用户可以使用一个镜像文件创建多个容器,互不干扰;

  • 镜像采用分层技术:

    • 用户可以根据自己的需求来制作镜像,例如:在镜像的第一层定义应用程序的变量,在镜像的第二层修改配置文件,在镜像的第三层进行应用软件的部署;
    • 分层做好镜像后,用户使用镜像启动容器时,可以选择根据镜像的哪一层来启动,类似快照还原;
  • 镜像来源

    • 镜像可以从官方镜像仓库下载https://hub.docker.com
    • 自己制作

镜像管理

  • docker images #查看本机镜像
  • docker search 关键词 #查找包含关键词的镜像
  • docker pull 镜像名称:标签 #下载镜像
  • docker rmi 镜像名称:标签 #删除镜像
  • docker history 镜像名称: 镜像标签 #查看镜像的制作历史
  • docker inspect 镜像名称: 镜像标签 #查看镜像的信息
  • docker tag 镜像名称: 镜像标签 新镜像名称: 新的标签 #为镜像的打新名称和标签
[root@docker-0001 ~]# docker images          #还没有导入镜像,所以没有镜像
[root@docker-0001 ~]# docker search busybox
NAME     DESCRIPTION   			STARS  	OFFICIAL   AUTOMATED
busybox   Busybox base image.  	2010   	[OK] 
[root@docker-0001 ~]# docker pull busybox

查看镜像

[root@docker-0001 ~]# docker images
REPOSITORY     TAG      IMAGE ID       CREATED       SIZE
busybox        latest   6858809bf669   4 weeks ago   1.232 MB
#REPOSITORY  镜像名称
#TAG         镜像标签
#IMAGE ID    镜像ID号
#CREATED     镜像创建时间
#SIZE        镜像大小

镜像的备份与恢复

  • 镜像备份:docker save 镜像名称:镜像标签 -o 备份文件夹(tar格式)
  • 镜像恢复(导入镜像):docker load -i 备份文件名称

docker-0001导出镜像(备份)

[root@docker-0001 ~]# docker save busybox:latest  -o /root/busybox.tar
#导出镜像busybox,需要指定名字和标签,导出到/root目录下,名称为busybox.tar
#名称和路径可以随意指定

拷贝备份镜像到docker-0002上

[root@docker-0001 ~]# scp /root/busybox.tar  192.168.8.108:/root/

docker-0002恢复镜像

[root@docker-0002 ~]# docker load -i busybox.tar 
[root@docker-0002 ~]# docker images 

教学环境中将docker-images目录上传到docker-0001的/root下,并导入这四个镜像到docker里面

[root@docker-0001 ~]# cd docker-images
[root@docker-0001 docker-images]#  for i in *.tar.gz
> do
> docker load -i $i
> done

docker-0001看镜像的制作历史

[root@docker-0001 ~]# docker  history  centos:latest		#由下到上,镜像可以分为3层 

查看镜像的信息

[root@docker-0001 ~]# docker inspect centos:latest
[root@docker-0001 ~]# docker inspect nginx:latest 
.........."Cmd": [		# Cmd 默认的启动命令,即:启动容器时,默认的启动命令"nginx","-g","daemon off;"],
..........

docker-0001为镜像busybox:lastest打的新名称和标签

[root@docker-0001 ~]# docker tag busybox:latest xxhh:test

docker-0001删除镜像

[root@docker-0002 ~]# docker rmi busybox:latest

Docker容器管理

运行容器

  • docker run -参数 镜像名称:镜像标签 启动命令 #创建+运行+进入容器命令
  • docker ps [-a] [-q] #查看容器
  • docker rm [-f] #删除容器(-f强制)

docker-0001根据centos镜像启动并进入一个容器

[root@docker-0001 ~]# docker  run  -it  centos:latest  /bin/bash        #/bin/bash为容器内的命令,容器内存在,才可以使用
[root@89d1ec3a0dc8 /]# exit
[root@docker-0001 ~]# docker  run  -itd  nginx:latest    #启动nginx,是个服务,要加d,放后台才能运行

查看容器

[root@docker-0001 ~]# docker ps
[root@docker-0001 ~]# docker ps -a		#ps  -a 查看创建的所有的容器(运行的和已经停止的)
[root@docker-0001 ~]# docker ps -q		#ps -q 查看运行中容器的ID值
[root@docker-0001 ~]# docker ps -aq		#ps -aq查看所有容器的id,用于脚本对容器的管理

删除容器(容器ID不能照抄,每个人都不一样)

[root@docker-0001 ~]# docker rm 512567e6f64f

删除正在使用的容器时,会报错,无法删除,需要先停止容器,再执行删除命令

[root@docker-0001 ~]# docker stop 512567e6f64f		#停止容器
[root@docker-0001 ~]# docker rm 512567e6f64f

删除所有的容器:支持命令行重录,前一个命令的结果$(docker ps -aq)可以作为后一个命令的参数

[root@docker-0001 ~]# docker rm -f $(docker ps -aq)		#$()用来获取命令的执行结果

容器启动、停止、重启

  • docker start 容器id #启动容器
  • docker stop 容器id #停止容器
  • docker restart 容器id #重启容器
[root@docker-0001 ~]# docker run -itd  nginx:latest 

查看容器信息

[root@docker-0001 ~]# docker inspect 38b8ee2a8754
......"Gateway": "172.17.0.1","IPAddress": "172.17.0.2",
......
[root@docker-0001 ~]# curl http://172.17.0.2
<title>Welcome to nginx!</title>
............ 	
[root@docker-0001 ~]# docker stop 38b8ee2a8754				#停止容器
[root@docker-0001 ~]# docker start 38b8ee2a8754				#启动容器			
[root@docker-0001 ~]# docker restart 38b8ee2a8754			#重启容器

拷贝文件

  • docker cp 本机文件路径 容器id:容器内路径(上传)

  • docker cp 容器id:容器内路径 本机文件路径(下载)

在第一个终端中执行

[root@docker-0001 ~]# docker run -it  centos:latest
[root@69f7753eb1e8 /]# cd /etc/yum.repos.d/
[root@69f7753eb1e8 yum.repos.d]# rm -rf *

#另外开一个docker-0001的终端操作

[root@docker-0001 ~]# docker cp  /etc/yum.repos.d/CentOS-Base.repo 69f7753eb1e8:/etc/yum.repos.d/Centos-base.repo            
[root@69f7753eb1e8 yum.repos.d]# yum -y install net-tools       #在容器里面可以正常使用
[root@69f7753eb1e8 yum.repos.d]# ifconfig
[root@69f7753eb1e8 yum.repos.d]# exit

进入容器

  • docker exec -it 容器id 命令

  • docker attach 容器id

[root@docker-0001 ~]# docker ps	-a							   #查看正在使用的容器
[root@docker-0001 ~]# docker start  69f7753eb1e8			   #启动centos的容器
[root@docker-0001 ~]# docker exec -it 69f7753eb1e8 /bin/bash   #根据centos容器ID,进入容器
[root@69f7753eb1e8 /]# ps -ef								   #两个bash进程
[root@69f7753eb1e8 /]# exit    								   #退出
  • attach 以上帝进程的身份,进入容器内部,当执行exit退出容器时,会结束整个容器,通常用于在测试时,查看报错信息;
[root@docker-0001 ~]# docker attach 69f7753eb1e8		#Ctrl + p+ q  退出容器,但不会停止
[root@69f7753eb1e8 /]# ps -ef 							#一个bash进程(上帝进程)
[root@69f7753eb1e8 /]# exit     						#退出,容器关闭[root@docker-0001 ~]# docker start 69f7753eb1e8			#启动被关闭容器
[root@docker-0001 ~]# docker attach 69f7753eb1e8 #Ctrl + p+ q  退出容器,但不会停止容器的运行
  • 在对容器的使用过程中,都是使用exec,新开一个进程的方式进入容器,进行操作;
  • 而attach 往往应用于调试,终端输出的情况;

容器与应用

在这里插入图片描述

删除之前所有的容器

[root@docker-0001 ~]# docker rm -f $(docker ps -aq)

重新运行容器

[root@docker-0001 ~]# docker run -it --name myapache centos:latest
[root@d7cfa9370097 /]# cd /etc/yum.repos.d/       
[root@d7cfa9370097 yum.repos.d]# rm -rf *

把宿主机的yum文件拷贝给刚刚启动的容器

[root@docker-0001 ~]# docker cp  /etc/yum.repos.d/CentOS-Base.repo myapache:/etc/yum.repos.d/CentOS-Base.repo

此时就可以在容器里面安装相关的软件包

[root@d7cfa9370097 yum.repos.d]# yum -y install httpd php psmisc iproute net-tools
[root@d7cfa9370097 yum.repos.d]# pstree -p

因为容器内并没有systemd的服务,无法使用systemctl来启动httpd的服务

查看httpd的服务文件,获取环境变量文件和服务启动命令

[root@d7cfa9370097 /]# cat /lib/systemd/system/httpd.service 
........
[Service]
EnvironmentFile=/etc/sysconfig/httpd   	#环境变量文件
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND#启动命令,$OPTIONS 此环境变量为空,可以不用写[root@d7cfa9370097 /]# cat /etc/sysconfig/httpd      #从环境变量文件中,获取环境变量
......
LANG=C
[root@d7cfa9370097 html]# echo 'hello world' > /var/www/html/index.html
[root@dcfa9370097 /]# /usr/sbin/httpd -DFOREGROUND          #启动httpd服务
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

可以在宿主机测试,通过提示的地址172.17.0.2(IP地址不要照抄)

[root@docker-0001 ~]# curl 172.17.0.2
hello world

此时容器内容的终端是被占用的,是在前台运行的,如果关闭,不能够再次访问httpd,

若想要退出,使用ctrl + pq

[root@docker-0001 ~]# docker exec -it d7cfa9370097 /bin/bash
[root@d7cfa9370097 /]# pstree -p
bash(1)---httpd(66)-+-httpd(67)|-httpd(68)|-httpd(69)|-httpd(70)`-httpd(71)
[root@d7cfa9370097 /]# exit

Dockerfile

  • Dockerfile是用于构建Docker镜像的文本文件。它包含一组指令,用于描述镜像的基础操作,以及打包应用程序运行所需的所有依赖项。

Dockerfile 语法

  • FROM:基础镜像
  • RUN:制作镜像时执行的命令,可以有多个
  • ADD:复制文件到镜像,自动解压 (文件类型为: tar.gz 或 tar.bz2)
  • COPY:复制文件到镜像,不解压
  • MAINTAINER:镜像创建者信息
  • EXPOSE:开放的端口
  • ENV:设置变量
  • WORKDIR:定义容器默认工作目录(等于cd)
  • CMD: 容器启动时执行的命令,仅可以有一条CMD,若多条会覆盖,最后一条生效
    • CMD 容器的默认启动命令,可以自己定义,也可以使用默认的
    • Dockerfile中,不指定CMD时,则使用默认的启动命令;
    • 如果没有使用CMD指定启动命令,则会继承上一个镜像的默认启动命令;
    • CMD 容器的默认启动命令,有且只能有一条;

使用 Dockerfile 工作流程

  • mkdir build
  • cd build
  • 编写 Dockerfile
  • 根据Dockerfile生成新的镜像:docker build -t imagename Dockerfile所在目录

案例

  • 创建支持httpd服务镜像

因为容器内并没有systemd的服务,无法使用systemctl来启动httpd的服务
查看httpd的服务文件,获取环境变量文件和服务启动命令

[root@a670096c60ad /]# cat /lib/systemd/system/httpd.service 
........
[Service]
EnvironmentFile=/etc/sysconfig/httpd				#环境变量文件
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND		#启动命令,$OPTIONS此环境变量为空
[root@a670096c60ad /]# vim /etc/sysconfig/httpd		#从环境变量文件中,获取环境变量
......
LANG=C
[root@a670096c60ad /]# LANG=C							#设置环境变量
[root@54cb8bfa063d /]# /usr/sbin/httpd -DFOREGROUND		#启动httpd服务,Ctrl + C 退出

编写httpd的Dockerfile文件(从这里开始做)

[root@docker-0001 ~]# mkdir web
[root@docker-0001 ~]# cd web/
[root@docker-0001 web]# vim Dockerfile
FROM  docker.io/centos:latest
RUN   yum -y install httpd php
ENV   LANG=C
EXPOSE 80 
WORKDIR  /var/www/html
COPY   index.html  /var/www/html/
CMD   ["/usr/sbin/httpd","-DFOREGROUND"]

生成index.html

[root@docker-0001 web]# echo 123 > index.html

build 创建新的镜像;-t 指定新镜像的名字和标签;. 指定Dockerfile文件所在的目录

[root@docker-0001 web]# docker build -t myos:httpd .
[root@docker-0001 web]# docker images
[root@docker-0001 web]# docker run -itd myos:httpd		#后台启动容器,因为是一个服务
[root@docker-0001 web]# docker ps						#查看正在使用的容器
[root@docker-0001 web]# docker inspect 800b21aa9736		#查看容器的详细信息
[root@docker-0001 web]# curl http://172.17.0.2/    		#IP地址不要抄

总结

  • 掌握Docker容器管理平台
  • 掌握镜像和容器的关系
  • 掌握镜像管理命令
  • 掌握容器管理命令
  • 掌握Dockerfile语法格式

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

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

相关文章

CSS特效010:文字颜色渐变的流光效果

查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS相关的库、…

爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

揭秘Vue中的nextTick:异步更新队列背后的技术原理大揭秘!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、N…

go-bindata - embed结合嵌入静态文件打包可执行二进制文件

## embed 嵌入静态文件到可执行二进制文件 # 安装go-bindata go get -u github.com/jteeuwen/go-bindata/... # 打包静态文件 go-bindata web/... 执行次命令之后会在项目目录下生成bindata.go文件,示例命令中模板文件都在项目的web目录下 # 使用embed注册模板示例文档 http…

Git 修改历史 commit message

一. 修改最新的 commit log 修改最近一次commit message&#xff0c; 直接使用命令 git commit --amend 就可以完成修改二. 修改历史 commit log 查看日志(按 q 退出) git log --oneline # 查看5步的log。 git log --oneline -5选择要修改的commit 信息 # 要修改的 commit log…

邦芒攻略:新手求职面试需要准备的材料

新手求职面试需要准备的材料&#xff0c;求职材料是求职者写给用人单位的信&#xff0c;目的是让对方了解自己&#xff0c;准备好充足的资料和自信的心态会让面试通过的几率大大增强&#xff0c;那么应聘者需要准备的材料呢&#xff0c;来看看吧。 ​ ​1、求职信。也是求职者…

数据湖架构

数据湖架构介绍 数据湖&#xff08;Data Lake&#xff09;是一个存储大量结构化和非结构化数据的集中式数据存储库。 与传统的数据仓库不同&#xff0c;数据湖采用扁平化结构&#xff0c;将数据存储在原始形式下&#xff0c;不需要进行预处理或转化。这使得数据湖能够同时支持…

微服务的注册发现和微服务架构下的负载均衡

文章目录 微服务注册模型服务注册与发现怎么保证高可用【1. 服务端崩溃检测】【2. 客户端容错】【3. 注册中心选型】 微服务架构下的负载均衡【1.轮询与加权轮询】【2.随机与加权随机】【3.哈希与一致性哈希】【4.最少连接数】【5.最少活跃数】【6.最快响应时间】【总结】 负载…

微服务简单理解与快速搭建

分布式和微服务 含义 微服务架构 微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服…

鼠标右键菜单版

Imports System.Data.OleDbPublic Class Form1Dim jiuyue As String() {"创", "出", "利", "民", "申", "书", "士", "得", "撒上", "撒下", "王上", "…

【算法】算法题-20231115

这里写目录标题 一、回文数&#xff08;力扣第九题&#xff09;二、剑指 Offer 39. 数组中出现次数超过一半的数字三、至少是其他数字两倍的最大数&#xff08;leetcode第747题&#xff0c;飞书三面&#xff09;四、给定一有序整型数组&#xff0c;其中存在有重复元素&#xff…

ARM day4

LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…

Java虚拟机的垃圾回收机制

Java虚拟机的垃圾回收机制 Java语言会对程序运行过程中产生的垃圾进行自动回收&#xff0c;不需要我们手动地写语句主动地对垃圾进行回收。 什么是垃圾&#xff1f; 在C语言中不再被使用的内存空间被称为垃圾&#xff0c;因为在C语言中如果我们使用到一些自定义类型的结构体&am…

Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录HTTP协议1、网址1.1 网址的概念1.2 URL的组成1.3 知识要点 2、HTTP协议的介绍2.1 HTTP协议的概念及作用2.2 HTTP协议的概念及作用2.3 浏览器访问Web服务器的过程 3、HTTP请求报文3.1 H…

【Java 进阶篇】JQuery DOM操作:CRUD操作的前端魔法

在前端开发的舞台上&#xff0c;CRUD&#xff08;Create, Read, Update, Delete&#xff09;操作是一种极为重要的技能&#xff0c;它涉及对页面元素的增删改查。而JQuery&#xff0c;这位前端开发的魔法师&#xff0c;为我们提供了便捷而强大的方法&#xff0c;使得CRUD操作变…

hadoop 大数据环境配置 ssh免密登录 centos配置免密登录 hadoop(四)

1. 找到.ssh文件夹 cd ~ # 在.ssh文件夹下生成 # cd .ssh 2. 生成私钥公钥命令&#xff1a; ssh-keygen -t rsa3. 发送到需要免密机器&#xff1a; # hadoop23 是我做了配置。在host配置得机器ip和名称得映射 ssh-copy-id hadoop23 4. 成功

【JavaEE】Servlet API 详解(HttpServletRequest类)

二、HttpServletRequest Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成 HttpServletRequest 对象&#xff08;内容和HTTP请求报文一样&#xff09; 1.1 HttpServletRequest核心方法 1.2 方法演示 WebServlet("/showRequest&…

IOS上架流程

准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 &#xff08;CSR文件&#xff09;三、创建发布证书 &#xff08;CER&#xff09;四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09;五、在App Store创建应用六、打包上架 一、…

【python自动化】Playwright基础教程(七)Keyboard键盘

【python自动化】Playwright基础教程(七)Keyboard键盘 playwright模拟键盘操作 键盘事件提供了用于管理虚拟键盘的API&#xff0c;高级API是keyboard.type()&#xff0c;它使用的是原始字符再页面上生成对应的keydown 、 keypress / input 和 keyup 事件。 模拟真实键盘操作进行…