Docker 容器网络模式简介

Docker 容器网络模式简介

Bridge 桥模式

​ Docker 容器启动时默认的 网络模式,如果不使用–network 指定网络模式,那么docker会为该容器创建一个网桥,用于连接该容器网络和主机网卡设备.

​ 此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

​ 创建一个后台容器,并查看网卡信息 与 宿主机 的网桥 做对比; 明显看出 bridge 模式 下 docker 会 在docker0 网桥下创建一对 veth 设备 作为 容器与桥 的连接,270 –> 271

1
2
3
4
5
6
7
8
9
10
11
12
13
# docker run -d --name test_bridge --network=bridge busybox tail -f /dev/null
# bridge link show
271: veth3d1d764 state UP @(null): <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master docker0 state forwarding priority 32 c
ost 2
# docker exec -i test_bridge ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
270: eth0@if271: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
| Host | Container 1 | Container 2 |
| | | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| | Newwork Protocol Stack | | | Newwork Protocol Stack | | | Newwork Protocol Stack | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| ↑ ↑ | ↑ | ↑ |
|............|.............|.....................................|...................|.....................|....................|....................|
| ↓ ↓ | ↓ | ↓ |
| +------+ +--------+ | +-------+ | +-------+ |
| |.3.101| | .9.1 | | | .9.2 | | | .9.3 | |
| +------+ +--------+ +-------+ | +-------+ | +-------+ |
| | eth0 | | docker0|<--->| veth | | | eth0 | | | eth0 | |
| +------+ +--------+ +-------+ | +-------+ | +-------+ |
| ↑ ↑ ↑ | ↑ | ↑ |
| | | +-------------------------------------------+ | | |
| | ↓ | | | |
| | +-------+ | | | |
| | | veth | | | | |
| | +-------+ | | | |
| | ↑ | | | |
| | +-------------------------------------------------------------------------------|--------------------+ |
| | | | |
| | | | |
| | | | |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+

Physical Network (192.168.3.0/24)

Host 模式

这个模式下,容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
创建一个容器,并查看ip, 信息与宿主机一致,二者公用同一个网络命名空间

1
docker run -i --network=host busybox ip a

None 模式

这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

创建一个容器,查看该容器的 Network Namespace, 05 是上面 bridge 的, default 是docker容器本身的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -d --name test_none --network=none busybox tail -f /dev/null
docker inspect test_none
...
"NetworkSettings": {
"Bridge": "",
"SandboxID": "03240dad926fe76937281421fd32703e5a7c9e0e828c6cccb18b43f5194dda1e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/03240dad926f",
...
ls /var/run/docker/netns
03240dad926f 0573eb6fb3e6 default

Container 模式

​ 这个模式下,指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

使用test_bridge 容器网络,创建一个新容器,并比较二者网络信息,二者公用一块虚拟网卡都是 271
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# docker run -d --name test_none --network=container:test_bridge busybox tail -f /dev/null
# docker exec -i test_bridge ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
270: eth0@if271: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# docker exec -i test_container ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
270: eth0@if271: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

User 自定义

该模式下,使用docker network 命令 创建自定义的网络,处于该网络下的docker可以通过 container名称进行通信,这里不能在使用busybox作为测试imgae需要使用完整的linux系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个isolated_nw 的孤立网络,并配置子网信息
docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
# 创建一个容器,使用isolated_nw 网络,并指定ip地址
docker run --network=isolated_nw --ip=172.25.3.3 -itd --name=test_user1 linkage_img
# 创建一个容器,并连接到isolated_nw
docker run -itd --name test_user2 --network=isolated_nw linkage_img
docker network connect isolated_nw test_user2
# 测试使用 docker name 按名字通信
docker exec -i test_user2 ping -w 4 test_user1
PING test_user1 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.3.3: seq=3 ttl=64 time=0.097 ms
如果文章有帮到您,很开心得到您的支持!