2016-08-22 3 views
5

Betrachten Sie die folgende docker-compose.ymlWie kann ein Docker-Netzwerk dem Host-Computer ausgesetzt werden?

version: '2' 
services: 
    serv1: 
     build: . 
     ports: 
      - "8080:8080" 
    links: 
     - serv2 

    serv2: 
     image: redis 
     ports: 
      - "6379:6379" 

Ich fowarding die Ports an den Host, um meine Dienste zu verwalten, aber die Dienste aufeinander zugreifen können einfach das Netzwerk Standard Docker verwenden. Zum Beispiel könnte ein Programm, das auf läuft, auf redis:6379 zugreifen und DNS-Magie würde das funktionieren lassen. Ich möchte meinen Host zu diesem Netzwerk hinzufügen, so dass ich auf die Ports des Containers über ihren Hostnamen zugreifen kann: port.

+0

https://www.npmjs.com/package/docker-machine-dns –

+2

Gegenwärtig wird Docker Ihnen mitteilen, dass Sie weiterhin die Portbindung verwenden. Es gibt nichts, was den internen DNS oder die Verknüpfung mit dem Docker-Host, den ich gesehen habe, preisgibt. Und die Standard-Firewall-Regeln würden Sie vor direktem Zugriff von außerhalb des Hosts schützen und Sie zwingen, diese Port-Bindung zu durchlaufen. Nehals Kommentar zeigt auflösende Docker-Hosts und artworkad zeigt die Port-Bindung, die Sie bereits ausgeführt haben. – BMitch

Antwort

3

Sie erreichen dies durch einen DNS-Proxy ausgeführt wird (wie dnsmasq) in einem Behälter, der auf dem gleichen Netzwerk wie der Anwendung ist. Dann zeigen Sie Ihre Hosts DNS auf die Container-IP, und Sie können Hostnamen auflösen, als ob Sie in dem Container im Netzwerk waren.

https://github.com/hiroshi/docker-dns-proxy ist ein Beispiel dafür.

1

Ich bin mir nicht sicher, ob ich dich richtig verstehe. Du willst z.B. auf Ihren Redis-Server nicht nur von Containern zugreifen können, die sich im selben Netzwerk befinden, sondern auch von außerhalb des Containers mit Ihrer Host-IP-Adresse?

Um das zu erreichen, dass Sie die aussetzen Befehl zu verwenden, haben als https://docs.docker.com/compose/compose-file/#/expose

expose: 
    - "6379" 

So

ports: 
    - "6379:6379" 
expose: 
    - "6379" 

den Trick tun sollte hier beschrieben.

Die Anweisung EXPOSE informiert Docker darüber, dass der Container zur Laufzeit die angegebenen Netzwerkanschlüsse unter überwacht. EXPOSE macht die Ports des Containers für den Host nicht zugänglich. Dazu müssen Sie entweder entweder das Flag -p verwenden, um einen Bereich von Ports zu veröffentlichen, oder das Flag -P, veröffentlichen alle exponierten Ports. Sie können eine Portnummer angeben und extern unter einer anderen Nummer veröffentlichen.

von https://docs.docker.com/engine/reference/builder/#expose

+0

Nicht genau, ich würde gerne in der Lage sein, auf jeden beliebigen Port in den Containern zuzugreifen, ohne an die Ports des Hosts gebunden zu sein. Wenn beispielsweise ein Webserver unter 8080 auf serv1 läuft, möchte ich den Browser meines Hosts aufrufen und auf serv1: 8080 anstelle von localhost: 8080 zeigen. Auf diese Weise würde ich docker-compose Datei nicht jedes Mal bearbeiten müssen, wenn ich auf einen neuen Port zugreifen muss – polvoazul

+0

Beachten Sie, dass dies bereits zwischen den Containern passiert. In meinem Serv1-Container kann ich über serv2: 6379 auf Redis-Daemon zugreifen. Keine Notwendigkeit, Ports in Voraussicht oder irgendetwas zu offenbaren, sie sind im selben Netzwerk, es funktioniert einfach. Ich möchte dieses Verhalten auf dem Host. – polvoazul

+0

@polvoazul Ich verstehe. Aber ich denke, Sie können die interne Service Discovery über DNS nicht mit der Bereitstellung von Services für den Host kombinieren (was über die Port-Bindung geschieht). Ich bezweifle auch, dass es gut ist, nur alle Ports freizulegen.Um auf Dienste vom Host zuzugreifen, denke ich, dass Portbindungen nicht wirklich gut sind (zumindest ist mir das nicht bewusst). –

Verwandte Themen