2016-04-06 5 views
13

ich mit so etwas wieDocker und netstat: netstat nicht Häfen von Docker Behältern ausgesetzt zeigt,

Docker Ports meinem contaners an die Host-Maschine aussetzen
docker run -p 80:80 ... 

dann versuche ich für Debugging-Zwecke mit allen Listening-Ports angezeigt werden netstat zB:

netstat -at 

Merkwürdige ist, dass netstat nicht mit freiliegenden Ports meine docker-Container angezeigt werden, obwohl sie an den Browser hören und antworten.

Wie mache ich netstat diese exponierten Ports anzeigen?


UPDATE: Ich laufe dies auf Debian 8 Jessie. Hier ist, was ich tue:

docker ps -a 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS      PORTS          NAMES 
9dfa08bab50d  workflows-nginx  "/bin/sh -c '/usr/sbi" 2 hours ago   Up 2 hours     0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp workflows-nginx 
d0b0c3f90f13  workflows-django "/bin/sh -c 'python /" 7 hours ago   Up 3 hours     0.0.0.0:8000->8000/tcp      workflows-django 
99a857c92533  workflows-db  "/docker-entrypoint.s" 7 hours ago   Up 3 hours     5432/tcp         workflows-db 

Hier Docker meldet, dass Container-Ports an den Host weitergeleitet werden. Wenn ich den Container workflows-nginx stoppe, hört er außerdem auf, über HTTP (Port 80) auf den Browser zu antworten. Wenn ich es erneut starte, fängt es wieder an zu antworten. Hier

ist die Ausgabe von sudo netstat -at | less:

Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  
tcp  0  0 *:ssh     *:*      LISTEN  
tcp  0  0 localhost:ipp   *:*      LISTEN  
tcp  0  0 *:15672     *:*      LISTEN  
tcp  0  0 *:postgresql   *:*      LISTEN  
tcp  0  0 localhost:smtp   *:*      LISTEN  
tcp  0  0 *:25672     *:*      LISTEN  
tcp  0  0 *:48142     *:*      LISTEN  
tcp  0  0 *:sunrpc    *:*      LISTEN  
tcp  0  0 *:epmd     *:*      LISTEN  
tcp  0  0 bob-acer:34866   104.16.33.249:http  ESTABLISHED 
tcp  0  0 bob-acer:42380   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42543   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42525   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:44076   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42944   stackoverflow.com:https ESTABLISHED 
tcp  0  0 localhost:epmd   localhost:50831   ESTABLISHED 
tcp  0  0 bob-acer:42655   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42384   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:44626   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42390   stackoverflow.com:https ESTABLISHED 
tcp  0  0 localhost:50831   localhost:epmd   ESTABLISHED 
tcp  0  0 bob-acer:48301   c2.52.c0ad.ip4.st:https ESTABLISHED 
tcp  0  0 bob-acer:42151   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42205   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:42539   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:44737   stackoverflow.com:https ESTABLISHED 
tcp  0  0 bob-acer:39648   77.94.164.251:https  ESTABLISHED 
tcp6  0  0 [::]:ssh    [::]:*     LISTEN  
tcp6  0  0 localhost:ipp   [::]:*     LISTEN  
tcp6  0  0 [::]:postgresql   [::]:*     LISTEN  
tcp6  0  0 localhost:smtp   [::]:*     LISTEN  
tcp6  0  0 [::]:44794    [::]:*     LISTEN  
tcp6  0  0 [::]:8000    [::]:*     LISTEN  
tcp6  0  0 [::]:amqp    [::]:*     LISTEN  
tcp6  0  0 [::]:sunrpc    [::]:*     LISTEN  
tcp6  1  0 localhost:58497   localhost:ipp   CLOSE_WAIT 

Wie Sie sehen können, weder Port 80, noch Port 443 berichtet. Port 8000 von workflows-django aus irgendeinem Grund ist auf IPv6-Schnittstelle geöffnet. Außerdem habe ich vergessen, postgres auf dem Host-Rechner zu deaktivieren und trotzdem kollidieren sie nicht mit dem Postgres-Container workflows-db.

Alles läuft auf meinem lokalen Notebook, also kann es keine Verwechslung mit dem Host geben.

Meine Docker Version ist:

docker --version 
Docker version 1.10.3, build 20f81dd 

UPDATE 2: Dieser Zusammenhang wird auf Andockfenster Parameter SETZEN. Wenn Sie diese Zeile in Ihre Dockerdatei schreiben und den Container mit -p ausführen, wird der Port in Netstat angezeigt. Wenn Sie -p verwenden, aber nicht EXPOSE schreiben, wird Ihr Port nicht von netstat aufgelistet.

Antwort

2

Netstat sollte die exponierten Ports anzeigen. Hier ist ein Beispiel

[email protected]:docker$ sudo netstat -at|grep 3030 
[email protected]:docker$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
[email protected]:docker$ docker run -d -p 3030:80 httpd:2.4 
4310ac5fbdbc7314ab4d23e34099a710a3a8790dcf2c6d0a84202c1de5c9fd30 
[email protected]:docker$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
4310ac5fbdbc  httpd:2.4   "httpd-foreground" 3 minutes ago  Up 3 minutes  0.0.0.0:3030->80/tcp hungry_fermat 
[email protected]:docker$ sudo netstat -at|grep 3030 
tcp6  0  0 [::]:3030    [::]:*     LISTEN 
[email protected]:docker$ sudo netstat -tulpn|grep 3030 
tcp6  0  0 :::3030     :::*     LISTEN  10294/docker-proxy 
[email protected]:docker$ 

Einige grundlegende Dinge, die Sie brauchen, um sich zu vergewissern:

  1. Sind Sie netstat mit erhöhten Rechten ausgeführt wird? Etwas kann fehlen, wenn Sie nicht root sind
  2. Wird Ihr Docker-Container auf demselben Host ausgeführt, wie Sie es erwarten? Prüfen Sie mit docker ps
  3. Gibt docker ps die Portweiterleitung auf? Wie von oben, sollten Sie in der Lage sein, so etwas zu sehen 0.0.0.0:3030->80/tcp

Beachten Sie auch, dass der Docker-Proxy auf dem Host ausgeführt wird. Alle obigen Befehle setzen voraus, dass Sie unter Linux laufen. Dies wurde mit ubuntu getestet 15.10

Wenn Sie noch Sie das Gefühl, die Weiterleitung fehlen, dann bitte Ihr Betriebssystem nach zurück, Docker Version usw.

Danke,

+1

Dank für Ihre ausführliche Antwort danken. Ich habe jeden von Ihnen vorgeschlagenen Check gemacht und die Ergebnisse in meine Frage geschrieben (siehe Update). Docker-Ports werden von netstat nicht gemeldet, obwohl sie definitiv funktionieren. –

+1

Ich fühle mich wie es mit DOCKER 'EXPOSE' Parameter verwandt ist. Wenn Sie diese Zeile in Ihre Dockerdatei schreiben und den Container mit "-p" ausführen, wird der Port in Netstat angezeigt. Wenn Sie '-p' verwenden, aber' EXPOSE' nicht schreiben, wird Ihr Port nicht von netstat aufgelistet. Habe diese Hypothese noch nicht getestet. –

Verwandte Themen