ДОКАЛЬНАЯ ЭКСПОЗИЦИЯ. Не получается

В последние два дня у меня проблемы с докером, и я могу это получить. Следуя документу docker, вы можете открыть порты, на которых контейнер будет прослушивать соединения с EXPOSE. Пока что так хорошо!

Если мое приложение прослушивает порт 8080, я должен открыть контейнер docker с помощью EXPOSE 8080 и привязать его к порту 80 основного узла с помощью docker run -p 80:8080.

Вот мой файл Docker:

# 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

И мой start.sh просто runan cd /root/ и npm install и node server.js.

У меня есть простое приложение express nodejs:

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);

Вот как я создаю изображение докеры: docker build -t app1 . И как я запускаю свой докер: docker run -it -p 80:8080 --name app1 app1

Что действительно подключено, это не работает. Чтобы заставить его работать, мне нужно изменить EXPOSE 8080 на EXPOSE 80. Я не понимаю.

Любое объяснение?

Спасибо за чтение, Том

Ответ 1

В вашем приложении nodejs у вас есть инструкция app.listen(PORT);, которая сообщает nodejs запускать сервер, который прослушивает подключения на интерфейсе loopback на порту PORT. В результате ваше приложение сможет видеть только соединения, происходящие из localhost (самого контейнера).

Вам нужно сказать, что ваше приложение прослушивает все интерфейсы на порту PORT:

app.listen(PORT, "0.0.0.0");

Таким образом, он увидит соединения, исходящие из вашего контейнера Docker.