Ich habe ein Setup, bei dem ich alle Teile meiner Website in Docker-Containern betreibe. Mein Nginx, das auf Port 80 und 443 lauscht, 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
Aufgrund der iptables-Konfiguration kann ich innerhalb des Containers keine Verbindung zum Port 3000 auf dem Hostcomputer herstellen.
Ich möchte Port 3000 nicht für das öffentliche Internet öffnen.
Gibt es eine Möglichkeit, auf Port 3000 eine direkte Brücke zwischen dem Container und dem Host zu öffnen?
Oder sollte ich meine Iptables so ändern, dass sie den Docker-IP-Bereich akzeptieren?
Antwort1
Alles was Sie brauchen ist DockersLink-Funktionen[veraltet]
Befreien Sie sich einfach von all dem komplizierten Zeug, das Sie bisher versucht haben, und beginnen Sie mit der Verwendung benannter Container, die Sie dann miteinander verknüpfen.
Antwort2
Elias' Antwort ist richtig, aber der Link ist lang und verwirrend. Hier ist eine einfache Zusammenfassung:
Führen Sie zunächst den Container aus, auf den Sie eine Verknüpfung herstellen möchten, 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
Der Link vom ersten Container zum zweiten Container wird in eingefügt /etc/hosts
. Sie können es also wie einen Hostnamen verwenden. Beispiel:
sudo docker run --name web --link db:db training/webapp ping db