2016-06-10 9 views
0

Erstens, ich bin mir bewusst, die Schaffung eine VXLAN-Schnittstelle mit dem Tag basierend auf IP-Befehl hinzuzufügen:Wie VXLAN Tag der Isolierung andere Gruppe von Docker Containern

ip link add vxlan-br0 type vxlan id <tag-id> group <multicast-ip> local <host-ip> dstport 0

Aber es ist nutzlos für meinen tatsächlichen Bedarf, und meine Forderung ist es, mehrere docker-Container mit verschiedenen Tags, so etwas wie zu isolieren:

brctl addif br1 veth111111 tag=10 # veth111111 is the netdev used by docker container 1 brctl addif br1 veth222222 tag=20 # veth222222 is the netdev used by docker container 2 brctl addif br1 veth333333 tag=10 # veth111111 is the netdev used by docker container 3

ich möchte isolieren Behälter 2 aus dem Behälter 1 und 3, und nicht isolieren Kommunikation bew Teen Container 1 und 3. Wie man das erreicht?

Antwort

0

Hinzufügen von zwei Brücke networks wird Isolierung bieten.

docker create network net1 
docker create network net2 

beginnen Dann werden einige Container

docker run -d --name one --net net1 busybox sleep 600 
docker run -d --name two --net net2 busybox sleep 600 
docker run -d --name three --net net1 busybox sleep 600 

one und three wird kommunizieren, wie sie an der gleichen Brücke angebracht sind

docker exec one ping three 
docker exec three ping one 

Andere werden scheitern, da sie Netzwerke überqueren/Brücken

docker exec one ping two 
docker exec two ping one 
docker exec three ping two 

Sie werden feststellen, Docker bietet Host/Name-Auflösung in einem Netzwerk, so ist es eigentlich die Host-Namensauflösung, die oben fehlschlägt. IPs werden auch nicht zwischen Brücken geleitet.

$ docker exec three ip ad sh dev eth0 
17: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff 
    inet 172.20.0.3/16 scope global eth0 
     valid_lft forever preferred_lft forever 
    inet6 fe80::42:acff:fe14:3/64 scope link 
     valid_lft forever preferred_lft forever 

Ping two

$ docker exec three ping -c 1 -w 1 172.21.0.2 
PING 172.21.0.2 (172.21.0.2): 56 data bytes 

--- 172.21.0.2 ping statistics --- 
1 packets transmitted, 0 packets received, 100% packet loss 

Ping one

docker exec three ping -c 1 -w 1 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.044 ms 

Diese Einstellung wird auch mit dem overlay networking driver arbeiten, aber das ist komplizierter einzurichten.

+0

Ein gutes Ideal. Dieser Ansatz erfordert jedoch, O (| Group |) Brücken zu erstellen. Im schlimmsten Fall | Gruppe | = | Container |. Wissen Sie, dass die maximale Anzahl an Bridges auf einem Host erstellt werden kann? Gibt es eine Lösung, um O (1) -Brücke für die allgemeine Verwendung zu erstellen und VXLAN-Tag zu verwenden, um verschiedene Gruppen zu isolieren? – ghostplant

+0

@ghostplant Verwenden Sie für die Isolierung einzelner Container '--icc = false 'im Standardnetzwerk. Eine Bridge hat eine Grenze von 1023 Schnittstellen. Anscheinend beginnen die Dinge [bei Linux langsamer als 9600-Schnittstellen] (https://support.cumulusnetworks.com/hc/en-us/articles/216420547-Calculating-the-Limitation-of-a-Linux-Bridge-In-Traditional -Modus), aber ich habe noch nie so weit gedrängt. Sie sollten mehr Bridges + Interfaces erhalten als auf einer Bridge. Ich warne auch vor benutzerdefinierten Netzwerken, damit Sie Docker-Tools wie Compose, Schwarm, Kuberenetes, ECS usw. problemlos verwenden können. – Matt