web-dev-qa-db-fra.com

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

J'essaie de configurer une application Node.js sur plusieurs conteneurs de Docker. Mon application est actuellement sur un droplet Ubuntu DO et utilise: 

  1. Node.js (express 4)
  2. mysql pour la base de données d'applications
  3. redis pour un magasin clé-valeur
  4. nginx pour l’équilibrage de charge et servir des fichiers statiques. 

Je dois dockerize les différentes parties, une pour chaque conteneur évidemment, puis utiliser Docker-Compose (précédemment connu sous le nom de Fig) pour décrire simplement les différents conteneurs et configurer les liens entre elles. approche multi-conteneurs.
Un pour nginx
un pour Node.js & mon application express
un pour MySql
et un pour Redis

A quoi ressemblera Docker-compose.yml? Je suppose que nginx, mysql & redis seront des images officielles non modifiées? Bien que le fichier node.js ait une directive de construction à pointer vers un fichier Docker, qui notera qu’il est basé sur l’image officielle de node.js ainsi que sur les instructions de configuration? Je devrai configurer/approvisionner mysql & redis par exemple. son propre fichier Docker?

Quel serait le moyen de relier les conteneurs? Utiliser des volumes pour y copier des fichiers, Définir des ports, ajuster le fichier hosts pour mapper some.domain.com sur nginx ip?

J'aurai ensuite besoin d'installer globalement des paquets npm comme nodemon & PM2 Et de définir des tâches cron ... (sur le conteneur Node.js?)

voici un premier brouillon, j'apprécierais toute aide pour mieux comprendre cette nouvelle configuration:

Docker-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

J'utilise ce projet simple comme base, bien que mon application ait besoin

14
Ajar

Avant de configurer la pièce docker-compos, vous devez choisir l'architecture du système.

Les pièces que vous avez -

  • MySQL version X exécutable en écoute sur le port 3306
  • MySQL data stocké sur le disque
  • Redis version exécutable Y écoute sur le port 6379
  • Redis backup data sur le disque
  • Node.js version Z exécutable à l'écoute sur le port 3000
  • Fichiers de votre application Express.js
  • Nginx version exécutable Q écoute sur le port 80

Considérations supplémentaires sur l'infrastructure -

  • Une seule instance, une unité centrale/noyau
  • Une seule instance, plusieurs processeurs/cœurs
  • Plusieurs instances
  • Quel équilibreur de charge est utilisé (le cas échéant)

Pour une instance unique qui exécutera tous les composants, vous n’aurez probablement même pas besoin d’un équilibreur de charge. Par conséquent, à moins que vous ayez besoin de servir des fichiers statiques avec votre application, il n’a guère de sens d’avoir nginx _ car cela ne ferait rien d'utile.

Lorsque vous avez plusieurs conteneurs exécutant votre application express.js sur une seule instance (pour les processeurs multicœurs/CPU) ou sur plusieurs instances, vous devez procéder à un équilibrage de la charge, en utilisant éventuellement nginx.

Le traitement des données à l'intérieur du conteneur n'est pas recommandé, car le système de fichiers du conteneur ne permet pas de gérer des données à forte mutation. Donc, pour MySQL et Redis, vous souhaiterez probablement avoir des points de montage externes où les données résident.

Votre application Express.js doit être configurée avec les serveurs Redis et MySQL avec lesquels elle doit se connecter. Pour ce faire, vous pouvez utiliser des liens Docker.

Ainsi, votre Docker Compose ressemblera à ceci:

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

Cela suppose que vous allez stocker les données de MySQL et de Redis sur le système de fichiers hôte dans /data et que votre application sur le système de fichiers hôte est à /src/app.

Je vous recommande de rechercher la référence de fichier Docker Compose YAML pour toutes les options qui peuvent être utilisées https://docs.docker.com/compose/yml/ .

Étant donné que les images utilisées sont les images bienheureuses de Docker HUB, il est important de prendre note de leurs fichiers Lisez-moi pour plus de configuration -

Il est facile d’ajouter d’autres instances de l’application, mais vous devrez ensuite ajouter nginx pour équilibrer la charge du trafic entrant dans plusieurs conteneurs d’application.

Ensuite, lorsque vous souhaitez exécuter ce type d’installation avec plusieurs hôtes, cela devient beaucoup plus complexe, car les liens Docker-Link ne fonctionneront pas et vous aurez besoin d’un autre moyen de découvrir les adresses IP et les ports du conteneur. Et un équilibreur de charge devra avoir un seul point de terminaison acceptant le trafic pour plusieurs instances de l'application. Ici, je recommanderais de jeter un coup d'oeil sur https://consul.io pour obtenir de l'aide.

25
Evgeny

Je pense que vous n'avez pas besoin de scinder nginx et nodejs en différentes instances. Actuellement, je suis également en train de configurer nodejs sur docker, je serai donc de retour ici bientôt et j'essaierai de donner une réponse complexe à votre question.

Vous y trouverez un article utile sur la configuration d'une architecture similaire sur docker http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/ , la différence Django/nodejs ne devrait pas être un problème.

0
Damian Gądziak