2014-07-25 17 views
15

den folgenden Befehl schlägt fehl:Kann den Port an einen Unix-Datei-Socket im Host-Container weiterleiten?

sudo docker run -p unix:///tmp/file.sock:44444 -d image_name 

etwas falsch mit meiner Port-Forwarding-Syntax ist oder eine Konfiguration, wie dies nicht möglich?

+0

Sie können möglicherweise den UNIX-Socket in ein Volume versetzen, auf das der Host auf einen anderen Container zugreifen/bereitstellen kann. Ich würde empfehlen, dass Sie einfach auf einen Port statt auf einen UNIX-Socket hören. –

+3

Die Idee dahinter war, die Geschwindigkeit zu erhöhen, weil ich mit Unix Sockets in der Lage wäre, den Netzwerkaufwand zu vermeiden, der Ports innewohnt. –

Antwort

20

Docker der -p Syntax nicht einen Unix-Socket nehmen:

-p=[]  : Publish a container᾿s port to the host (format: 
      ip:hostPort:containerPort | ip::containerPort | 
      hostPort:containerPort) 

Eine Lösung wäre:

  • Containers laufen ohne -p Spezifikation, wir nennen es werde "cont1" (--name cont1)
  • Führen Sie einen zweiten Container, der:
    • Bind mounts der UNIX-Buchse (-v /tmp/file.sock:/tmp/file.sock) es hat zugänglich aus dem Behälter
    • Links an den ersten Behälter (--link cont1:cont1), um es
    • verbinden zu können, läuft ein Werkzeug wie socat routen Verkehr von den UNIX Buchse zum "cont1:4444" Endpunkt

ich bin kein socat Experte, aber die Adresse Spezifikation Sie so aussehen müssen, sollten: UNIX-LISTEN:/tmp/file.sock,fork,reuseaddr TCP4:cont1:4444

+0

Was ist, wenn der Unix-Socket auf dem Host nicht auf eine Datei abgebildet ist, das ist ein abstrakter Namespace-Socket , wie (wie von lsof gemeldet): '' '' aesm_serv 26473 aesmd 6u unix 0xffff88021c494b00 0t0 291424 @sgx_aesm_socket_base type = STREAM''' –

1

Die angenommene Antwort ist teilweise korrekt, da Sie nur Verzeichnisse verknüpfen können, was bedeutet, dass Sie das Verzeichnis des Sockets anstelle des Sockets selbst verknüpfen müssen.

Das Folgende hat es für mich getan, als ich eine Postgres-Buchse anschließen wollte.

docker run -p 5432:5432 -v /run/postgresql:/run/postgresql -d --name postgres postgres

Was das bedeutet ist die Datei auf dem Host-System Postgres-Buchse zu verbinden.

+0

Noch nicht für Mac unterstützt? https://github.com/docker/for-mac/issues/483 – holmberd