docker — 容器网络

news2024/11/24 19:54:25

一、概述

Docker容器每次重启后容器ip是会发生变化的。

这也意味着如果容器间使用ip地址来进行通信的话,一旦有容器重启,重启的容器将不再能被访问到。

而Docker 网络就能够解决这个问题。

Docker 网络主要有以下两个作用:

容器间的互联和通信以及端口映射

容器IP变动时候可以通过服务名直接网络通信而不受到影响

因此只要是处于同一个Docker 网络下的容器就可以使用服务名进行直接访问,而无需担心重启。

这也是Docker 网络最基本和常用的应用场景。

二 Docker网络实现原理

  1. docker使用linux桥接,在宿主机虚拟一个docker容器网桥(docker0)
  2. docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP
  3. 同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信。

docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射),即docker run 创建容器的时候,通过-p或者-P参数来启用。访问容器的时候,就通过【宿主机IP】:【容器端口】访问容器。

二、Docker的四种网络模式

二、Docker的四种网络模式

网络模式命令指定方式描述
bridge–networkbridgedocker0 虚拟网桥上,这也是默认网络模式
host–network host容器不会创建自己的网卡,配置 ip 等,而是使用宿主机的 ip 和端口
container–network容器名称或id 新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip、端口范围
none–network none容器有独立的Network namespace,但并没有对其进行任何网络设置

如果觉得–network太长了也可以使用简写-net,效果是一样的

而Docker 安装完成时,一般会自动创建三个网络:

NETWORK ID          NAME                DRIVER              SCOPE
40547f9137a5        bridge              bridge              local
b40bdb8f0356        host                host                local
0c7f9938f868        none                null                local

可以使用下列命令查看:

docker network ls

2.1 桥接模式–bridge

Docker服务启动 时,默认会创建一个名称为 docker0 网桥(其上有一个名称为 docker0 内部接口)。

该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker会 默认指定docker0 的 ip地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1)桥接模式原理图

在这里插入图片描述

2)桥接模式解析

Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0)。

Docker每启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址。

同时Docker网桥是每个容器的默认网关。

同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

docker run创建容器的时,未指定network的容器默认的网络模式就是bridge,使用的就是docker0。

在宿主机ifconfig,就可以看到docker0和自己创建的network:

eth0,eth1……代表网卡一,网卡二……
lo代表127.0.0.1(localhost)
inet addr表示网卡的ip地址
网桥docker0会创建一对对等虚拟设备接口:一个叫veth,另一个叫eth0,成对匹配。

整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,

在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

每个容器实例内部也有一块网卡,每个接口叫eth0;

docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对。

2.2 主机模式–host

不创建任何网络接口,直接使用宿主机的 ip地址与外界进行通信,不再需要额外进行NAT转换。

在主机模式下不能publish port。

1)主机模式原理图

在这里插入图片描述

2)主机模式解析

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。

容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

容器共享宿主机网络ip,这样的好处是外部主机与容器可以直接通信。

  • 小拓展:

Docker启动时指定–network=host或-net=host,如果还指定了-p映射端口,此时就会有如下警告:

NARNING: Published ports are discarded when using host network mode

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。可以选择无视这个警告或者使用Docker的其他网络模式,例如–network=bridge

2.3 容器模式–container

1)容器模式原理图

在这里插入图片描述

2)容器模式解析

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。

新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围等。

两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

2.4 none模式

在none模式下,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、ip、路由等信息,只有一个lo接口。

lo标识代表禁用网络功能,即:127.0.0.1,本地回环的意思

需要我们自己为Docker容器添加网卡、配置IP等。
在这里插入图片描述

三、常用命令

在学习Docker 各种网络模式前,先要了解Docker 网络的常用命令。

2.1 查看网络

docker network ls

2.2 创建网络

# 基础用法
docker network create 网络名称

# 创建网络时是可以添加一系列参数的:
# --driver:驱动程序类型
# --gateway:主子网的IPV4和IPV6的网关
# --subnet:代表网段的CIDR格式的子网
# mynet:自定义网络名称
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet

