Comment emballer une application VueJS + NodeJS + MongoDB dans Docker

Comment emballer une application VueJS + NodeJS + MongoDB dans Docker
Comme on peut le comprendre dans l'article prĂ©cĂ©dent, j'ai travaillĂ© sur diffĂ©rents projets. Les premiers jours dans une nouvelle Ă©quipe se dĂ©roulent gĂ©nĂ©ralement de la mĂȘme maniĂšre : le dĂ©veloppeur backend s'assoit Ă  mes cĂŽtĂ©s et fait des actions magiques pour installer et dĂ©ployer l'application. Docker est indispensable pour les dĂ©veloppeurs frontend, car le backend est souvent Ă©crit dans une large gamme de stacks PHP/Java/Python/C# et le frontend n'a pas besoin de dĂ©ranger le backend Ă  chaque fois pour tout installer et dĂ©ployer. Je n'ai vu qu'Ă  un seul endroit la combinaison Docker-Jenkins avec un dĂ©ploiement transparent, des journaux, et des tests automatisĂ©s intĂ©grĂ©s.

Il y a beaucoup d'articles détaillés sur Docker. Dans cet article, nous allons parler du déploiement d'une application monopage utilisant VueJS/Vue Router, avec une partie serveur sous forme d'API RESTful et MongoDB comme base de données. Pour décrire et lancer plusieurs applications-conteneurs, nous utilisons Docker Compose.

Pourquoi a-t-on besoin de Docker

Docker permet d'automatiser le processus de dĂ©ploiement d'applications. Les dĂ©veloppeurs n'ont plus besoin d'installer eux-mĂȘmes les programmes et de lutter contre des incompatibilitĂ©s de versions sur leur machine. Il suffit d'installer Docker et d'entrer 1-2 commandes dans le terminal. C'est plus pratique de le faire sur Linux.

Introduction

Nous installons Docker and Docker compose

Structure des dossiers

Nous crĂ©ons 2 dossiers pour les applications client et serveur. Le fichier avec l'extension .yml est la configuration Docker Compose, oĂč les conteneurs de l'application sont dĂ©finis et liĂ©s.
Docker-compose.yml :

version: "3"
services:
  mongo:
    container_name: mongo
    hostname: mongo
    image: mongo
    ports:
      - "27017:27017"
  server:
    build: server/
    #command: node ./server.js #ici vous pouvez écraser CMD dans Dockerfile dans /server
    ports:
      - "3000:3000"
    links:
      - mongo
  client:
    build: client/
    #command: http-server ./dist #ici vous pouvez écraser CMD dans Dockerfile dans /client
    network_mode: host
    ports:
      - "8089:8089"
    depends_on:
      - server

Nous crĂ©ons 3 services dans Docker : pour NodeJS, MongoDB et pour les fichiers statiques sur Vue. Pour relier le client au serveur, nous avons ajoutĂ© depends on server. Pour lier MongoDB Ă  l'API serveur, nous utilisons links mongo. Serveur, client, mongo — ce sont les noms des services.

Client sur VueJS

Dans le dossier /client l'application est basée sur VueJS. L'application a été créée avec Vue Cli. Lors de la création de l'image, l'application client est transformée en un ensemble de fichiers statiques dans le dossier /dist. Dans le Dockerfile, un ensemble de commandes pour construire l'image est décrit :

FROM node:10
WORKDIR /client
COPY ./package*.json ./
RUN npm install
RUN npm install -g http-server
COPY . .
RUN npm run build
EXPOSE 8081
CMD ["npm", "test:dev"]

Notez que le package.json est copié et installé séparément des autres fichiers du projet. Cela est fait pour des raisons de performance, afin que le contenu du dossier /node_modules soit mis en cache lors de la reconstruction. Chaque ligne de commande est mise en cache séparément.

À la fin, lors du dĂ©marrage du conteneur, la commande est exĂ©cutĂ©e npm run dev. Cette commande est dĂ©crite dans package.json :


"scripts": {
	 "test:dev": "http-server dist -p 8081 -c 1 --push-state"
}

Pour exĂ©cuter les fichiers du dossier /dist, http-server est installĂ© globalement , et dans les dev-dependencies, le packagespa-http-server , afin que Vue Router fonctionne correctement. L'option —push-state redirige vers index.html. L'option -c avec une valeur de 1 seconde a Ă©tĂ© ajoutĂ©e pourne pas mettre en cache les scripts. C'est un exemple de test, pour un projet rĂ©el, il est prĂ©fĂ©rable d'utiliser nginx. , et dans les dev-dependencies, le package Dans le store Vuex, nous crĂ©ons le champ

apiHost: 'http://localhost:3000' , oĂč le port de l'API NodeJS est spĂ©cifiĂ©. La partie client est prĂȘte. Maintenant, toutes les requĂȘtes du client vers le backend se font Ă  cette URL.NodeJS server API

nous créons

Dans le dossier /server et le Dockerfile : server.js FROM node:10 WORKDIR /server COPY ./package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node", "server.js"]


pour la base de données

Dans server.js qui sont spĂ©cifiĂ©s url const url = 'mongodb://mongo:27017/'; . Nous autorisons les requĂȘtes cross-domain depuis le client :const clientUrl = 'http://localhost:8081'; const corsOptions = { origin: clientUrl, optionsSuccessStatus: 200, // certains anciens navigateurs (IE11, divers SmartTVs) ont des problĂšmes avec 204 }; app.use(cors()); app.all('/*', (req, res, next) => { res.header('Access-Control-Allow-Origin', clientUrl); res.header('Access-Control-Allow-Headers', 'X-Requested-With'); next(); }); app.get('/getProducts', cors(corsOptions), (req, res) => { products.getContent .then(data => res.json(data), err => res.json(err)); }); app.get('/getUsers', cors(corsOptions), (req, res) => { db.getUsers() .then(data => res.json(data), err => res.json(err)); });


Maintenant, allons dans le répertoire du projet et exécutons

Conclusion

docker-compose build pour construire les images et pour démarrer les conteneurs. La commande élÚvera 3 conteneurs : docker-compose up server, client, mongo . Pour le serveur NodeJS, vous pouvez configurer le hot-reload en le reliant au dossier user. Et le client en développement sera exécuté localement avec hot reload, en lançant séparément. Pour démarrer un service séparé, il suffit d'indiquer son nom serveur et mongodocker-compose up client . N'oubliez pas de faire occasionnellementprune et de supprimer les conteneurs, réseaux et images pour libérer des ressources. Vous pouvez voir le code complet

. Le projet est encore en cours de dĂ©veloppement. iciđŸ„‡Comment empaqueter une application VueJS + NodeJS + MongoDB dans Docker | ProHoster

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster