#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
.
Технически вы можете захотеть запускать каждое отдельное приложение в другом контейнере и запускать несколько экземпляров одного и того же приложения, чтобы упростить версию каждого вашего приложения на более новом независимом образе. Это позволит вам независимо останавливать, развертывать и запускать ваши приложения в производственной среде.