不指定任何选项的时候默认的–driver(网络模式)也是bridge(桥接) 但是gateway和subnet会自动生成

2.3 查看网络数据源

docker network inspect 网络名称 

2.4 将容器连接到指定网络

docker network connect 网络名称 容器名称

2.5 断开容器的网络

docker network disconnect 网络名称 容器名称

2.6 删除所有不在使用的网络

docker network prune

2.7 删除一个或多个网络

docker network rm 网络名称 

四、使用示例

4.1 创建容器时挂载网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1

2)创建并运行容器时指定网络

docker run --name containerName -p 80:80 -d --network myNet1 myNginx

3)不想用时可以断开网络

docker network disconnect myNet1 myNginx

4.2 容器已存在时连接到新网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2

2)为容器连接新的网络

# 执行后myNginx容器的网络就变成了myNet2
docker network connect myNet2 myNginx

3)不想用时可以断开网络

docker network disconnect myNet2 myNginx

4.3 使用docker-compose给一组容器挂载网络

有如下docker-compose.yml文件。
一般来说此时使用如下面命令编排的一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中。

docker-compose up -d

这也是这一组容器之间可以直接使用服务名去直接通信的原因。

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
      
  mysql:
    image: mysql:8
    container_name: mysql-dev
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=89225300
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=gddst
      - MYSQL_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /usr/docker/docker/workspace/mysql/data:/var/lib/mysql
      - /usr/docker/docker/workspace/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - /usr/docker/docker/workspace/mysql/initdb:/docker-entrypoint-initdb.d

但是如果想要显示的指定网络,可以参考如下配置:

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

配置好网络后,在每个服务下可以指定使用的网络,这里就以nginx为例:

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - mynet
      
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

这样容器编排时,所有容器都会加入到mynet这个自定义网络当中了。

五、 docker网络端口映射

在Docker中,内网和外网映射是非常重要的概念。这篇文章将会为您介绍如何在Docker中进行内网和外网映射。Docker中,每个容器都有自己的IP地址,这个IP地址是在Docker内部使用,不可直接从外部访问。然而,为了在容器内运行的应用程序可以通过网络访问,我们需要对容器的端口进行映射。

对于内网映射,我们可以使用Docker的端口映射功能。这个功能可以将宿主机的端口映射到容器的端口,从而可以在宿主机的网络中访问容器内运行的应用程序。例如,我们可以使用下面的命令将宿主机的端口8080映射到容器的端口80:

docker run -p 8080:80 nginx

这个命令会启动一个NGINX容器,并将它的80端口映射到宿主机的8080端口。现在,我们可以在宿主机的浏览器中通过http://localhost:8080来访问容器内运行的NGINX。

另外,在进行内网映射时,我们也要注意容器内部的防火墙。在某些情况下,需要在容器内部打开端口才能访问容器内的应用程序。例如,我们可以使用下面的命令在容器内部 --expose 参数命令打开容器的端口暴露80
http://<宿主机IP>:80来访问容器内运行的

六、 docker 防火墙

Docker防火墙通常用于保护Docker容器中的应用程序免遭恶意攻击。防火墙通过过滤流入和流出的网络流量来维护应用程序的安全。在Docker中,防火墙相关的规则都是基于iptables来实现的。因此,使用Docker防火墙之前需要了解iptables的相关知识。
Docker防火墙中的主要配置文daemon.json。

/etc/docker/daemon.json
/etc/docker/conf.d/daemon.json

在这个配置文件中,可以定义防火墙规则和防火墙的默认行为。以下是一些常用的设置:

{
    "iptables": false,
    "ip-masq": true,
    "iptables-snat": true
}

在上面的配置文件中,“iptables”: false 表示关闭iptables,而其他两个选项则是启用iptables功能的设置。

构建Docker防火墙

构建Docker防火墙的步骤如下:

1. 安装iptables

首先需要安装iptables,可以使用以下命令进行安装:

sudo apt-get install iptables

2. 配置iptables规则

