Verbindung vom Docker-Container zum Docker-Host herstellen

10

Ich habe ein Setup, in dem ich alle Teile meiner Website in Docker-Containern ausführe. Mein Nginx, der Port 80 und 443 abhört, läuft in einem Container.

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

Ich möchte einen Proxy für einen Dienst in einem anderen Container einrichten. Dieser Container ist an Port 3000 auf dem Host gebunden:

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

Meine iptables auf dem Docker-Host sehen folgendermaßen aus:

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Innerhalb des Containers kann ich aufgrund der iptables-Konfiguration keine Verbindung zu Port 3000 auf dem Host-Computer herstellen.

Ich möchte Port 3000 nicht für das öffentliche Internet öffnen.

Gibt es eine Möglichkeit, eine direkte Brücke zwischen dem Container und dem Host an Port 3000 zu öffnen?

Oder sollte ich meine iptables so ändern, dass sie aus dem Docker-IP-Bereich akzeptiert werden?

user3133475
quelle

Antworten:

5

Alles, was Sie brauchen, sind die Link-Funktionen von Docker [veraltet]

Befreien Sie sich einfach von all den komplizierten Dingen, die Sie versucht haben, und beginnen Sie, benannte Container zu verwenden, und verknüpfen Sie sie dann miteinander.

Elias Probst
quelle
Ich habe mir die Docker-Link-Funktionen angesehen, aber wenn ich sie richtig verstehe, gibt es einige Probleme. 1. Wenn das Kind neu gestartet wird, erhält es eine neue IP-Adresse. Dann müssten alle Eltern dieses Kindes neu gestartet werden, um die neuen Umgebungsvariablen zu erhalten. 2. Ich muss meiner Anwendung Logik hinzufügen, um diese Umgebungsvariablen zu lesen und Verbindungen herzustellen.
user3133475
Ein neu gestarteter Container ( docker restart your_container) sollte seine IP-Adresse behalten. Nur wenn Sie einen neuen Container basierend auf einem bestimmten Image ausführen, erhält er eine neue IP ( docker run -d image command).
Elias Probst
2
Das war früher wahr, aber zumindest ab Docker 1.0 gibt ein "Docker-Neustart" dem Container eine neue IP-Adresse. Schlagen Sie dies einfach in einigen Skripten an, die sich auf das vorherige Verhalten der IP stützten, das sich nicht änderte.
Jamshid
1
Obwohl ich denke, dass dies wahrscheinlich das Richtige für das OP ist, bin ich hierher gekommen, um eine Antwort auf die gestellte Frage zu suchen. dh wie man eine Verbindung zu einem Dienst auf dem Host herstellt.
mc0e
2

Elias 'Antwort ist richtig, aber der Link ist lang und verwirrend. Hier ist eine einfache Zusammenfassung:

Führen Sie zunächst den zu verknüpfenden Container aus und benennen Sie ihn:

sudo docker run -d --name db training/postgres

Führen Sie dann den anderen Container aus und verknüpfen Sie ihn mit dem ersten Container:

sudo docker run -d -P --name web --link db:db training/webapp python app.py

Die Verbindung vom ersten Container zum zweiten Container wird hergestellt /etc/hosts. Sie können es also wie einen Hostnamen verwenden. Beispielsweise:

sudo docker run --name web --link db:db training/webapp ping db
Ron Romero
quelle