2015-11-11 7 views
11

Ich versuche, die Standardwebseite von Nginx geladen zu bekommen, aber ich kann keine Verbindung zu Port 80 über http nach der Container läuft.Nginx: [emerg] bind() zu 0.0.0.0:80 fehlgeschlagen (98: Adresse bereits verwendet) auf Docker

Ich bin mit Docker 1.9.9

Die Schritte, die ich nahm wie folgt sind:

Ich habe eine Docker-Datei, die diese:

FROM ubuntu:15.10 

RUN echo "Europe/London" > /etc/timezone 
RUN dpkg-reconfigure -f noninteractive tzdata 

ENV DEBIAN_FRONTEND noninteractive 

RUN apt-get update 
RUN apt-get install -y nginx 
RUN apt-get install -y supervisor 
RUN apt-get update && apt-get -q -y install lsof 
RUN apt-get install net-tools 
RUN apt-get install psmisc 
RUN apt-get -y install curl 

ADD supervisor.nginx.conf /etc/supervisor.d/nginx.conf 

CMD /usr/bin/supervisord -n 

RUN rm -Rf /etc/nginx/conf.d/* 
RUN rm /etc/nginx/sites-enabled/default 

RUN mkdir /etc/nginx/logs/ 
RUN touch /etc/nginx/logs/error.log 

RUN mkdir /usr/share/nginx/logs/ 
RUN touch /usr/share/nginx/logs/error.log 

ADD ./conf/nginx.conf /etc/nginx/sites-available/default 
RUN ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default 

copy ./dist /usr/share/nginx/html 

CMD /usr/bin/supervisord -n 

Andockfenster Datei kopiert die nginx-Konfigurationsdatei unten in /etc/nginx/sites-available/default und erstellt einen Symlink zu dieser Datei für /etc/nginx/sites-enabled/default.

server { 
    root /usr/share/nginx/html; 
    index index.html index.htm; 

    # redirect server error pages to the static page /50x.html 
    # 
    error_page 500 502 503 504 /50x.html; 
    location = /50x.html { 
    root /usr/share/nginx/html; 
    } 

    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { 
    access_log  off; 
    log_not_found  off; 
    expires   5d; 
    } 

    # deny access to . files, for security 
    # 
    location ~ /\. { 
    access_log off; 
    log_not_found off; 
    deny all; 
    } 
} 

Ich baute dann das Bild mit:

docker build -t dnginx 

ich den Behälter begann mit:

docker run --name d3 -d -p 80:80 dnginx 

fand ich dann die IP-Adresse und versucht

curl http://172.17.0.2 
zu verbinden

Die zurückgegeben

Curl: (7) konnte nicht 80 bis 172.17.0.2 Port verbinden: Operation

timed out

I eine bash in dem Behälter geöffnet und lief nginx die zurückgegeben:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] still could not bind() 

Wenn ich netstat --listen laufen erhalte ich:

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
tcp  0  0 *:80     *:*      LISTEN 

Wenn ich 01.232.896 laufenich:

tcp  0  0 0.0.0.0:80    0.0.0.0:*    LISTEN  - 

Ich habe absolut keine Ahnung, was passiert ist.

Das gleiche passiert, wenn ich nur mit dem Nginx-Bild verbinden.

+0

Wenn Sie laufen 'netstat --listen' auf dem Host-Betriebssystem, was hört auf Port 80? – mgaido

+0

Ich bekomme: tcp 0 0 *: http *: * LISTEN – dagda1

+0

Das bedeutet, dass etwas auf Ihrem Port 80 zu hören ist ... – mgaido

Antwort

10

Ich habe Ihre Dockerfile versucht und es hat wie erwartet funktioniert. Die einzigen Änderungen, die ich gemacht waren etwas Entfernung zu supervisord Bezug und das Hinzufügen von

CMD ["nginx", "-g", "daemon off;"] 

am Ende der Dockerfile.

Wenn ein Container gestartet wird, ist sein Netzwerk-Namespace vollständig vom Host und von den anderen Containern isoliert, und die einzigen Prozesse sind die von den ENTRIPOINT- oder CMD-Direktiven und den untergeordneten, also denke ich, dass das nginx Sie sehen, in dem Container zu laufen ist genau der, der von supervisord ausgeführt wird.

Sind Sie sicher, dass 172.17.0.2 die aktuelle IP des Andockcontainers ist? Die Container-IP ist nicht stabil und hängt davon ab, wie viele Container auf Ihrem Host ausgeführt werden und in welcher Reihenfolge sie gestartet wurden.

Sie geben den http-Port auf dem Host mit der Ausführungsoption '-p 80:80' frei, sodass Sie auf dem Docker-Host unter Verwendung von curl 127.0.0.1 darauf zugreifen können.

12

Ich habe das gleiche Problem in diesen Tagen, aber ich muss Multi-Prozess laufen, so entfernen Supervisord ist keine Lösung für mich.

Einfach hinzufügen -g "daemon off;" Flag Supervisor nginx Programmbefehl löst das Problem. Das ist

[program:nginx] command=/usr/sbin/nginx -g "daemon off;"

Es scheint, dass alle Verfahren in einem Behälter muss im Vordergrund ausgeführt werden, auch von supervisord Tools verwaltet

+0

Dies ist die tatsächliche Lösung, wenn Supervisor erforderlich ist. Vielen Dank! – Greendrake

+0

danke! Bestätigen, dass dies funktioniert –

+0

danke, das hat eine Weile gedauert, bis zu finden! – maxfowler

Verwandte Themen