2016-02-15 6 views
16

Я установил простой сервер узлов в Docker.Докеры не открыты

Dockerfile

FROM node:latest 
RUN apt-get -y update 
ADD example.js . 
EXPOSE 1337 
CMD node example.js 

example.js

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'+new Date); 
}).listen(1337, '127.0.0.1'); 
console.log('Server running at http://127.0.0.1:1337/'); 

Теперь создать образ

$ докер построить -t node_server.

Запустим в контейнере

$ Docker запустить -p 1337: 1337 -d node_server
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70

Проверьте контейнер работает и порты отображаются:

$ docker ps

CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS     NAMES 
5909e87302ab  node_server   "/bin/sh -c 'node exa" 7 seconds ago  Up 6 seconds  0.0.0.0:1337->1337/tcp grave_goldberg 

Теперь давайте прикрепить к контейнеру и проверить сервер работает внутри:

$ Докер Exec -это 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70/бен/Баш

И в команде контейнера тип линии:

[email protected]:/# curl http://localhost:1337 
Hello World 
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC) 

Выглядит хорошо?

Проблема

Когда я выполнить ту же команду локон на хосте (или перемещаться с моим браузером для http://localhost:1337) Я ничего не вижу.

Любая идея, почему сопоставление портов между контейнером и хостом не работает?

Вещи, которые я уже пробовал:

  • Бег с --expose 1337 флагом
+0

Вы не работаете с '--expose'. Вы создаете образ с директивой 'EXPOSE', * затем * вы запускаете с' --publish' (или '-p'). См. Мой ответ ниже. – VonC

ответ

30

Ваши порты подвергаясь правильно, но ваш сервер прослушивает соединения на 127.0.0.1 внутри контейнера:

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'+new Date); 
}).listen(1337, '127.0.0.1'); 

Вам необходимо запустить сервер так:

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'+new Date); 
}).listen(1337, '0.0.0.0'); 

Обратите внимание на 0.0. 0.0 вместо 127.0.0.1.

+0

Yup, это сделал. Благодаря ! –

+0

Добро пожаловать. –

+1

Прослушивание 0.0.0.0 выглядит очень странно, не сразу понятно, что это значит. По-видимому, это значение по умолчанию, поэтому вы можете просто опустить этот аргумент из функции 'listen()', которая, как мне кажется, проще понять https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback – Davos

11

Добавление ПОДВЕРГАТЬ 1337 в файл Docker

EXPOSE является обязательным, если вы хотите, чтобы «разоблачить "этот порт в другие контейнеры

Бег с --expose 1337 флагом

Не точно: вам нужно docker run это with -p 1337:1337

Вам нужно как:

  • построить изображение с EXPOSE директивы в нем
  • и запустите его с портом, опубликованным на хозяйничать -p 1337: 1337

Испытание curl http://localhost:1337 было сделано внутри контейнера (без EXPOSE или опубликовывает требуется).
Если вы хотите, чтобы он работал с хостом Linux, вам необходимо ЭКСПОЗИЦИЯ и вам нужно -p 1337:1337.
Оба.

Вы можете опубликовать только порт, который был объявлен как открытый.
Заявить об этом разоблачению не достаточно.

Например:

https://i.stack.imgur.com/wmKgd.png

На этой фигуре, 8080 является EXPOSE'd, опубликованные на хост Linux 8888
И если хост Linux не является фактическим хозяином, что одни и те же потребности порта для быстрого перехода к фактическому хосту. См. «How to access tomcat running in docker container from browser?».

Если локальный не работает с хоста Linux, попробуйте его IP-адрес:

CID=$(docker run -p 1337:1337 -d node_server) 
CIP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}) 
curl http://${CIP}:1337 

Или, как уже упоминалось выше, сделать свой сервер слушать из соединений, поступающих с любого IP: 0.0.0.0 которое the broadcast address or zero network.

+0

Благодарим за комментарий, но, как я уже упоминал выше, я уже пытался добавить EXPOSE 1337, и он не работает ни –

+0

@AssafShomer, в котором вы нуждаетесь, то есть все точки моего ответа – VonC

+0

@AssafShomer Я отредактировал ответ в чтобы сделать эту точку более ясной. – VonC

Смежные вопросы