docker网络介绍

  大量的互联网应用服务需要多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。
  docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络。docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网
络服务,在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的。

  docker安装时,会自动在host上创建三个网络:

[root@localhost ~]# docker network list/ls
NETWORK ID NAME DRIVER SCOPE
979fbb278d03 bridge bridge local
e3852e4d242e host host local
70b78b4570c6 none null local

docker--none网络

    none网络就是什么都没有的网络,挂在这个网络下的容器除了lo,没有其他任何网卡,容器创建时,可以通过 --network=none 指定使用 none 网络。

[root@localhost ~]# docker run -it --network=none busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever

    none网络的应用:封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用none 网络。比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

当然大部分容器是需要网络的,我们接着看 host 网络。

docker--host网络

    连接到host网络的容器,共享 docker host 的网络栈,容器的网络配置与host一样,可以通过 --network=host 指定使用host网络。

[root@localhost ~]# docker run -it --network=host busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast qlen
link/ether :0c::fa:cf: brd ff:ff:ff:ff:ff:ff
inet 192.168.42.30/ brd 192.168.42.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fefa:cf23/ scope link
valid_lft forever preferred_lft forever
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue
link/ether ::d4:ac:3b: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80:::d4ff:feac:3b55/ scope link
valid_lft forever preferred_lft forever
: veth80d568f@if62: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether :ed:::f2: brd ff:ff:ff:ff:ff:ff
inet6 fe80::30ed:4ff:fe82:f273/ scope link
valid_lft forever preferred_lft forever
: veth6a18c66@if66: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 1e::3b:4c:9b:a4 brd ff:ff:ff:ff:ff:ff
inet6 fe80::1c84:3bff:fe4c:9ba4/ scope link
valid_lft forever preferred_lft forever
: veth049b197@if68: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 1e:f1:4b:c1:f6:ff brd ff:ff:ff:ff:ff:ff
inet6 fe80::1cf1:4bff:fec1:f6ff/ scope link
valid_lft forever preferred_lft forever
: vethed43fa8@if70: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether c2:d3:b0::e4: brd ff:ff:ff:ff:ff:ff
inet6 fe80::c0d3:b0ff:fe25:e488/ scope link
valid_lft forever preferred_lft forever
: veth48839bd@if72: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 3e:5e::::7d brd ff:ff:ff:ff:ff:ff
inet6 fe80::3c5e:3ff:fe10:787d/ scope link
valid_lft forever preferred_lft forever
: vethb9e42c7@if74: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether ae::c9:bb:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::ac11:c9ff:febb:/ scope link
valid_lft forever preferred_lft forever
: veth04ba522@if78: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 3e:1d::5c:: brd ff:ff:ff:ff:ff:ff
inet6 fe80::3c1d:14ff:fe5c:/ scope link
valid_lft forever preferred_lft forever

  在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host网络的使用场景又是什么呢?

  直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,就可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host上已经使用的端口就不能再用了。Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables。

docker--bridge网络

