一些其他概念
veth-pair:就是一对的虚拟设备接口;它常常充当着一个桥梁,连接着各种虚拟网络设备,典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等 网络栈:包括了所有网络底层接口、在其上配置接口的数据链路和网络设备之间的相互关系
网卡混杂模式:【Promiscuous Mode】指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。是相对于通常模式(又称“非混杂模式”)而言的。
网卡子接口:【sub-interface】是通过协议和技术将一个物理接口【interface】虚拟出来的多个逻辑接口。相对子接口而言,这个物理接口称为主接口。每个子接口从功能、作用上来说,与每个物理接口是没有任何区别的,它的出现打破了每个设备存在物理接口数量有限的局限性。在路由器中,一个子接口的取值范围是0~4096个,当然受主接口物理性能限制,实际中并无法完全达到4096个,数量越多,各子接口性能越差。
原生网络
概念
模式:docker在安装完成后的默认3种模式(bridge、host、none)
docker0:当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上;虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中;docker0的IP地址为172.12.0.1
[root@docker_node1 ~]
NETWORK ID NAME DRIVER SCOPE
ec3cb1ba1836 bridge bridge local
a59f9b8833dd host host local
63606b4045c6 none null local
[root@docker_node1 ~]
……
docker0: flags=4163<UP, BROADCAST, RUNNING, MULTICAST> mtu 1500
inet 172. 17. 0. 1 netmask 255. 255. 0. 0 broadcast 172. 17. 255. 255
inet6 fe80::42:ff:fe28:f098 prefixlen 64 scopeid 0x20<link>
ether 02:42:00:28:f0:98 txqueuelen 0 ( Ethernet)
RX packets 115 bytes 17106 ( 16. 7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 199 bytes 15813 ( 15. 4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
……
原生bridge模式
默认模式:在创建容器时,如果不设置网络模式,默认分配为birdge模式。
网络模式:此模式会为每一个容器自动分配、设置IP地址等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信
内核地址转换:容器访问外网,注意开启内核地址转换功能
IP地址分配:默认情况下,IP地址是自动增加的,从172.17.0.1后开始,依次递增增加
[root@docker_node1 ~]
[root@docker_node1 ~]
[root@docker_node1 ~]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e60d1d3f4885 game2048 "/bin/sh -c 'sed -i …" 21 minutes ago Up 21 minutes 80/ tcp, 443/ tcp vm2
29f238052aeb nginx "nginx -g 'daemon of…" 26 minutes ago Up 26 minutes 80/ tcp vm1
[root@docker_node1 ~]
bridge name bridge id STP enabled interfaces
docker0 8000. 02420028f098 no veth1a18ccd
veth6d42a11
[root@docker_node1 ~]
0
[root@docker_node1 ~]
[root@docker_node1 ~]
root@942eb994347a:/
PING www. a. shifen. com ( 220. 181. 38. 149) 56( 84) bytes of data .
64 bytes from 220. 181. 38. 149: icmp_seq=1 ttl=127 time=36. 5 ms
64 bytes from 220. 181. 38. 149: icmp_seq=2 ttl=127 time=36. 1 ms
^C
-- - www. a. shifen. com ping statistics -- -
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/ avg/ max/ mdev = 36. 172/ 36. 361/ 36. 551/ 0. 268 ms
host模式
网络模式:容器与宿主机使用同一块网卡,处在同一个网络栈中,没有独立IP地址。通常Docker常见容器时会使用linux核心的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
[root@docker_node1 opt]
1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127. 0. 0. 1/ 8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/ 128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ ether 52:54:00:7e:9f:aa brd ff:ff:ff:ff:ff:ff
inet 192. 168. 27. 21/ 24 brd 192. 168. 27. 255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe7e:9faa/ 64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO- CARRIER, BROADCAST, MULTICAST, UP> mtu 1500 qdisc noqueue state DOWN group default
link/ ether 02:42:00:28:f0:98 brd ff:ff:ff:ff:ff:ff
inet 172. 17. 0. 1/ 16 brd 172. 17. 255. 255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:ff:fe28:f098/ 64 scope link
valid_lft forever preferred_lft forever
[root@docker_node1 opt]
root@docker_node1:/
1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127. 0. 0. 1/ 8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/ 128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ ether 52:54:00:7e:9f:aa brd ff:ff:ff:ff:ff:ff
inet 192. 168. 27. 21/ 24 brd 192. 168. 27. 255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe7e:9faa/ 64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO- CARRIER, BROADCAST, MULTICAST, UP> mtu 1500 qdisc noqueue state DOWN group default
link/ ether 02:42:00:28:f0:98 brd ff:ff:ff:ff:ff:ff
inet 172. 17. 0. 1/ 16 brd 172. 17. 255. 255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:ff:fe28:f098/ 64 scope link
valid_lft forever preferred_lft forever
none模式
网络模式:该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,通常在容器并不需要网络的时候开启(例如只需要写磁盘卷的批处理任务),保证容器安全。
[root@docker_node1 ~]
root@02be4bbd8be3:/
1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127. 0. 0. 1/ 8 scope host lo
valid_lft forever preferred_lft forever
自定义网络
区分模式
单机(单机):bridge
集群(跨主机):overlay、macvlan
自定义bridge模式
自定义与原生bridge的区别:
自定义可以设置网络地址段的信息,如添加subnet、gateway
通常只有设定了subnet、gateway的bridge网络模式,才可以给容器设置此地段的任意IP地址
自定义bridge自带DNS解析(容器名与IP解析),可以通过容器名解析地址,方便使用
[root@docker_node1 ~]
ee40c815b17a61ba428c23358f894e35a4fdc412bd39524e9a08491902da6163
[root@docker_node1 ~]
NETWORK ID NAME DRIVER SCOPE
ec3cb1ba1836 bridge bridge local
a59f9b8833dd host host local
63606b4045c6 none null local
ee40c815b17a vm_net1 bridge local
[root@docker_node1 ~]
root@c4a0a3de02e4:/
1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127. 0. 0. 1/ 8 scope host lo
valid_lft forever preferred_lft forever
100: eth0@if101: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ ether 02:42:01:01:01:64 brd ff:ff:ff:ff:ff:ff
inet 1. 1. 1. 100/ 24 brd 1. 1. 1. 255 scope global eth0
valid_lft forever preferred_lft forever
root@c4a0a3de02e4:
[root@docker_node1 ~]
root@edd4dc4ac070:/
PING vm1 ( 1. 1. 1. 100) 56( 84) bytes of data .
64 bytes from vm1. vm_net1 ( 1. 1. 1. 100) : icmp_seq=1 ttl=64 time=21. 4 ms
64 bytes from vm1. vm_net1 ( 1. 1. 1. 100) : icmp_seq=2 ttl=64 time=0. 058 ms
^C
-- - vm1 ping statistics -- -
2 packets transmitted, 2 received, 0% packet loss, time 1017ms
rtt min/ avg/ max/ mdev = 0. 058/ 10. 769/ 21. 480/ 10. 711 ms
容器通信
同一主机,不同网段容器通信
原因:正常情况下,不同网段的容器时不能通信的,因为不是桥接在同一块网卡
实现方式:不同网段容器互通信方式,在容器中添加新的同一网段网卡
[root@docker_node1 ~]
d0d1fbfeb5795a637d5f0795c582d6134928ee42c8dfe5a6c755d91749530ad9
[root@docker_node1 ~]
NETWORK ID NAME DRIVER SCOPE
ec3cb1ba1836 bridge bridge local
a59f9b8833dd host host local
63606b4045c6 none null local
ee40c815b17a vm_net1 bridge local
d0d1fbfeb579 vm_net2 bridge local
[root@docker_node1 ~]
root@6500bd9f67f2:/
ping: unknown host vm1
root@6500bd9f67f2:/
PING 1. 1. 1. 100 ( 1. 1. 1. 100) 56( 84) bytes of data .
^C
-- - 1. 1. 1. 100 ping statistics -- -
3 packets transmitted, 0 received, 100% packet loss, time 2010ms
root@6500bd9f67f2:/
[root@docker_node1 ~]
[root@docker_node1 ~]
root@6500bd9f67f2:/
1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127. 0. 0. 1/ 8 scope host lo
valid_lft forever preferred_lft forever
105: eth0@if106: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ ether 02:42:02:02:02:c8 brd ff:ff:ff:ff:ff:ff
inet 2