Контейнер Docker недоступен - PullRequest
0 голосов
/ 17 января 2019

У меня установлен Docker на виртуальной машине Ubuntu 16.04, и я работаю над личным проектом с использованием nodejs, а образ Docker взят из DockerFile. контейнер работает, но когда я пытаюсь получить к нему доступ с публичного IP-адреса VP, он недоступен. Я попытался свернуться, и я получил curl: (52) пустой ответ от сервера. после очень долгого времени Порт сопоставлен правильно, и нет проблем с брандмауэром. вот мой файл докера

FROM node:10.13-alpine
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN apk update && apk upgrade \
        && apk add --no-cache git \
        && apk --no-cache add --virtual builds-deps build-base python \
        && npm install -g nodemon cross-env eslint npm-run-all node-gyp 
           node-pre-gyp && npm install\
        && npm rebuild bcrypt --build-from-source
RUN npm install --production --silent && mv node_modules ../
COPY . .
RUN pwd
EXPOSE 3001
CMD npm start

Докер PS

CONTAINER ID        IMAGE               COMMAND                  CREATED             
STATUS              PORTS                    NAMES
8588419b40c4        xxx:v1             "/bin/sh -c 'npm sta…"   2 days ago          
Up 2 days           0.0.0.0:3000->3001/tcp   youthful_roentgen

1 Ответ

0 голосов
/ 17 января 2019

Пусть xxx:v1 будет именем изображения, созданным из предоставленных вами Dockerfile.

Если вы хотите получить доступ к своему приложению через хост (curl localhost:3001), то вам нужно выполнить:

docker run -p 3001:3000 xxx:v1

Эта команда привязывает порт 3000 в вашем контейнере к порту 3001 на вашем хосте (IIRC, 3000 - порт по умолчанию, используемый npm start).

После этого вы сможете получить доступ к localhost:3001 со своего хоста с помощью curl.

Обратите внимание, что директива EXPOSE в Dockerfile не предоставляет автоматически порт при работе docker run. Это просто указание на то, что ваш контейнер прослушивает порт, который вы EXPOSE d. Здесь ваша директива EXPOSE неверна, вы должны были написать:

EXPOSE 3000

, поскольку в контейнере отображается только порт 3000 (3000 - порт по умолчанию, используемый npm). Какой порт вы хотите связать с хостом (или нет), указывается только во время выполнения.

Если вы не хотите получать доступ к своему приложению через localhost, а только через IP-адрес контейнера, нет необходимости связывать порт (нет -p). Вам нужно только сделать curl <container_ip>:3000 с вашего хоста.

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