docker在安装时会创建一个docker0的linux bridge网桥,不指定网络会默认挂到docker0上。
[root@localhost ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.0242d4ac3b55    no        veth049b197
veth04ba522 [root@localhost ~]# docker run -it --network=bridge busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if81: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.9/ brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever veth04ba522与eth0@if81是一对veth pair。
eth0@if34 已经配置了 IP 172.17.0.2的原因:bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1,在docker0上。容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器使用
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "979fbb278d03596b502fb8d02d22d1e8fc42f6a8beb7602ba6eecb08bdf512ec",
"Created": "2019-06-18T16:43:55.651454994+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]

创建 user--defined网络

  我们可以通过 bridge 创建类似前面默认的 bridge 网络。

  (1)利用bridge驱动创建名为my-net2网桥(docker会自动分配网段)

[root@localhost ~]# docker network create --driver bridge my-net2
b326209167c6dbb7e867659bbfa266615bf9312632fbdbaa83e35a5d48825867

  (2)查看当前网络结构变化

[root@localhost ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
979fbb278d03 bridge bridge local
e3852e4d242e host host local
b326209167c6 my-net2 bridge local
70b78b4570c6 none null local

  (3)查看容器bridge网桥配置(bridge就是容器和网桥形成一对veth pair)

[root@localhost ~]# docker network inspect my-net2
[
{
"Name": "my-net2",
"Id": "b326209167c6dbb7e867659bbfa266615bf9312632fbdbaa83e35a5d48825867",
"Created": "2019-06-18T19:41:51.182792345+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}

  (4)利用bridge驱动创建名为my-net3网桥(user-defined网段及网关)

[root@localhost ~]# docker network create --driver bridge --subnet 172.18.2.0/ --gateway 172.18.2.1 my-net3
Error response from daemon: Pool overlaps with other one on this address space
这是因为新创建的网络自定义的子网ip与已有的网络子网ip冲突。只需要重新定义子网ip段就可以。
[root@localhost ~]# docker network create --driver bridge --subnet 172.20.2.0/ --gateway 172.20.2.1 my-net3
f021bec39166a23f449dd04e17977f77ce0c817ae7c0e21d97431a0679375351

  (5)启动容器使用新建的my-net3网络

[root@localhost ~]# docker run -it --network=my-net3 busybox /bin/sh
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.2/ brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever

  (6)启动容器使用my-net3网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)

[root@localhost ~]# docker run -it --network=my-net3 --ip 172.20.2.120 busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if93: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.120/24 brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever

  (7)让已启动不同vlan的ningx容器,可以连接到my-net2(其实在nigx中新建了my-net2的网卡)

[root@localhost ~]# docker run -itd --network=my-net3 busybox /bin/sh
377f3157bfd48ef38997c0bf12fc86e0cf30a4fe42c50213ff1108854848df14
[root@localhost ~]# docker network connect my-net2 377f3157bfd4
[root@localhost ~]# docker exec -it 377f3157bfd4 /bin/sh
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if107: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.20.2.3/ brd 172.20.2.255 scope global eth0
valid_lft forever preferred_lft forever
: eth1@if109: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/ brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
此容器同时拥有了net2和net3的子网ip。

  (8)使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined 网络,默认的 bridge 网络是无法使用 DNS 的.

[root@localhost ~]# docker run -itd --network=my-net2 --name=b1 busybox
9b3be1daeca760f6cc5eb62fbd4142c72efc3c07be5b70c56059da7946751101
[root@localhost ~]# docker run -itd --network=my-net2 --name=b2 busybox
ba94b2359471d16b6a8e12025c99245d1ab6af123b346641128f081b031d71bc
[root@localhost ~]# docker exec -it b1 /bin/sh
/ # ping b2
PING b2 (172.18.0.5): data bytes
bytes from 172.18.0.5: seq= ttl= time=0.150 ms [root@localhost ~]# docker exec -it b2 /bin/sh
/ # ping b1
PING b1 (172.18.0.4): data bytes
bytes from 172.18.0.4: seq= ttl= time=0.059 ms

在创建容器时使用相同网络,并且给容器命名。意思是给两个容器之间做了域名解析和配置相同网段,所以能ping通。

  (9)容器之间的网络互联

    a). 首先创建一个 db 容器

[root@localhost ~]# docker run -itd --name db busybox

    b). 创一个 web 容器,并使其连接到 db

[root@localhost ~]# docker run -itd --name web --link db:dblink busybox /bin/sh

-link db:dblink 实际是连接对端的名字和这个链接的名字,也就是和 db 容器 建立一个叫做 dblink 的链接

    c).查看链接的情况

 [root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
141e370eea76 busybox "/bin/sh" 8 seconds ago Up 7 seconds web
9f89a1945f6b busybox "sh" 54 seconds ago Up 53 seconds db 

    d)进入web容器,使用 ping 命令来测试网络链接的情况

[root@localhost ~]# docker exec -it 141e370eea76 /bin/sh/ 
# ping db
PING db (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.445 ms
发现可以ping通,连接有效

    e)尝试进入db容易,使用ping命令测试

