Ответ 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 важны, чтобы принять во внимание больше настроек -
- https://registry.hub.docker.com/_/mysql/
- https://registry.hub.docker.com/_/node/
- https://registry.hub.docker.com/_/redis/
Добавление дополнительных экземпляров приложения очень просто, но тогда вам нужно будет добавить nginx, чтобы загрузить баланс входящего трафика в несколько контейнеров приложений.
Затем, когда вы хотите запустить такую настройку с помощью нескольких хостов, она становится намного более сложной, поскольку докеры-ссылки не работают, и вам нужен другой способ обнаружения IP-адресов и портов контейнера. И для балансировки нагрузки потребуется одна конечная точка, которая принимает трафик для нескольких экземпляров приложения. Здесь я бы рекомендовал внимательно ознакомиться с https://consul.io для справки.