Docker网络
docker网络
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
[root@docker mnt]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:5f:e2:34:6c brd ff:ff:ff:ff:ff:ff
docker原生bridge网路
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
[root@Docker-node1 ~]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 12:e3:9f:e1:e6:e8 brd ff:ff:ff:ff:ff:ff
64: br-ac76f47bd847: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 8a:4d:c7:da:0f:dc brd ff:ff:ff:ff:ff:ff
-
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
-
容器通过宿主机的NAT规则后可以访问外网

[root@Docker-node1 ~]# ifconfig
br-ac76f47bd847: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::884d:c7ff:feda:fdc prefixlen 64 scopeid 0x20<link>
ether 8a:4d:c7:da:0f:dc txqueuelen 0 (Ethernet)
RX packets 13 bytes 364 (364.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1406 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
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::10e3:9fff:fee1:e6e8 prefixlen 64 scopeid 0x20<link>
ether 12:e3:9f:e1:e6:e8 txqueuelen 0 (Ethernet)
RX packets 13 bytes 364 (364.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1406 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.10 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::20c:29ff:fede:d3af prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:de:d3:af txqueuelen 1000 (Ethernet)
RX packets 682915 bytes 961945293 (917.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 88032 bytes 14491692 (13.8 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 9720 bytes 1029221 (1005.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9720 bytes 1029221 (1005.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth832a365: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::4479:afff:fe5b:4fcc prefixlen 64 scopeid 0x20<link>
ether 46:79:af:5b:4f:cc txqueuelen 0 (Ethernet)
RX packets 3 bytes 126 (126.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 806 (806.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker原生host网路
host网络模式需要在容器创建时指定 --network=host
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性
[root@Docker-node1 ~]# docker run -it --name busybox --network host busybox:latest
/ # ifconfig
br-ac76f47bd847 Link encap:Ethernet HWaddr 8A:4D:C7:DA:0F:DC
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
inet6 addr: fe80::884d:c7ff:feda:fdc/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:3916 errors:0 dropped:0 overruns:0 frame:0
TX packets:4735 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5097716 (4.8 MiB) TX bytes:3235479 (3.0 MiB)
docker0 Link encap:Ethernet HWaddr 12:E3:9F:E1:E6:E8
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::10e3:9fff:fee1:e6e8/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:364 (364.0 B) TX bytes:1406 (1.3 KiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:DE:D3:AF
inet addr:172.25.254.10 Bcast:172.25.254.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fede:d3af/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:683296 errors:0 dropped:0 overruns:0 frame:0
TX packets:88301 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:961975757 (917.4 MiB) TX bytes:14517302 (13.8 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:9720 errors:0 dropped:0 overruns:0 frame:0
TX packets:9720 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1029221 (1005.0 KiB) TX bytes:1029221 (1005.0 KiB)
/ #
如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占用,在启动第二个nginx容器就会失败
docker原生none网路
none模式是指禁用网络功能,只有lo接口,在容器创建时使用
--network=none指定。
[root@Docker-node1 ~]# docker run -it --name busybox --rm --network none busybox:latest
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
docker的自定义网络
自定义网络模式,docker提供了三种自定义网络驱动:
-
bridge
-
overlay
-
macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络
建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
自定义桥接网络
在建立自定以网络时,默认使用桥接模式
[root@Docker-node1 ~]# docker network create hjw
fd12cf744b32872354ccc0d9af695f0a691ac278506e9a198ee4addfc9a37880
[root@Docker-node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a766dc23b8ee bridge bridge local
ac76f47bd847 harbor_harbor bridge local
fd12cf744b32 hjw bridge local
594110fe0e71 host host local
ccd1739b6d24 none null local
桥接默认是单调递增
[root@Docker-node1 ~]# ifconfig
br-ac76f47bd847: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::884d:c7ff:feda:fdc prefixlen 64 scopeid 0x20<link>
ether 8a:4d:c7:da:0f:dc txqueuelen 0 (Ethernet)
RX packets 13 bytes 364 (364.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1406 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-fd12cf744b32: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
ether 22:15:99:c5:a6:77 txqueuelen 0 (Ethernet)
RX packets 13 bytes 364 (364.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1406 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::10e3:9fff:fee1:e6e8 prefixlen 64 scopeid 0x20<link>
ether 12:e3:9f:e1:e6:e8 txqueuelen 0 (Ethernet)
RX packets 13 bytes 364 (364.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1406 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
桥接也支持自定义子网和网关
[root@Docker-node1 ~]# docker network create my_net2 --subnet 192.168.0.0/24 --gateway 192.168.0.100
7e77cd2e44c64ff3121a1f1e0395849453f8d524d24b915672da265615e0e4f9
[root@docker ~]# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "7e77cd2e44c64ff3121a1f1e0395849453f8d524d24b915672da265615e0e4f9",
"Created": "2024-08-17T17:05:19.167808342+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/24",
"Gateway": "192.168.0.100"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
为什么要自定义桥接
多容器之间如何互访?通过ip可以,但是有什么问题?
[root@Docker-node1 ~]# docker run -d --name web1 nginx:1.23
7f295913518c992265fd304e1a0bea9b98168afed92f23ea4ef4d19a30cb676e
[root@Docker-node1 ~]# docker run -d --name web2 nginx:1.23
fd1b2c3e13a0eddc569a1138858bd7b421f97bcc02d644412622a5761eb24be0
[root@Docker-node1 ~]# docker inspect web1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
[root@Docker-node1 ~]# docker inspect web2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
#关闭容器后重启容器,启动顺序调换
[root@Docker-node1 ~]# docker stop web1 web2
web1
web2
[root@Docker-node1 ~]# docker start web2
web2
[root@Docker-node1 ~]# docker start web1
web1
[root@Docker-node1 ~]# docker inspect web1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
[root@Docker-node1 ~]# docker inspect web2 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2", #我们会发容器ip颠倒
docker引擎在分配ip时时根据容器启动顺序分配到,谁先启动谁用,是动态变更的
多容器互访用ip很显然不是很靠谱,那么多容器访问一般使用容器的名字访问更加稳定
docker原生网络是不支持dns解析的,自定义网络中内嵌了dns
[root@docker ~]# docker run -d --network hjw_net1 --name web nginx
d9ed01850f7aae35eb1ca3e2c73ff2f83d13c255d4f68416a39949ebb8ec699f
[root@docker ~]# docker run -it --network hjw_net1 --name test busybox
/ # ping web
PING web (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.197 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.096 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.087 ms
注意:不同的自定义网络是不能通讯的
#在rhel7中使用的是iptables进行网络隔离,在rhel9中使用nftpables [root@docker ~]# nft list ruleset可以看到网络隔离策略
如何让不同的自定义网络互通?
[root@Docker-node1 ~]# docker network create hjw_net1
b21e292c40af41696496d18d968fc002d5ea3df5fe717b3ae9c77910a9a34cba
[root@Docker-node1 ~]# docker network create hjw_net2
ed83b02887d0ef07ab4973803312b2110e1be25939bb65263c23994a3b7a76fd
[root@Docker-node1 ~]# docker run -d --name web1 --network hjw_net1 nginx:1.23
11a1c994e3d6e5df03c9145edf5bb56cef7fe3a4b84d9c593cd802650fdacc88
[root@Docker-node1 ~]# docker run -it --name busybox --network hjw_net2 busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 56:11:58:97:AF:D8
inet addr:172.21.0.2 Bcast:172.21.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1042 (1.0 KiB) TX bytes:126 (126.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
^C
--- 172.20.0.2 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss
/ #
#在上面test容器中加入网络eth1
[root@Docker-node1 ~]# docker network connect hjw_net1 busybox
[root@Docker-node1 ~]# docker exec -it busybox sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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@if121: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 56:11:58:97:af:d8 brd ff:ff:ff:ff:ff:ff
inet 172.21.0.2/16 brd 172.21.255.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1@if122: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 0e:a3:f6:eb:87:c2 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.3/16 brd 172.20.255.255 scope global eth1
valid_lft forever preferred_lft forever
/ # ip route
default via 172.20.0.1 dev eth1
172.20.0.0/16 dev eth1 scope link src 172.20.0.3
172.21.0.0/16 dev eth0 scope link src 172.21.0.2
/ # ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.174 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.571 ms
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.190 ms
^C
--- 172.20.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.174/0.311/0.571 ms
/ #
joined容器网络
Joined容器一种较为特别的网络模式,•在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名)
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速
Joined 模式的特点
-
共享网络命名空间:两个容器共用同一个网络栈
-
通过 localhost 通信:可以直接用 127.0.0.1 或 localhost 访问
-
共享端口:两个容器不能绑定同一个端口
-
其他资源隔离:文件系统、进程、用户等仍然是隔离的
注意事项
-
如果 web1 容器停止,test 容器的网络也会受影响
-
两个容器共享网络,所以端口不能冲突
-
如果 web1 已经绑定了 80 端口,test 容器不能再绑定 80 端口
通信。
[root@Docker-node1 ~]# docker run -it --rm --network hjw --name test busyboxplus:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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@if123: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether b6:1e:df:44:b9:36 brd ff:ff:ff:ff:ff:ff
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # curl localhost
curl: (7) Failed to connect to localhost port 80: Connection refused
/ #
[root@Docker-node1 ~]# docker start web1
web1
[root@Docker-node1 ~]# docker exec -it web1 sh
# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# read escape sequence
[root@Docker-node1 ~]# docker run -it --rm --network container:web1 --name test1 busyboxplus:latest
/ # curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ #
容器访问外网
在rhel7中,docker访问外网是通过iptables添加地址伪装策略来完成容器网文外网
-
在rhel7之后的版本中通过nftables添加地址伪装来访问外网
[root@Docker-node1 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE 6 -- 172.17.0.2 172.17.0.2 tcp dpt:80 #内网访问外网策略
Chain DOCKER (0 references)
target prot opt source destination
DNAT 6 -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
外网访问docker容器
端口映射 -p 本机端口:容器端口来暴漏端口从而达到访问效果
#通过docker-proxy对数据包进行内转
[root@Docker-node1 ~]# docker run -d --name webserver -p 80:80 nginx
[root@Docker-node1 ~]# ps ax
133986 ? Sl 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
133995 ? Sl 0:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80
134031 ? Sl 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id cae79497a01c0b8c488c7597b43de4a43f361f21a398ff423b4504c0905db143 -address /run/containerd/containerd.sock
134059 ? Ss 0:00 nginx: master process nginx -g daemon off;
134099 ? S 0:00 nginx: worker process
134100 ? S 0:00 nginx: worker process
#通过dnat策略来完成浏览内转
[root@Docker-node1 ~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE 6 -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain DOCKER (0 references)
target prot opt source destination
DNAT 6 -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
[!NOTE]
docker-proxy和dnat在容器建立端口映射后都会开启,那个传输速录高走那个
docker跨主机网络
在生产环境中,我们的容器不可能都在同一个系统中,所以需要容器具备跨主机通信的能力
-
跨主机网络解决方案
-
docker原生的overlay和macvlan
-
第三方的flannel、weave、calico
-
-
众多网络方案是如何与docker集成在一起的
-
libnetwork docker容器网络库
-
CNM (Container Network Model)这个模型对容器网络进行了抽象
-
CNM (Container Network Model)
CNM分三类组件
Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace) Endpoint:作用是将sandbox接入network (veth pair) Network:包含一组endpoint,同一network的endpoint可以通信
macvlan网络方式实现跨主机通信
macvlan网络方式
-
Linux kernel提供的一种网卡虚拟化技术。
-
无需Linux bridge,直接使用物理接口,性能极好
-
容器的接口直接与主机网卡连接,无需NAT或端口映射。
-
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
-
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094
macvlan网络间的隔离和连通
-
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的
-
可以在三层上通过网关将macvlan网络连通起来
-
docker本身不做任何限制,像传统vlan网络那样管理即可
实现方法如下:
1.在两台docker主机上各添加一块网卡,打开网卡混杂模式:
[root@Docker-node1 ~]# ip link set eth1 promisc on
[root@Docker-node1 ~]# ip link set up eth1
[root@Docker-node1 ~]# ifconfig eth1
eth1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
ether 00:0c:29:ec:fc:dd txqueuelen 1000 (Ethernet)
RX packets 83 bytes 8696 (8.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[!NOTE]
eth1这款网卡在vmware中要设定为仅主机模式
2.添加macvlan网路
[root@Docker-node1 ~]# docker network create \
-d macvlan \
--subnet 1.1.1.0/24 \
--gateway 1.1.1.1 \
-o parent=eth1 macvlan1 #所有都需要
3.测试
#在docker-node1中
[root@Docker-node1 ~]# docker run -it --name busybox --network macvlan1 --ip 1.1.1.100 --rm busybox
/ # ping 1.1.1.200
[root@Docker-node1 ~]# docker run -it --name busybox --network macvlan1 --ip 1.1.1.200 --rm busybox
/ #
更多推荐
所有评论(0)