Запущенный докер контейнер недоступен с хоста (localhost: 8081) - PullRequest
1 голос
/ 05 ноября 2019

Использование Ubuntu.

На основе этого руководства:

https://www.freecodecamp.org/news/how-to-use-routing-in-vue-js-to-create-a-better-user-experience-98d225bbcdd9/

Я создал минимальный проект vuejs со структурой проекта ниже:

https://github.com/dev-samples/samples/tree/master/vuejs-001

frontend-router/
  build/
  config/
  src/
  static/
  test/
  build.sh
  Dockerfile.dev
  package-lock.json
  package.json

Где:

Dockerfile.dev

FROM node:10
RUN apt install curl
RUN mkdir /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json

# make the 'app' folder the current working directory before running npm install
WORKDIR /app

RUN npm install
CMD [ "npm", "run", "dev" ]

Я создаю образ и запускаю контейнер из этого образас:

docker build -t frontend-router-image -f Dockerfile.dev .
docker rm -f frontend-router-container

docker run -it -p 8081:8080 -v ${PWD}:/app/ -v /app/node_modules --name frontend-router-container frontend-router-image

, что дает:

DONE  Compiled successfully in 1738ms                                                                                                                                                    3:49:45 PM

 I  Your application is running here: http://localhost:8080

Поскольку я добавляю -p 8081:8080 к команде запуска docker, я ожидаю, что я смогу получить доступ к приложению из моего главного браузера на:

http://localhost:8081/

но выдает следующее сообщение об ошибке:

enter image description here

Я отлично работаю, когда запускаю его с ванильюнпм от моего хозяина. Но почему я не могу получить доступ к приложению, когда оно запускается из контейнера Docker?

Исходный код здесь:

https://github.com/dev-samples/samples/tree/master/vuejs-001

Как предложено ниже, я попытался:

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
e011fb9e39e8        frontend-router-image   "docker-entrypoint.s…"   12 seconds ago      Up 9 seconds        0.0.0.0:8081->8080/tcp   frontend-router-container

$ docker run -it --rm --net container:frontend-router-container nicolaka/netshoot ss -lnt
State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port    
LISTEN    0         128              127.0.0.1:8080             0.0.0.0:*       

Для сравнения этот проект работает нормально:

https://github.com/dev-samples/samples/tree/master/vuejs-002

Это означает, что когда я запускаю контейнер, я могу получить доступ к веб-приложению через браузер хоста на localhost:8081

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

На основе этого:

https://github.com/webpack/webpack-dev-server/issues/547

и:

https://dev.to/azawakh/don-t-forget-to-give-host-0-0-0-0-to-the-startup-option-of-webpack-dev-server-using-docker-1483

https://pythonspeed.com/articles/docker-connection-refused/

Работаетесли я изменю:

host: 'localhost', // can be overwritten by process.env.HOST

на:

host: '0.0.0.0', // can be overwritten by process.env.HOST

в файле: / frontend-router / config / index.js

0 голосов
/ 06 ноября 2019

Когда у вас есть connection reset, это обычно означает, что никто не слушает порт.

Кажется, что вы слушаете на localhost, вы должны прослушивать 0.0.0.0, когда находитесь в докере.

в вашем файле config/index.js, host равно localhost, вы должны удалить директиву host

Если вы слушаете 127.0.0.1 или localhost, вы слушаетев локальной сети, поэтому внутри контейнера доступ к веб-серверу может осуществляться только локальным процессом.

Еще один источник проблем, с которыми вы можете столкнуться, это подключение к неправильному порту.

если вызапустить с docker run -it -p 8081:8080 вы должны получить доступ к http://localhost:8081/

см.

Опубликовать или открыть порт (-p, --expose) с https://docs.docker.com/engine/reference/commandline/run/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...