相关文章:
《Linux 虚拟网络设备 veth-pair》 linux基础
《Linux虚拟网络设备之veth(arp incomplete)》
Docker网络(veth、网桥、host、container、none) docker上网络概述
Docker的网络配置 1 初识 docker 精讲
Docker的网络配置 2 配置 DNS和主机名
Docker的网络配置 3 user-defined网络
Docker的网络配置 4 内嵌的DNS server
Docker的网络配置 5 将容器与外部世界连接
Docker的网络配置 6 docker-proxy
【云原生】网络之桥接(网卡对) openshift下的网络桥接模式
docker网络模式
docker安装后会自动创建3种网络:bridge
、host
、none
。
查看docker的网络有哪些:
# docker network ls
NETWORK ID NAME DRIVER SCOPE
eddae4cf1bad docker0 bridge local
34b7574b98c2 host host local
00f4601cd1c0 none null local
drive表示参数类型,然后 类型 为bridge的,对应Name是docker0的,就是我们想要的
Docker在启动时会开启一个虚拟网桥设备(Linux bridge) docker0
,随机分配一个本地未占用的私有号段(记住,正式这个私有号段,导致主机外的应用都无法识别)。默认的地址为172.17.0.1/16
,如果不指定--network
,容器启动后都会被桥接到docker0
上,并自动分配到一个ip地址,然后逐渐递增。
我们来查看docker0:
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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 qlen 1000
link/ether fa:16:3e:03:7b:9d brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe03:7b9d/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:aa:f3:94:c9 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:aaff:fef3:94c9/64 scope link
valid_lft forever preferred_lft forever
看第三条 docker0,并且 inet 172.17.0.1/16
bridge网络
默认连接docker0
这个网桥(brctl
命令在centos中可以使用,yum install bridge-utils来安装)。
[root@EMS3 ~]# brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0242aaf394c9 no
启动并且运行一个容器:
[root@EMS3 ~]# docker run --name kubia-container -p 8081:8081 -d docker.artnj.test.com.cn/cci/kubia:v3
1b722efa3e8fbf2dabb74a482788f427a1fa4a44181b502c6dce5b66306f795d
[root@EMS3 ~]# docker ps|grep kubia
1b722efa3e8f docker.artnj.test.com.cn/cci/kubia:v3 "node app.js" 31 seconds ago Up 29 seconds 0.0.0.0:8081->8081/tcp kubia-container
[root@EMS3 ~]# docker exec -it 1b722efa3e8f sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
398: eth0@if399: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.10/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:a/64 scope link
valid_lft forever preferred_lft forever
在容器内查看ip addr ,我们可以看到容器已经获取了一个地址为:172.17.0.10/16
的地址。它和主机的docker0
的接口地址是在同一个网络
,并且将主机docker0
的接口地址设置成为了网关
(可以使用route -n来查看)。容器内有一个网卡eth0@if399
返回物理主机上查看网桥docker0,这时候我么可以看到已经多了一个接口veth6f3287d
。可以使用:brctl show docker0来查看:
[root@EMS3 ~]# brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0242aaf394c9 no veth6f3287d
Bridge 桥接模式的实现步骤主要如下:
-
Docker Daemon 利用
veth pair
技术,在宿主机上创建两个虚拟网络接口设备。veth pair
是一种成对出现的特殊的网络设备,可以把他们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if399
)在容器中,另一头(veth6f3287d
)挂在网桥docker0
上,无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。 -
Docker Daemon 将
veth6f3287d
附加到 Docker Daemon 创建的 docker0
网桥上。保证宿主机的网络报文可以发往 veth0; -
Docker Daemon 将
veth6f3287d
添加到 Docker Container 所属的namespace
下,并被改名为
eth0@if399
。如此一来,保证宿主机的网络报文若发往veth6f3287d
,则立即会被eth0@if399
接收,实现宿主机到Docker Container网络的联通性;同时,也保证 Docker Container单独
使用eth0@if399
,实现容器网络环境的隔离性
我们看一下bridge网络的配置信息
```bash
# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "d6179376f0c4dc0af7090be5d751ce53af44122b743a975fe193f216705c2e54",
"Created": "2024-04-07T09:11:11.431449886+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": true,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
},
{
"Subnet": "2022:711::/112",
"Gateway": "2022:711::1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"1dff3550d16f3b633c2f1385b25d0cd835ea47753d0cfcc0de2932c4130a4723": {
"Name": "kubia-container5", //Containers列表 是你启动在当前网桥下的docker
"EndpointID": "08b3f84ac1b631babc59236e416a94d383178fbcf5d5e7e2a22a88d6a0de377d",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": "2022:711::2/112"
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
原来的bridg
网络配置的·subnet·就是172.17.0.0/16
,并且网关是172.17.0.1
,这个网关就是docker0
。
Bridge桥接模式的缺陷:
1.最明显的是,该模式下 Docker Container 不具有一个公有 IP(前文讲过,是私有的号段),即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信,而必须要经过NAT的转换.
假设存在物理机A、B,在A上有容器c1,那么A可以直接和c1通信;而B无法与c1直接通信(可以通过NAT的转换后间接通信)。
2.虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。
3.另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。