2017-12-02 3 views
0

Wie Sie in dem Bild unten sehen können, gibt es zwei Container und jeder enthält einen Container. Ich versuche, diese beiden Container miteinander in Verbindung zu bringen, habe es aber bisher nicht geschafft.Konnte zwei Container (in zwei verschiedenen Netzwerken) nicht erreichen, um miteinander zu sprechen

enter image description here

$ docker -v 
Docker version 17.09.0-ce, build afdb6d4 

Das ist, was ich bisher getan hat.

1. Erstellen Sie zwei Netzwerke.

$ docker network create --subnet 192.168.1.0/24 --driver bridge net_1 
$ docker network create --subnet 192.168.2.0/24 --driver bridge net_2 

Liste

NETWORK ID   NAME   DRIVER    SCOPE 
8a9ae0d69c9c  net_1   bridge    local 
e8a8460784d0  net_2   bridge    local 

Inspektionen Details

2. Erstellen Sie Container.

$ docker run -i -t -d -p 5011:80 --network=net_1 --ip 192.168.1.11 --name=app_1_con app_1_img 
$ docker run -i -t -d -p 5022:80 --network=net_2 --ip 192.168.2.22 --name=app_2_con app_2_img 

Liste

ID IMAGE  COMMAND  STATUS PORTS     NAMES 
f6 app_1_img "/bin/bash" Up  0.0.0.0:5011->80/tcp app_1_con 
0a app_2_img "/bin/bash" Up  0.0.0.0:5022->80/tcp app_2_con 

Inspektion Details

Test

Diese beiden Befehle hängen und sterben am Ende.

$ docker exec -it app_1_con ping 192.168.2.22 
PING 192.168.2.22 (192.168.2.22) 56(84) bytes of data. 

$ docker exec -it app_2_con ping 192.168.1.11 
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data. 
+0

verwenden ließ ich eine Antwort auf mögliche Lösungen [hier] (https://stackoverflow.com/a/47613904/1251684). – BentCoder

Antwort

1

erstellen Docker-compose.yml Datei mit folgendem:

version: "3.4" 

services: 

    app_1: 
    image: alpine:3.7 
    container_name: app_1_con 
    ports: 
     - "5011:80" 
    networks: 
     net_1: 
     ipv4_address: "192.168.1.11" 
     net_2: 
     ipv4_address: "192.168.2.11" 
    command: ping 192.168.2.22 

    app_2: 
    image: alpine:3.7 
    container_name: app_2_con 
    ports: 
     - "5022:80" 
    networks: 
     net_2: 
     ipv4_address: "192.168.2.22" 
    command: tail -f /dev/null # this keeps the container running 

networks: 

    net_1: 
    driver: bridge 
    ipam: 
     driver: default 
     config: 
     - subnet: 192.168.1.0/24 

    net_2: 
    driver: bridge 
    ipam: 
     driver: default 
     config: 
     - subnet: 192.168.2.0/24 

dann das Beispiel laufen mit: docker-compose up und verwenden Ctrl-C die Behälter zu stoppen.

Details:

Zuerst mit Docker compose beginnen, wenn die Dinge alles andere als trivial sind. Es macht die Wartung und das Verständnis viel einfacher.

Wie Sie sehen sollten, müssen Sie einen Container im selben Netzwerk wie den anderen haben. Dies ist ein sehr häufiges Muster, um Netzwerksicherheit hinzuzufügen. Zum Beispiel:

-----> nginx --------> app server -------> db 
     pub + priv   priv    priv 
     networks    network    network 

Nur Ihr Web-Proxy muss im öffentlichen Netz (durch das ports Attribut der einer freiliegende) sein. Ihr App-Server und Ihre db können sich in einem privaten Netzwerk befinden, auf das von außen nicht zugegriffen werden kann. Nginx ist der einzige Container, der Teil von zwei Netzwerken sein muss.

Etwas anderes, der Docker-Daemon hat seinen eigenen DNS-Resolver, so dass Sie nicht auf Container anhand ihrer IP verweisen müssen. Verwenden Sie stattdessen einfach ihren Namen service. Zum Beispiel statt

command: ping 192.168.2.22 

einfach

command: ping app_2 
+0

So oder so zwingt ein Container in einem Netzwerk, mit einem Container in einem anderen Netzwerk zu kommunizieren, Sicherheitsrisiken. Verstehe ich das richtig? – BentCoder

+0

Sicher aber dann brauchst du deine Behälter um richtig miteinander zu reden? Sie können Sicherheit nicht absolut überall setzen. Es wird ein Alptraum, der verwaltet wird, und es verringert die Leistung. Sie geben oben ein "vertrauenswürdiges Netzwerk" wie "priv" an, in dem sich Container über http (nicht https), keine Authentifizierung (außer db) und keine Firewall miteinander verbinden können. Sie stellen jedoch eine starke Wand auf der Proxy-Ebene (nginx). – Alkaline

+0

Ist das ein Tippfehler 'ipv4_address:" 192.168.2.11 "' in deiner 'app_1' Konfiguration? Soll es nicht "ipv4_address:" 192.168.2.22 "' stattdessen sein? Ich habe nicht begonnen, docker-compose.yml zu verwenden, also werde ich es später in der Zukunft versuchen. Allerdings werde ich Ihre Antwort akzeptieren, da es eine bessere Option scheint. Ich habe es geschafft, indem du 'app_2_con' zu' net_1' hinzugefügt hast, wie du es vorgeschlagen hast. – BentCoder

0

Es ist, weil es kein Routing zwischen net_1 und net_2 ist,

Eine Möglichkeit ist, sie im selben Netzwerk wie folgt zu setzen:

$ docker run -i -t -d -p 5011:80 --network=net_1 --ip 192.168.1.11 --name=app_1_con app_1_img 
$ docker run -i -t -d -p 5022:80 --network=net_1 --ip 192.168.1.10 --name=app_2_con app_2_img 

Ich habe in der Regel Behälter, die sollten miteinander kommunizieren in der gleichen Netzwerk,

Beispiel:

1) Erste Applikation (App1):

component1_app1 in backend_app1_net

component2_app1 in backend_app1_net

2) zweite Applikation (App2):

component1_app2 in backend_app2_net

component2_app2 in backend_app2_net

3) Hinweise:

Wenn ich die component1_app1 zu kommunizieren mit den allen Komponenten von app2 wollte, ich w ill auch ihn zu backend_app2_net verdrahten,

Wenn ich die component1_app1 kommunizieren mit nur component2_app2 wollte würde ich ein neues Netzwerk schaffen und ich werde component1_app1 und component2_app2 es verdrahten.

+2

Was ist, wenn Sie uns die Lösung meiner Frage zeigen, anstatt uns zu sagen, wie Sie die Dinge machen? – BentCoder

+0

Leider ist dies eher ein Vorschlag als eine Antwort. Ich weiß, dass es heiß ist, ein einzelnes Netzwerk zu erstellen und Container darin zu stecken, damit das System funktioniert. Meine Frage ist jedoch anders. Danke, dass Sie sich die Zeit genommen haben, einen Vorschlag zu machen. – BentCoder

+0

Dies kann Ihnen helfen https://serverfault.com/questions/830135/routing-among-different-docker-networks-on-the-same-host-machine –

0

Sie können das Standardbrückennetz verwenden, wenn zwei Container ausgeführt werden. Oder erstellen Sie ein Netzwerk mit docker network create. Dann benutzen die zwei Container das Netzwerk.

Verwandte Themen