2015-05-10 12 views
8

Ho la seguente configurazione:
DockerfileEsecuzione di un contenitore Docker che accetta il traffico dall'host

FROM centos 
MAINTAINER Eduar Tua <[email protected]> 

RUN yum -y update && yum clean all 
RUN yum -y install httpd && yum clean all 
RUN echo "Apache works" >> /var/www/html/index.html 

EXPOSE 80 

ADD run-apache.sh /run-apache.sh 
RUN chmod -v +x /run-apache.sh 

CMD ["/run-apache.sh"] 

Lo script run-apache.sh:

#!/bin/bash 

rm -rf /run/httpd/* /tmp/httpd* 

exec /usr/sbin/apachectl -D FOREGROUND 

Poi ho generare l'immagine con :

sudo docker build --rm -t platzi/httpd . 

poi

01.235.164,106174 millions
sudo docker run -d -p 80:80 platzi/httpd 

Dopo che quando provo a fare funzionare il contenitore accettare le connessioni dall'host nel porto 80 ottengo questo:

67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657 
FATA[0002] Error response from daemon: Cannot start container  67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use 

Qualsiasi aiuto?

+0

Voi dite 'sta facendo' 'docker run'" e poi dopo "prova [ing] per eseguire il contenitore." Perché lo stai eseguendo dopo che l'hai già eseguito? – jwodder

+0

Hey @jwodder è stato un mio errore scrivere così, ho ricevuto l'errore dopo aver eseguito il contenitore. Questo è ciò che intendo. – eduartua

+0

Anche quando controllo con 'docker ps' non ci sono contenitori in esecuzione. – eduartua

risposta

7

L'errore sembra abbastanza chiaro:

FATA [0002] Reazione all'errore dal demone: Impossibile avviare contenitore 67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Errore di partenza delega userland: ascolta tcp 0.0.0.0:80: bind: indirizzo già in uso

Dice "indirizzo già in uso". Ciò significa che qualcosa nel sistema - probabilmente un web server come Apache - è già in ascolto sulla porta 80. Vi sia necessario:

  • arrestare il server web,
  • selezionare una porta host diverso l'argomento -p a docker run o
  • basta rilasciare l'argomento -p.

Poiché Docker non è in grado di configurare il port forwarding richiesto, non avvia il contenitore.

Le opzioni (a) e (b) consentiranno al contenitore di collegarsi alla porta 80 dell'host. Questo è necessario solo se si desidera accedere al contenitore da un luogo diverso dal proprio host.

L'opzione (c) è utile se si desidera solo accedere al contenitore dall'host di docker ma non si desidera esporre altrimenti il ​​contenitore sulla rete locale. In questo caso, si può usare l'indirizzo IP del contenitore assegnati dal finestra mobile, che si può ottenere eseguendo docker inspect e sfogliando l'uscita, o semplicemente eseguendo:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id 
+1

Grazie a @larsks Il server Web Apache era in esecuzione sul mio sistema host. Posso avere Apache in esecuzione sul mio host e reindirizzare il traffico al mio contenitore? entrambi sulla porta 80. – eduartua

+0

Non è possibile avere due cose in ascolto sulla stessa porta sullo stesso indirizzo IP. Se si desidera che il proprio contenitore sia accessibile dall'esterno dell'host sulla porta 80, sarà necessario assegnare un indirizzo IP aggiuntivo all'host e quindi associare il contenitore a tale indirizzo utilizzando il flag '-p' (' -p : : '). – larsks

+0

Grazie a @larsks, domanda stupida. Ma il tuo suggerimento mi aiuta molto. – eduartua

7

Si sta dicendo la porta 80 è occupato ... run per vedere chi sta utilizzando la porta 80

netstat -tlnp | grep 80 

tcp  0  0 0.0.0.0:80    0.0.0.0:*    LISTEN  1380/nginx -g daemo 
tcp6  0  0 :::80     :::*     LISTEN  1380/nginx -g daemo 

scorrere a destra per vedere il PID offensivo del processo che tiene la porta 80 ...il suo PID 1380 così lascia fare una lista dei processi di vedere che pid

ps -eaf | grep 1380 

root  1380  1 0 11:33 ?  00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 

modo teardown quel processo incriminato per liberare la porta 80

sudo kill 1380 # if you know the pid (1380 for example) 

__ o __

sudo fuser -k 80/tcp # just kill whatever pid is using port 80 tcp