Подтвердить что ты не робот

Docker + fig/compose + nginx + node.js + mysql + redis

Я пытаюсь настроить приложение Node.js на несколько контейнеров Docker. Мое приложение в настоящее время находится на одной капельке Ubuntu DO и использует:

  • Node.js(express 4)
  • mysql для базы данных приложений
  • redis для хранилища ключей.
  • nginx для балансировки нагрузки и подачи статических файлов.

Мне нужно докерезировать разные части, по одному для каждого контейнера, а затем использовать Docker-Compose (ранее известный как рис.), чтобы просто описать различные контейнеры и установить связи между ними. Я краду неясно о многоконтейнерной оценке.
Один для nginx
один для Node.js и моего экспресс-приложения
один для MySql
и один для Redis

Как будет выглядеть Docker-compose.yml? Я предполагаю, что nginx, mysql и redis будут неизмененными официальными изображениями? В то время как Node.js будет иметь директиву сборки, указывающую на файл Docker, который отмечает, что он основан на официальном изображении Node.js вместе с инструкциями по настройке? Мне нужно будет настроить/предоставить mysql и redis, например, значит ли это, что каждый должен быть отдельным с собственным Dockerfile?

Каким будет связь между контейнерами? использовать тома для копирования файлов в них, настройка портов, настройка файла hosts для сопоставления some.domain.com с nginx ip?

Затем мне понадобится установить глобально некоторые пакеты npm, такие как nodemon и PM2 и установить некоторые задания cron... (в контейнере Node.js?)

вот первый черновик, я был бы признателен за любую помощь, чтобы лучше понять эту новую настройку:

Докер-compose.yml

nginx:
  image: nginx
  links:
    - "node"

node:
  build: .
  volumes:
    - "app:/src/app"
  ports:
    - "3030:3000"
  links:
    - "db:mysql"

db:
  image: mysql:5.6
  environment:
    - MYSQL_ROOT_PASSWORD=mypassword

Dockerfile

FROM node:0.12

RUN mkdir /src

RUN npm install nodemon pm2 -g

WORKDIR /src

ADD app/package.json /src/package.json

RUN npm install

ADD app/nodemon.json /src/nodemon.json

EXPOSE 3000

CMD npm start

Я использую этот простой проект в качестве базы, хотя мне нужно приложение

4b9b3361

Ответ 1

Перед настройкой части, содержащей докеры, вы должны выбрать архитектуру системы.

Части, которые у вас есть -

  • MySQL исполняемая версия X, прослушивающая порт 3306
  • MySQL данные, хранящиеся на диске
  • Исполняемая версия Redis Y, прослушивающая порт 6379
  • Redis backup данные на диске
  • Node.js исполняемая версия Z прослушивание на порту 3000
  • Файлы вашего приложения Express.js
  • Исполняемая версия Nginx Q, прослушивающая порт 80

Дополнительные соображения инфраструктуры -

  • Один экземпляр, один процессор/ядро ​​
  • Отдельный экземпляр, несколько процессоров/ядер
  • Несколько экземпляров
  • Какой балансировщик нагрузки используется (если вообще)

Для одного экземпляра, который будет запускать все компоненты, вам, вероятно, даже не нужен балансировщик нагрузки, поэтому, если вам не нужно обслуживать статические файлы вместе с вашим приложением, здесь нет никакого смысла иметь nginx, потому что он не будет делать что-нибудь полезное.

Когда у вас несколько контейнеров, на которых запущено приложение express.js, либо на одном экземпляре (для многоядерных процессоров), либо в нескольких экземплярах, то вам нужно иметь какую-то балансировку нагрузки, возможно, используя nginx.

Обработка данных внутри контейнера не рекомендуется, так как файловая система контейнера не очень хорошо справляется с обработкой сильно мутирующих данных. Поэтому для MySQL и Redis вы, вероятно, захотите иметь внешние точки монтирования, в которых находятся данные.

Приложение Express.js нуждается в настройке того, с какими серверами Redis и MySQL ему нужно подключиться, это можно сделать с помощью Docker-ссылок.

Таким образом, ваш Docker Compose будет выглядеть примерно так:

redis:
  image: redis
  volumes:
    - /data/redis:/data

mysql:
  image: mysql:5.6
  environment:
    - MYSQL_ROOT_PASSWORD=verysecret
  volumes:
    - /data/mysql:/var/lib/mysql

application:
  image: node:0.12
  working_dir: /usr/src/myapp
  volumes:
    - /src/app:/usr/src/myapp
  ports:
    - 80:3000
  links:
    - redis
    - mysql

Предполагается, что вы сохраните данные MySQL и Redis в файловой системе хоста в /data, а ваше приложение в файловой системе хоста находится в /src/app.

Я рекомендую вам найти ссылку на Docker Compose YAML для всех различных опций, которые можно использовать https://docs.docker.com/compose/yml/.

Поскольку используемые изображения - это благословенные изображения из Docker HUB, их файлы readme важны, чтобы принять во внимание больше настроек -

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

Затем, когда вы хотите запустить такую ​​настройку с помощью нескольких хостов, она становится намного более сложной, поскольку докеры-ссылки не работают, и вам нужен другой способ обнаружения IP-адресов и портов контейнера. И для балансировки нагрузки потребуется одна конечная точка, которая принимает трафик для нескольких экземпляров приложения. Здесь я бы рекомендовал внимательно ознакомиться с https://consul.io для справки.

Ответ 2

Я думаю, что вам не нужно разделить nginx и nodejs на разные экземпляры. В настоящее время я также настраиваю nodejs на докере, поэтому скоро вернусь сюда и постараюсь ответить на ваш вопрос сложным ответом.

Здесь вы можете найти полезную статью о настройке подобной архитектуры на docker http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/, разница django/nodejs не должна быть проблемой.