Dockerfile — создание образа docker для нескольких Node.js приложение

#node.js #docker #dockerfile

#node.js #docker #dockerfile

Вопрос:

Как мне запустить все мои Node.js файл в одном контейнере?

  • app1.js выполняется на порту 1001
  • app2.js работает на порту 1002
  • app3.js работает на порту 1003
  • app4.js работает на порту 1004

Dockerfile

 FROM node:latest
WORKDIR /rootfolder
COPY package.json ./
RUN npm install
COPY . .
RUN chmod  x /script.sh
RUN /script.sh
  

script.sh

 #!/bin/sh
node ./app1.js
node ./app2.js
node ./app3.js
node ./app4.js
  

Комментарии:

1. Однако в чем проблема?

2. Ознакомьтесь с документацией Docker для получения рецепта.

Ответ №1:

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

В вашем Dockerfile удалите RUN /script.sh строку в конце. (Это попытается запустить серверы во время сборки образа, чего вы не хотите.) Теперь вы можете создавать и запускать контейнеры:

 docker build -t myapp .      # build the image
docker network create mynet  # create a Docker network
docker run                  # run the first container...
  -d                        #   in the background
  --net mynet               #   on that network
  --name app1               #   with a known name
  -p 1001:3000              #   publishing a port
  myapp                     #   from this image
  node ./app1.js             #   running this command
docker run 
  -d 
  --net mynet 
  --name app2 
  -p 1002:3000 
  myapp 
  node ./app2.js
  

(Я предположил, что все скрипты прослушивают экспресс-порт 3000 по умолчанию, который является вторым номером порта в -p параметрах.)

Docker Compose — это полезный инструмент для совместного запуска нескольких контейнеров, который может тиражировать эту функциональность. docker-compose.yml Файл, соответствующий этой настройке, будет выглядеть следующим образом:

 version: '3.8'
services:
  app1:
    build: .
    ports:
      - 1001:3000
    command: node ./app1.js
  app2:
    build: .
    ports:
      - 1002:3000
    command: node ./app2.js
  

Compose самостоятельно создаст сеть Docker и возьмет на себя ответственность за присвоение имен изображениям и контейнерам. docker-compose up запустит все службы параллельно.

Комментарии:

1. Есть ли причина, по которой вы не ответили на вопрос?

2. Как бы вы ответили на аналогичный вопрос без Docker? «У меня есть пять отдельных приложений узла; как мне запустить их все одной командой?» Правильный ответ для простого узла должен быть «запущен node appN.js пять раз», а не «упаковать их в один процесс с несколькими приложениями»; аналогичная логика применима к контейнерам.

Ответ №2:

Сначала необходимо предоставить доступ к портам с помощью:

 EXPOSE 1001
...
EXPOSE 1004
  

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

ссылка: https://docs.docker.com/engine/reference/commandline/run /

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

Тем не менее, ничто не мешает вам использовать:

 docker exec -it yourDockerMachineName bash
  

несколько раз, когда вы можете использовать каждый из своих cmd’ов узла.

Ответ №3:

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

 docker run -p <your_public_tcp_port_number>:3000 <image_name> 
  

или было бы достаточно хорошего docker-compose.yaml .

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