2014-10-31 15 views
10

questo ultimo giorno ho problemi con la finestra mobile e posso ottenerlo. Seguendo il documento docker è possibile esporre le porte su cui un contenitore ascolterà le connessioni con EXPOSE. Fin qui tutto bene!Docker ESPOSIZIONE. Non riesco a ottenerlo

Se l'app in ascolto sulla porta 8080, è necessario esporre il contenitore docker con EXPOSE 8080 e collegarlo alla porta 80 dell'host principale con docker run -p 80:8080.

Ecco il mio Dockerfile:

# DOCKER-VERSION 0.0.1 

FROM ubuntu:14.10 

# make sure apt is up to date 
RUN apt-get update 

# install nodejs and npm 
RUN apt-get install -y nodejs-legacy npm git git-core 

ADD package.json /root/ 
ADD server.js /root/ 

# start script 
ADD start.sh /root/ 
RUN chmod +x /root/start.sh 

EXPOSE 8080 

CMD ./root/start.sh 

E il mio start.sh solo Runan cd /root/ & npm install & node server.js.

ho avuto un semplice espresso nodejs app:

var express = require('express'); 

// Constants 
var PORT = 8080; 

// App 
var app = express(); 
app.get('/', function (req, res) { 
    res.send('Hello world\n'); 
}); 

app.listen(PORT); 
console.log('Running on http://localhost:' + PORT); 

ecco come lo costruisco la mia immagine finestra mobile: docker build -t app1 . E come lancio il mio finestra mobile: docker run -it -p 80:8080 --name app1 app1

Ciò che è veramente cablata, questo non è lavoro. Per farlo funzionare devo cambiare EXPOSE 8080 a EXPOSE 80. Non capisco

Ogni spiegazione?

Grazie per la lettura, Tom

+0

Questo è un problema di configurazione, io uso quel tipo di mappatura delle porte tutto il tempo. "Non funziona" non è un'informazione sufficiente. Le porte sono aperte sull'host? Cosa succede se lo si mappa direttamente? -p 8080: 8080? ecc. ecc. – user2105103

+0

Quando dico "Non funziona", ciò significa che non sono in grado di connettermi al mio contenitore usando curl o qualsiasi browser sulla porta 80, anche se richiedo il mio contenitore sull'host principale. L'uso di "-p 8080: 8080" non cambia nulla. –

risposta

26

Nella tua nodejs applicazione, si ha l'istruzione app.listen(PORT); che racconta nodejs di avviare un server in attesa di connessioni sulla interfaccia di loopback sulla porta PORT. Di conseguenza, la tua app potrà vedere solo le connessioni provenienti da localhost (il contenitore stesso).

Dovete dire la vostra applicazione per l'ascolto su tutte le interfacce sulla porta PORT:

app.listen(PORT, "0.0.0.0"); 

In questo modo sarà vedere le connessioni provenienti dall'esterno del contenitore Docker.

+0

Grazie, ora capisco;) –

+0

Non ha funzionato per me. :( –

+0

Ho dovuto mettere --production param alla fine della linea durante l'esecuzione nodejs comando. Con questo parametro + vostra punta ora funziona. –

Problemi correlati