Ist es möglich, dass ein Docker-Containerzugriffsport vom Host geöffnet wird? Konkret habe ich MongoDB und RabbitMQ auf dem Host ausgeführt und möchte einen Prozess in einem Docker-Container ausführen, um die Warteschlange abzuhören und (optional) in die Datenbank zu schreiben.
Ich weiß, dass ich einen Port vom Container an den Host weiterleiten kann (über die Option -p) und über den Docker-Container eine Verbindung zur Außenwelt (dh zum Internet) herstellen kann, möchte jedoch die Ports RabbitMQ und MongoDB nicht verfügbar machen vom Gastgeber nach außen.
EDIT: einige Klarstellung:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT STATE SERVICE
6311/tcp open unknown
joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway
Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT STATE SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds
Ich musste diesen Trick ausführen, um eine Internetverbindung mit dem Container herzustellen: Meine Firewall blockiert Netzwerkverbindungen vom Docker-Container nach außen
BEARBEITEN : Schließlich habe ich eine benutzerdefinierte Brücke mithilfe von Rohrleitungen erstellt und die Dienste die IP-Adressen der Brücke abhören lassen. Ich habe mich für diesen Ansatz entschieden, anstatt MongoDB und RabbitMQ auf der Docker-Bridge abhören zu lassen, da dies mehr Flexibilität bietet.
quelle
lo
undeth0
.Ein einfacher, aber relativ unsicherer Weg wäre, die
--net=host
Option zu nutzendocker run
.Diese Option bewirkt, dass der Container den Netzwerkstapel des Hosts verwendet. Anschließend können Sie eine Verbindung zu Diensten herstellen, die auf dem Host ausgeführt werden, indem Sie einfach "localhost" als Hostnamen verwenden.
Dies ist einfacher zu konfigurieren, da Sie den Dienst nicht so konfigurieren müssen, dass Verbindungen von der IP-Adresse Ihres Docker-Containers akzeptiert werden, und Sie müssen dem Docker-Container nicht nur eine bestimmte IP-Adresse oder einen bestimmten Hostnamen mitteilen, zu der bzw. dem eine Verbindung hergestellt werden soll ein Hafen.
Sie können es beispielsweise testen, indem Sie den folgenden Befehl ausführen, der davon ausgeht, dass Ihr Image aufgerufen wird
my_image
, Ihr Image dastelnet
Dienstprogramm enthält und der Dienst, zu dem Sie eine Verbindung herstellen möchten, sich an Port 25 befindet:Wenn Sie dies in Betracht ziehen, lesen Sie bitte die Sicherheitshinweise auf dieser Seite:
https://docs.docker.com/articles/networking/
Es sagt:
quelle
--net=host
nicht, wenn Ihr Containerprozess mithilfe von eine Verbindung zu Ihrem Hostcomputer herstellen kannlocalhost
. Stattdessen haben Sie Ihre Container nur Hostnamen auf die speziellen MacOS verbindendocker.for.mac.host.internal
stattlocalhost
. Es sind keine zusätzlichen Parameter erforderlich,docker run
damit dies funktioniert. Sie können dies als env var übergeben,-e
wenn Sie Ihre Containerplattform agnostisch halten möchten. Auf diese Weise können Sie eine Verbindung zu dem in env var genannten Host herstellen unddocker.for.mac.host.internal
MacOS undlocalhost
Linux weitergeben.host.docker.internal
, siehe docdocker run --rm -it --net=host postgres bash
dannpsql -h host.docker.internal -U postgres
Sie können auch einen SSH-Tunnel erstellen.
docker-compose.yml
::docker/Dockerfile.tunnel
::config/ssh/config
::Auf diese Weise
elasticsearch
verfügt der über einen Tunnel zum Server mit dem ausgeführten Dienst (Elasticsearch, MongoDB, PostgreSQL) und macht Port 9200 mit diesem Dienst verfügbar.quelle
Ich hatte ein ähnliches Problem beim Zugriff auf einen LDAP-Server von einem Docker-Container aus. Ich habe eine feste IP für den Container festgelegt und eine Firewall-Regel hinzugefügt.
docker-compose.yml:
iptables-Regel:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d $192.168.50.1 --dport portnumberOnHost
Innerhalb des Containerzugangs
dockerhost:portnumberOnHost
quelle
Wenn MongoDB und RabbitMQ auf dem Host ausgeführt werden, sollte der Port bereits verfügbar sein, da er sich nicht in Docker befindet.
Sie benötigen die
-p
Option nicht , um Ports vom Container zum Host verfügbar zu machen. Standardmäßig sind alle Ports verfügbar. Mit dieser-p
Option können Sie einen Port vom Container zur Außenseite des Hosts freigeben.Also, meine Vermutung ist, dass Sie überhaupt nicht brauchen
-p
und es sollte gut funktionieren :)quelle