Приложение nodejs не подключается к localhost при запуске в контейнере Docker

My environment:
Ubunut 17.04 LTS
npm --version: 5.6.0
nodejs --version: 4.7.2
angular cli version: 1.6.4

docker-compose file:

version: '3'

services:
 my-app:
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    volumes:
      - .:/usr/src/app
    ports:
      - "4200:4200"

Я закомментировал EXPOSE 4200 в dockerfile, потому что я уже монтирую его из файла docker-compose.yml, разве это не нормально, мне выставлять в dockerfile и монтировать в docker-compose?

Запуск npm start в командной строке успешно запускает приложение в браузере, так как я могу перейти на localhost:4200 и увидеть приложение работает.

Однако, если я создаю свое приложение с помощью docker и запускаю docker-compose, я вижу, что сервер nodejs все еще работает localhost:4200Тем не менее, я не могу получить доступ к приложению, собираюсь localhost:4200 не открывает страницу.

Запуск приложения вручную работает отлично, я могу увидеть его на браузере:

ubuntu17@ubuntu17:~/playground/apps/myapp-ui$ ng serve
** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
Date: 2018-01-16T16:22:51.912Z                                                          
Hash: 40ac2bd0588ee2136d15
Time: 13963ms
chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] [rendered]
chunk {main} main.bundle.js (main) 275 kB [initial] [rendered]
chunk {polyfills} polyfills.bundle.js (polyfills) 559 kB [initial] [rendered]
chunk {styles} styles.bundle.js (styles) 514 kB [initial] [rendered]
chunk {vendor} vendor.bundle.js (vendor) 12.1 MB [initial] [rendered]

webpack: Compiled successfully.

ЗАПУСК ПРИЛОЖЕНИЯ ОТ DOCKER-COMPOSE UP ЗАПУСКАЕТСЯ НЕСКОЛЬКО, НО Я НЕ МОГУ ВИДЕТЬ ПРИЛОЖЕНИЕ В БРАУЗЕРЕ с localhost:4200

И из докера-сочиняй

ubuntu17@ubuntu17:~/playground/apps/my-app-ui$ docker-compose up 
Creating network "my-app_default" with the default driver
Creating my-app_my-app_1 ... done
Attaching to my-app_my-app_1
my-app_1  | ** NG Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **
my-app_1  | Date: 2018-01-16T16:28:05.444Z
my-app_1  | Hash: 40ac2bd0588ee2136d15
my-app_1  | Time: 13584ms
my-app_1  | chunk {inline} inline.bundle.js (inline) 5.79 kB [entry] [rendered]
my-app_1  | chunk {main} main.bundle.js (main) 271 kB [initial] [rendered]
my-app_1  | chunk {polyfills} polyfills.bundle.js (polyfills) 549 kB [initial] [rendered]
my-app_1  | chunk {styles} styles.bundle.js (styles) 511 kB [initial] [rendered]
my-app_1  | chunk {vendor} vendor.bundle.js (vendor) 12.1 MB [initial] [rendered]
my-app_1  | 
my-app_1  | webpack: Compiled successfully.

3 ответа

Решение

Хорошо, как вы говорите в своем вопросе, ваш процесс прослушивает соединение на localhost:4200,

Внутри док-контейнера, localhost это адрес устройства обратной связи самого контейнера, который отделен и недоступен для вашей хост-сети.

Вам нужно отредактировать процесс вашего узла, чтобы он прослушивал все адреса, редактируя точку входа в вашем файле Docker следующим образом:

ENTRYPOINT ["ng", "serve", "-H", "0.0.0.0"]

В файле docker-compose обязательно экспортируйте порты:

services:
  node:
   ports:
     - 4200:4200

Я недавно столкнулся с этим. Чтобы он хорошо работал в контейнере Docker, вам нужно привязаться к 0.0.0.0 вместо 127.0.0.1 на вашем сервере приложений node. Например:

      const http = require('http');

const hostname = '0.0.0.0'; // Do not use 127.0.0.1 here
const port = 3000;

const server = http.createServer((req, res) => {
  // do stuff
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
Другие вопросы по тегам