[root@localhost docker]# docker exec -it 9f89a1945f6b /bin/sh
/ # ping web
ping: bad address 'web'
发现无法ping通,因此可以推断出容器之间的网络连通是单向的,即哪个容器建立了连接,哪个容易才能连接到另一个容器,反之不行

  (10)容器端口映射 在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容 器内部的网络应用和服务的

当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射

-P : Docker 会随机映射一个 49000 ~ 49900 的端口到容器内部开放的网络端口

p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。

支持的格式有

iP : HostPort  : ContainerPort

IP : : ContainerPort

IP : HostPort :

如果不指定就随机

查看映射

docker port 容器名

拓展:用脚本删除所有容器

[root@localhost docker]# for id in `docker ps -a | grep a | awk -F " +" '{print $1}'` ;do docker rm -f $id ;done

    a)映射所有接口地址,此时绑定本地所有接口上的 5000 到容器的 5000 接口, 访问任何一个本地接口的 5000 ,都会直接访问到容器内部

docker run -dti -p 5000:5000 nginx /bin/bash

    b)多次使用可以实现多个接口的映射

[root@localhost docker]# docker run -itd -p 5000:22 -p 5001:23 nginx /bin/bash

查看容器信息,发现新容器的的22,23端口都映射到了宿主机的5000和5001端口。

[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea3b9412d96d nginx "/bin/bash" 5 seconds ago Up 5 seconds 80/tcp, 0.0.0.0:5000->22/tcp, 0.0.0.0:5001->23/tcp hardcore_darwin

    c)映射到指定地址的指定接口 此时会绑定本地 192.168.4.169 接口上的 5000 到容器的80 接口

docker run -dti -p 192.168.253.9:5000:80 nginx /bin/bash

 
[root@localhost docker]#  docker run -dti -p 192.168.253.9:5000:80 nginx /bin/bash
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
132746ef0996 nginx "/bin/bash" About a minute ago Up About a minute 192.168.253.9:5000->80/tcp practical_lichterman

    d) 映射到指定地址的任意接口 此时会绑定本地 192.168.4.169 接口上的任意一个接口到容器的 5000 接口

docker run -dti -p 192.168.4.169::5000 nginx /bin/bash

    e) 使用接口标记来指定接口的类型

docker run -dti -p 192.168.4.169::5000/UDP nginx /bin/bash

指定接口位udp类型

  (11)实验:通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web

    a)将容器80端口映射到主机8080端口,注意末尾不要加环境变量

docker run -itd -p 80:80 --name nginx nginx:latest    

    b) 查看刚运行docker

docker ps -a

[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0382dfbbd606 nginx:latest "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp nginx

    c) 进入容器

docker exec -it nginx /bin/sh,并在 容器内部编辑网页文件 index.html

# cd /usr/share/nginx/
# ls
html
# cd html
# ls
50x.html index.html
# echo '123' > index.html

    d)到宿主机上打开浏览器输入 IP:PORT 访问验证

http://192.168.253.9:80

一些报错:

1)[root@localhost /]# docker run -itd --name busy busybox:latest /bin/bash
e105747eb16e52da2637379d75e221f46812955c929696234abbf1321fd56da3
docker: Error stat /bin/bash: no such file or directory": unknown

这是因为环境变量不可用,换成/bin/sh或者不加环境变量

2)[root@localhost /]# docker run -itd --name busy busybox:latest /bin/sh
docker:
Error response from daemon: Conflict. The container name "/busy" is
already in use by container
"e105747eb16e52da2637379d75e221f46812955c929696234abbf1321fd56da3". You
have to remove (or rename) that container to be able to reuse that name.

这是因为容器名已经存在,需要删除已经存在的容器名

3)[root@localhost /]# docker network create --driver bridge my-net2
Error networks have overlapping IPv4

这是因为网桥冲突,删除冲突的网桥。
brctl delbr 网桥
systemctl restart docker

