Невозможно получить доступ к серверу, работающему в контейнере, с хоста - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть простой Dockerfile

FROM golang:latest
RUN mkdir -p /app
WORKDIR /app
COPY . .
ENV GOPATH /app
RUN go install huru
EXPOSE 3000
ENTRYPOINT /app/bin/huru

Я строю так:

docker build -t huru .

и беги так:

docker run -it -p 3000:3000 huru

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

enter image description here

Я выставил серверы, работающие в контейнерах, на хост-машину, поэтому не уверен, что происходит.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Попробуйте это, если есть выходной журнал. Пожалуйста, проверьте их ...

FROM golang:latest
RUN apt -y update
RUN mkdir -p /app
COPY . /app
RUN go install huru
WORKDIR /app

docker build -t huru:latest .
docker run -it -p 3000:3000 huru:latest bin/huru
0 голосов
/ 04 ноября 2018

Из информации, представленной в вопросе, если вы видите журналы приложения (docker logs <container_id>), после чего приложение-докер запускается успешно и похоже, что порт работает правильно.

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

docker ps 

и проверьте раздел "ПОРТЫ"

Если вы видите там что-то вроде 0.0.0.0:3000->3000/tcp

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

Другая возможная причина (хотя, возможно, вы уже проверили это) заключается в том, что приложение запускается и заканчивается до того, как вы на самом деле попытаетесь получить к нему доступ в браузере.

В этом случае docker ps не будет отображать покинутый контейнер, но docker ps -a покажет.

Последнее, что я могу вспомнить, это то, что в самом докер-контейнере приложение на самом деле не отвечает на порт 3000 (я имею в виду, может быть, сценарий запуска запускает веб-сервер на каком-то другом порту, поэтому выставление порта 3000 не на самом деле ничего полезного).

Для того, чтобы проверить это, вы можете ввести в сам док-контейнер что-то вроде docker exec -it <container_id> bash

и проверьте наличие открытых портов с помощью lsof -i или просто wget localhost:3000 изнутри контейнера itelf

...