J'essaie de configurer une application Node.js sur plusieurs conteneurs de Docker. Mon application est actuellement sur un droplet Ubuntu DO et utilise:
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
Avant de configurer la pièce docker-compos, vous devez choisir l'architecture du système.
Les pièces que vous avez -
Considérations supplémentaires sur l'infrastructure -
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.
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.