2017-04-21 18 views
0

Ich habe zwei verschiedene Docker-Container und jeder hat ein anderes Bild. Jede App in den Containern verwendet nicht in Konflikt stehende Ports. Siehe docker-compose.yml:Wie teile ich localhost zwischen zwei verschiedenen Docker-Containern?

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    hostname: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

ich erfolgreich von dem Host-Rechner jedes Bild cURL kann (Mac OS), z.B. curl -k https://localhost:6473/service_a/api/version funktioniert. Was ich gerne tun würde, ist in der Lage zu postgres Container von der service_a Container über localhost zu beziehen, als ob diese beiden Behälter eins waren und sie die gleichen localhost teilen. Ich weiß, dass es möglich ist, wenn ich den Host-Namen postgres.dev aus dem Container service_a verwenden, aber ich würde gerne localhost verwenden können. Ist das möglich? Bitte beachten Sie, dass ich mich im Umgang mit Netzwerken oder Docker nicht auskenne.

Mac-Version: 10.12.4

Docker Version: Docker Version 17.03.0-ce, bauen 60ccb22

Ich habe schon einige frühere Untersuchungen durchgeführt, konnte aber keine Lösung finden. Relevant: https://forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/2

+0

Mehrere (unterschiedliche Grade von Hackiness) Möglichkeiten, dies zu tun, aber wie kommst du dazu? – johnharris85

+0

Ich wiederhole, warum willst du das tun? Die Verwirrung mit 'localhost' wird nur Verwirrung stiften. Das Ausführen beider Prozesse in demselben Container könnte dasselbe ohne Hackerei erreichen. – Matt

+0

Mein Anwendungsfall ist folgender: Diese beiden Dienste müssen aus Sicherheitsgründen auf demselben Host bereitgestellt werden, so dass 'service_a' in der realen Welt so konfiguriert wäre, dass nur 'localhost/127.0.0.1' gehört wird. Im Idealfall würde ich ein Docker-Image erstellen, um sowohl postgres als auch service_a zu haben, aber das schien nicht machbar, daher mein Ansatz hier. – kolistivra

Antwort

1

Der richtige Weg: Verwenden Sie nicht localhost. Verwenden Sie stattdessen das integrierte DNS-Netzwerk von Docker und referenzieren Sie die Container anhand ihres Servicenamens. Sie sollten nicht einmal den Containernamen festlegen, da dies die Skalierung unterbricht.


Die schlechte Art und Weise: Wenn Sie die Docker-Networking-Funktion nicht verwenden möchten, schalten Sie können dann Vernetzung hosten, aber das macht einen sehr wichtiges Merkmal und andere Docker Funktionen wie die Möglichkeit, aus Containern zu verbinden zusammen in ihren eigenen isolierten Netzwerken wird nicht mehr funktionieren. Mit diesem wichtigen Hinweis, sieht das Ergebnis wie:

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "host" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    network_mode: "host" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

Bitte beachte, dass ich Port-Publishing aus dem Behälter zu dem Host entfernt, da Sie nicht mehr in einem Container Netzwerk verbunden sind. Und ich habe die Einstellung für den Hostnamen entfernt, da Sie den Hostnamen des Hosts selbst nicht von einem Andockcontainer ändern sollten.

Die verknüpften Forenbeiträge, auf die Sie verweisen, zeigen, dass der Host nicht mit den Containern als localhost kommunizieren kann, wenn es sich um eine VM handelt. Dies ist eine erwartete Einschränkung, aber die Container selbst können als localhost miteinander kommunizieren. Wenn Sie eine VirtualBox-basierte Installation mit Docker-Toolbox verwenden, sollten Sie in der Lage sein, mit den Containern über die Virtualbox-IP zu kommunizieren.


Der wirklich falsche Weg: Missbrauch der Container-Netzwerk-Modus. Der Modus ist zum Debuggen von Containernetzwerkproblemen und speziellen Anwendungsfällen verfügbar und sollte nicht verwendet werden, um die Neukonfiguration einer Anwendung für die Verwendung von DNS zu vermeiden. Wenn Sie die Datenbank anhalten, wird der andere Container beschädigt, da der Netzwerk-Namespace verloren geht.

Dazu müssen Sie wahrscheinlich zwei separate docker-compose.yml-Dateien ausführen, da docker-compose vor jeder Aktion prüft, ob das Netzwerk vorhanden ist.Beginnen Sie mit dem Postgres-Behälter:

version: "2" 
services: 
    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

Dann einen zweiten Dienst in demselben Netzwerk-Namespace machen:

version: "2" 
services: 
    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "container:postgres.dev" 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 
+0

Ich denke, das ist der richtige Weg; Leider scheint Docker für Mac mit 'Host'-Netzwerken problematisch zu sein: https://forums.docker.com/t/should-docker-run-net-host-work/14215 und https://forums.docker.com/ t/beta-9-und-localhost-verbindung-via-net-host/10471/15 – kolistivra

+0

Der Forumsbeitrag weist auf das Problem hin, auf den Zugriff vom Host auf den Container mit localhost zuzugreifen. Die Frage und diese Antwort beziehen sich von Container zu Container mit localhost. Aber ich wiederhole, bitte tu das nicht, wenn es kaputt geht, kannst du alle Teile behalten. – BMitch

Verwandte Themen