Bridge 橋模式
? Docker 容器啟動(dòng)時(shí)默認(rèn)的 網(wǎng)絡(luò)模式慎璧,如果不使用--network 指定網(wǎng)絡(luò)模式谈息,那么docker會(huì)為該容器創(chuàng)建一個(gè)網(wǎng)橋袒哥,用于連接該容器網(wǎng)絡(luò)和主機(jī)網(wǎng)卡設(shè)備.
? 此模式會(huì)為每一個(gè)容器分配Network Namespace走诞、設(shè)置IP等,并將一個(gè)主機(jī)上的Docker容器連接到一個(gè)虛擬網(wǎng)橋上妥曲。
? 創(chuàng)建一個(gè)后臺(tái)容器,并查看網(wǎng)卡信息 與 宿主機(jī) 的網(wǎng)橋 做對(duì)比; 明顯看出 bridge 模式 下 docker 會(huì) 在docker0 網(wǎng)橋下創(chuàng)建一對(duì) veth 設(shè)備 作為 容器與橋 的連接钦购,270 --> 271
# 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
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
| 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 模式
? 這個(gè)模式下檐盟,容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace,而是和宿主機(jī)共用一個(gè)Network Namespace押桃。容器將不會(huì)虛擬出自己的網(wǎng)卡葵萎,配置自己的IP等,而是使用宿主機(jī)的IP和端口
? 創(chuàng)建一個(gè)容器唱凯,并查看ip, 信息與宿主機(jī)一致羡忘,二者公用同一個(gè)網(wǎng)絡(luò)命名空間
docker run -i --network=host busybox ip a
None 模式
? 這種模式下,Docker容器擁有自己的Network Namespace磕昼,但是卷雕,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說票从,這個(gè)Docker容器沒有網(wǎng)卡漫雕、IP、路由等信息峰鄙。需要我們自己為Docker容器添加網(wǎng)卡浸间、配置IP等。
創(chuàng)建一個(gè)容器先馆,查看該容器的 Network Namespace发框, 05 是上面 bridge 的, default 是docker容器本身的
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 模式
? 這個(gè)模式下煤墙,指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace梅惯,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡仿野,配置自己的IP铣减,而是和一個(gè)指定的容器共享IP、端口范圍等脚作。同樣葫哗,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)球涛、進(jìn)程列表等還是隔離的劣针。兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信。
? 使用test_bridge 容器網(wǎng)絡(luò)亿扁,創(chuàng)建一個(gè)新容器捺典,并比較二者網(wǎng)絡(luò)信息,二者公用一塊虛擬網(wǎng)卡都是 271
# 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 命令 創(chuàng)建自定義的網(wǎng)絡(luò)襟己,處于該網(wǎng)絡(luò)下的docker可以通過 container名稱進(jìn)行通信引谜,這里不能在使用busybox作為測試imgae需要使用完整的linux系統(tǒng)
# 創(chuàng)建一個(gè)isolated_nw 的孤立網(wǎng)絡(luò),并配置子網(wǎng)信息
docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
# 創(chuàng)建一個(gè)容器擎浴,使用isolated_nw 網(wǎng)絡(luò)员咽,并指定ip地址
docker run --network=isolated_nw --ip=172.25.3.3 -itd --name=test_user1 linkage_img
# 創(chuàng)建一個(gè)容器,并連接到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