Что я делаю не так с моим миром express.js и настройкой Docker? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь сделать две вещи

  1. Создать базовое приложение типа "hello world", используя Node / Express.js.
  2. Разместите это приложение в докере (сейчас у меня в локальной системе Mac OS)

Вот что у меня в папке:

root of application
-> node_modules
-> .dockerignore
-> Dockerfile
-> index.js
-> package-lock.json
-> package.json

Мой Dockerfile:

FROM node:lts
WORKDIR "/app"
COPY package.json /app/
RUN cd /app; npm install
COPY . /app
EXPOSE 8888
CMD ["node", "index.js"]

Мой index.js:

const express = require('express')
const app = express()
const port = 8888
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Мой package.json:

{
  "name": "my-software",
  "version": "1.0.0",
  "description": "My Software",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Me",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}

Мой .dockerignore:

node_modules/

Это то, что я делаю, чтобы попытаться запустить его.

1) Сначала я проверяю, что мое экспресс-приложение работает независимо, запустив npm install, а затем node index.js.Я вижу, что он работает и доступен в браузере на localhost: 8888.

2) После запуска docker build . я получаю что-то вроде этого:

Sending build context to Docker daemon  18.94kB
Step 1/7 : FROM node:lts
 ---> 75a3a4428e1d
Step 2/7 : WORKDIR "/app"
 ---> Using cache
 ---> 57a5a3028928
Step 3/7 : COPY package.json /app/
 ---> Using cache
 ---> 74939286881b
Step 4/7 : RUN cd /app; npm install
 ---> Using cache
 ---> f7e142ba9040
Step 5/7 : COPY . /app
 ---> Using cache
 ---> ea7cc365795d
Step 6/7 : EXPOSE 8888
 ---> Using cache
 ---> 82297fe77ca8
Step 7/7 : CMD ["node", "index.js"]
 ---> Using cache
 ---> e2fb0c6c00a3
Successfully built e2fb0c6c00a3

3) После этого язапустите docker run e2fb0c6c00a3 (используя хэш того, что было построено на шаге 2)

Примечание: в консоли все выглядит так, как будто оно работает.Я вижу сообщение "Пример приложения, прослушивающего порт 8888!"но когда я перезагружаю locahost: 8888 в браузере, я ничего не получаю.Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Обратите внимание на следующее в документации Docker для EXPOSE:

Команда EXPOSE фактически не публикует порт.... Чтобы на самом деле опубликовать порт при запуске контейнера, используйте флаг -p в окне запуска Docker, чтобы опубликовать и сопоставить один или несколько портов

Таким образом, вы должны использовать docker run -p 8888:8888 e2fb0c6c00a3

0 голосов
/ 04 декабря 2018

Если вы хотите получить доступ к своему веб-серверу на узле, который работает в контейнере, из вашей системы host , вам нужно каким-то образом указать действительное имя хоста.

Самая простая вещь из всехвы можете использовать host сетевой режим при запуске докера.Тогда вы сможете соединиться с localhost:

docker run -it --net=host blahblah

В противном случае, если вы не укажете host сеть, вам нужно будет знать ip address вашего контейнера.И подключитесь к нему с указанным адресом.

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