4)error:executable file not found in $PATH": unknown
这是因为命令的顺序错误

5)root@localhost /]# docker run -it --network=my-net3 --ip 192.168.253.13 busybox:latest /bin/sh
docker: Error response from daemon: Invalid address 192.168.253.13: It does not belong to any of this network's subnets.
这是因为自定义的ip不在可使用ip的范围内。

6)Error No chain/target/match by that name.
这是因为没有重启docker,或者关闭firewalld和iptables(不建议)

7)docker: Error response from daemon: driver failed programming
external connectivity on endpoint vibrant_kepler
(0838e9c00e2ffcec24bbd333000cc4de9bd0fa2420c1c330ddb77dfd9d1d534f): Bind for 192.168.253.9:5000 failed: port is already allocated.

这是因为宿主机的端口已经被别的服务占用。

8)宿主机映射到容器之后,使用宿主机ip:port来访问容器的httpd或者nginx服务

报错连接被拒绝

这是因为端口映射的时候加入了环境变量,去掉环境变量即可。

网络排查命令:

iptables -t nat -L

ip r

tcpdump -i docker0 -n icmp

tcpdump -i eth0 -n icmp

  

docker网络(3)的更多相关文章

  1. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. docker网络配置方法总结

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  3. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  4. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  5. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  6. docker网络解析

    Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...

  7. docker网络访问(三)

    docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...

  8. [Docker网络]模拟一台交换机的拓扑

    [Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...

  9. Docker 网络之理解 bridge 驱动

    笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...

  10. Docker 网络之进阶篇

    笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...

随机推荐

  1. java_八大数据类型

    一.整型 1.byte  1个字节(8位--一个字节占8位)-128~127 2.short  2个字节  -32768~32767 3.int      4个字节(常用) 4.long   8个字节 ...

  2. idea仿eclipse的export导出功能

    自从开发工具从eclipse切换到idea来之后,才知道什么叫做'真香'.idea强大的扩展功能极大的拓展了他的可用性,最近有个功能就是通过idea的扩展插件搞定的. 事情是这样的,朋友使用eclip ...

  3. Ubuntu系统---安装Caffe (+OpenCV+Python+CPU-only)

    安装配置Ubuntu14.04+Caffe (+OpenCV+Python+CPU-only) 记录 [作者:Wu Ping.时间:20180428.] 本人已经安装很多次的Caffe了:从开始的初探 ...

  4. spring 的自动定时任务

    spring的自动定时任务有两种 第一种:通过xml配置来设置 需要在xml中引入新的约束,并且需要配置<task:scheduled-tasks> ,主要配置内容如下: <?xml ...

  5. Python 去除字符串中的空行

    Python 去除字符串中的空行 mystr = 'adfa\n\n\ndsfsf' print("".join([s for s in mystr.splitlines(True ...

  6. [USACO19JAN]Train Tracking 2——神仙结论题+DP

    原题链接 orz xzz巨佬 首先发现一个结论:两个相邻的\(c\)值如果不相同的话,就可以固定某个位置的值了 这启示我们把连续且相等的\(c\)给单独拿出来看,也就是对于一些\(c_i=c_{i+1 ...

  7. 2-删除IPC$的方式

    一.使用命令临时删除IPC$的方式 1.查看IPC$是否启用 命令:net share 2.删除IPC$功能 命令:net share ipc$ /delete 注:使用命令删除后,重启服务器后,IP ...

  8. 【转】深入理解Spring的两大特征(IOC和AOP)

    原文链接:https://blog.csdn.net/gloomy_114/article/details/68946881 众所周知,Spring的核心特性就是IOC和AOP,IOC(Inversi ...

  9. 包过滤防火墙iptables(网络层)

    安装: yum -y install iptables-services 启动:systemctl start iptables.service 四表五链 过滤:filter - input forw ...

  10. detach([expr]) 从DOM中删除所有匹配的元素。

    detach([expr]) 概述 从DOM中删除所有匹配的元素.大理石构件 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.与remove()不同的是,所有绑定 ...