接下来需要配置iptables规则,以确保Docker容器中的应用程序可以安全地运行。以下是一个简单的iptables规则示例:

# 允许从所有地址接受TCP和UDP连接
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT

# 允许从特定地址接受SSH连接
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

# 允许从特定地址通过HTTP访问
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT

# 默认设置为DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

3. 添加规则至daemon.json

在添加规则至daemon.json文件之前,需要先确认防火墙的默认行为是否正确。通常情况下,推荐使用iptables的默认行为DROP。

接下来,需要在daemon.json文件中添加iptables规则:

{
    "iptables": true,
    "iptables-forward": true,
    "iptables-default": "DROP",
    "iptables-nat": false,
    "iptables-filter": [
        {
            "name": "allow-all",
            "rule": [
                "-j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        },
        {
            "name": "allow-ssh",
            "rule": [
                "-p tcp --dport 22 -j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        }
    ]
}

在上面的配置文件中,“iptables”: true 表示开启iptables,“iptables-default”: “DROP” 表示设置iptables默认行为为DROP,iptables-filter则是针对Docker容器的iptables规则,分别对应"allow-all"和"allow-ssh"两种规则,前者允许所有的流量,而后者允许SSH连接。

使用Docker防火墙

使用Docker防火墙是一项非常重要的操作,如果使用不当,可能导致应用程序无法运行或者被攻击。以下是一些使用Docker防火墙的技巧:

1. 允许特定端口

如果需要允许特定端口通过Docker防火墙,可以使用以下命令:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

2. 展示规则

可以使用以下命令来展示所有的iptables规则:

iptables -L

3. 修改规则

可以使用以下命令来修改iptables规则:

iptables -R INPUT 1 -p tcp --dport 22 -j DROP

4. 清除规则

可以使用以下命令来清除所有的iptables规则:

iptables -F

维护和优化Docker防火墙

维护和优化Docker防火墙是非常重要的,以下是一些可以使用的技巧:

1. 定期备份规则

由于iptables规则非常复杂,因此建议定期备份规则以免丢失数据。可以使用以下命令来备份规则:

iptables-save > /root/iptables.save

2. 清理旧规则

由于iptables规则非常复杂,建议定期清理旧规则以保持系统的健康。可以使用以下命令来清理旧规则:

iptables -L --line-numbers | grep DROP | awk '{print$1}' | xargs -I{} iptables -D INPUT {}

3. 压缩规则

iptables规则越多,系统负担也就越大。因此建议压缩规则以减少负担,以下是一个简单的压缩规则示例:

iptables-save | python -c "import re, sys; chain = ''; iptables = sys.stdin.readlines(); [print(f'{l.strip()}') if 'ACCEPT' in l or '\n' in l else exec(f'chain = re.match(r\'\:([A-Z]+)\', l).group(1)'); print(l.strip()) for l in iptables if l.strip() != '' ]" | iptables-restore

以上是一些Docker防火墙的维护和优化技巧,可以帮助用户更好地维护系统并优化iptables规则。

七、 测试网络端口

方法一、telnet

telnet ip port

方法二、ssh

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,在linux上可以通过ssh命令来测试端口的连通性,具体用法格式如下:

ssh -v -p port username@ip

说明:
-v 调试模式(会打印日志)
-p 指定端口
username:远程主机的登录用户
ip:远程主机

如果远程主机开通了相应的端口,会有如下图所示的建立成功的提示

在这里插入图片描述

如果远程主机没有开通相应的端口,则如下图所示
在这里插入图片描述

方法三、curl

curl是利用URL语法在命令行方式下工作的开源文件传输工具。也可以用来测试端口的连通性,具体用法:

curl ip:port

说明:
ip:是测试主机的ip地址
port:是端口,比如80

如果远程主机开通了相应的端口,都会输出信息,如果没有开通相应的端口,则没有任何提示,需要CTRL+C断开。。
在这里插入图片描述

方法四、wget

wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。wget名称的由来是“World
Wide Web”与“get”的结合,它也可以用来测试端口的连通性具体用法:
wget ip:port
说明:
ip:是测试主机的ip地址
port:是端口,比如80

如果远程主机不存在端口则会一直提示连接主机。
在这里插入图片描述
如果远程主机存在端口则会看到相应的信息,如下图所示。

在这里插入图片描述

八 docke容器网络常见问题

1.docker容器无法访问

vm宿主机无法访问容器;
虚拟机curl localhost也无法访问;
端口映射正常;
然后检查内核版本和docker版本也没问题;
然后重启docker包括容器,kill进程什么都试过了还是无济于事;

2.最终解决方案

systemctl stop docker # 停止docker 服务
pkill docker # 杀掉docker进程
iptables -t nat -F # 清理iptables
ip link set docker0 down # 停止docker0网卡
brctl delbr docker0 # 删除docker0网卡--重点!
systemctl start docker # 启动docker服务

最后证明果然是docker0网卡的问题,而且不删除掉网卡重启都没用,只能删除;

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

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

相关文章

阿里云轻量应用服务器_2核4G4M_2核2G3M_性能测评

阿里云轻量应用服务器2核2G3M带宽108元一年&#xff0c;系统盘为50GB高效云盘&#xff1b;轻量服务器2核4G4M带宽&#xff0c;60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动&#xff0c;阿里云百科分享阿里云轻量应用服务器入口&#xff1a; 目录 阿…

动态优先权算法

1.设计目的与要求 1.1设计目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 1.2设计要求 本实验要求学生独立地用C或C语言编写一个简单的进程管理程序&#xff0c;其主要部分是进程调度。调度算法可由学生自行选择&#xff0c;如基于动态优先级的调度算法…

FL Studio 21 for macOS-21.1.0.3267中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…

8.利用matlab完成 符号微积分和极限 (matlab程序)

1.简述 一、符号微积分 微积分的数值计算方法只能求出以数值表示的近似解&#xff0c;而无法得到以函数形式表示的解析解。在 MATLAB 中&#xff0c;可以通过符号运算获得微积分的解析解。 1. 符号极限 MATLAB 中求函数极限的函数是 limit&#xff0c;可用来求函数在指定点的…

Java 并发编程与CAS基本原理

一、Java并发基础知识 Java里的程序天生就是多线程的&#xff0c;那么有几种新启线程的方式&#xff1f; 两种,启动线程的方式只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start&#xff1b; 2、X implements Runnable&#xff1b;然后交给Thread运行。 Java…

IDEA的常用设置,让你更快速的编程

一、前言 在使用JetBrains的IntelliJ IDEA进行软件开发时&#xff0c;了解和正确配置一些常用设置是非常重要的。IDEA的强大功能和定制性使得开发过程更加高效和舒适。 在本文中&#xff0c;我们将介绍一些常用的IDEA设置&#xff0c;帮助您更好地利用IDEA进行开发。这些设置包…

Nonebot实战之编写插件1

前言 应粉丝群内粉丝要求&#xff0c;我也决定写一个Nonebot插件编写教程&#xff0c;从0开始教学。有些不对的地方也欢迎大家指正&#xff0c;修改。 开始 准备 合适的代码编辑器一定的python基础懂得提问的方式 代码编辑器 代码编辑器有很多种选择&#xff0c;比如 vsc…

基本逻辑门的工作原理、电路图、逻辑图、逻辑表达式等

与、或、与非、或非、异或门、三态门、OD门&#xff08;OC门&#xff09;和传输门等的结构与使用 逻辑门是基于半导体器件形成的&#xff0c;开始学习逻辑门之前应具备半导体器件的相关知识 可阅读如下文章进行先导学习 半导体器件&#xff1a; https://blog.csdn.net/weixi…

彻底卸载Android Studio

永恒的爱是永远恪守最初的诺言。 在安装Android Studio会有很多问题导致无法正常运行&#xff0c;多次下载AS多次错误后了解到&#xff0c;删除以下四个文件才能彻底卸载Android Studio。 第一个文件&#xff1a;.gradle 路径&#xff1a;C:\Users\yao&#xff08;这里yao是本…

下载程序到西门子PLC

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 下载西门子200PLC程序分以下两步&#xff1a; 一.编译程序 1. 如下图1-1所示&#xff0c;使用PPI电缆将PLC和电脑连接上&#xff0c;注意笔记本使用USB转PPI电缆&#xff0c;连接保证给PLC单独供…

什么是gRPC?

1. GRPC是google开源的rpc框架 2. 核心是一个.proto的服务描述文件 3. 添加依赖的grpc相关的包&#xff0c;配置IDEA的grpc插件&#xff0c;就可以很方便的生成调用代码 4. 通过在IDEA的protobuf插件上分别执行以下两个服务&#xff0c;就可以生成需要的调用代码 1&#xff…

阿里云轻量应用服务器使用教程_创建配置_远程连接_网站上线

阿里云轻量应用服务器怎么使用&#xff1f;阿里云百科分享轻量应用服务器从选择创建、配置建站环境、轻量服务器应用服务器远程连接、开端口到网站上线全流程&#xff1a; 目录 阿里云轻量应用服务器使用教程 步骤一&#xff1a;购买一台轻量应用服务器 步骤二&#xff1a;…

Android核心开发之——OpenGL

OpenGL是一种用于编程计算机图形的应用程序编程接口&#xff08;API&#xff09;。它提供了一系列函数和方法&#xff0c;用于绘制2D和3D图形&#xff0c;以及进行渲染和图形处理。OpenGL可以跨平台使用&#xff0c;支持各种操作系统和硬件设备。它被广泛应用于游戏开发、虚拟现…

Java并发编程(五)线程同步 下 [CAS/原子类/同步容器类/同步工具类]

CAS 概述 CAS全称为Compare-And-Swap。它是一条CPU的原子指令,是硬件对于并发操作共享数据的支持。其作用是CPU在某个时刻比较两个值是否相等 核心原理&#xff1a;在操作期间CAS先比较下主存中的值和线程中工作内存中的值是否相等,如果相等才会将主存中的值更新为新值&…

Golang服务的请求调度

文章目录 1. 写在前面2. SheddingHandler的实现原理3. 相关方案的对比4. 小结 1. 写在前面 最近在看相关的Go服务的请求调度的时候&#xff0c;发现在gin中默认提供的中间件中&#xff0c;不含有请求调度相关的逻辑中间件&#xff0c;去github查看了一些服务框架&#xff0c;发…

任我行 CRM SQL注入漏洞复现(HW0day)

0x01 产品简介 任我行CRM&#xff08;Customer Relationship Management&#xff09;是一款专业的企业级CRM软件&#xff0c;旨在帮助企业有效管理客户关系、提升销售效率和提供个性化的客户服务。 0x02 漏洞概述 任我行 CRM SmsDataList 接口处存在SQL注入漏洞&#xff0c;未…

2023HVV最新0day、1day消息含POC、EXP

点击"仙网攻城狮”关注我们哦~ 不想当研发的渗透人不是好运维 让我们每天进步一点点 简介 2023HW-8月10号0day、1day漏洞汇总&#xff0c;包含以下漏洞需要自取。 链接&#xff1a;https://pan.baidu.com/s/1duOyDNjYBPKfC5eB9ZHA2Q 提取码&#xff1a;6666 通达OA sql注入…

JavaWeb课程学习--Day01

HTML 建立css文件&#xff1a; css使用方式&#xff1a; <span>...</span>无语意包裹标签 css中的三种选择器&#xff1a; 注意&#xff1a;播放视音频时要留出播放空间 盒子模型&#xff1a; 表格标签&#xff1a; 以上表格&#xff1a; 表单标签&#xff1a; 表…

form表单构造http请求的写法

from是html的一个标签&#xff0c;from是html后早http请求的一种方式&#xff0c;它和input标签密切配合。 from有两个基本属性action和method&#xff0c;action就是http请求url中的路径部分。method就是构造的http请求的方法。 form和input标签配合构造键值对&#xff0c;键值…