Docker & NodeJs

Ici, nous allons plutôt nous pencher sur l'usage de Docker avec un projet NodeJs.

Un petit rappel de ce qu'est Docker: il s'agit d'un outils permettant de créer des container systèmes / applicatifs que nous pouvons composer. Le but étant de se créer son propre conteneur, que nous pouvons charger / décharger à notre guise, voir le déployer sur des postes qui aurait un Docker Container afin de réceptionner notre conteneur.

Le but ici va être de faire deux petits conteneurs Docker:
  • L'un pour lancer notre application
  • L'autre pour lancer nos tests et récupérer le rapport de tests

Les usages sont multiples, car nous pouvons à la fois nous en servir:
  • Lancer nos tests / notre application sur des versions différentes de NodeJs
  • Lancer nos tests / notre application sur des plateformes différentes
  • Lancer nos tests / notre application avec des bases de données différentes
  • Lancer nos tests / notre application sur un environnement que nous ne pourrions pas forcément avoir sur notre poste
  • Déclarer un container pour faciliter le déploiement
  • ...

Comme vous pouvez le voir, les usages sont multiples !

Installer Docker sur Ubuntu

Bon, il y a quelques étapes, mais ça ce passe plutôt bien. 

Cela commence par mettre à jour les sources / repositories APT. Pour cela:

> apt-get update
> apt-get install apt-transport-https ca-certificates
> sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D



Ensuite, éditer le fichier "/etc/apt/sources.list.d/docker.list" afin de mettre à l'intérieur:

deb https://apt.dockerproject.org/repo ubuntu-trusty main



Il faut installer des dépendances annexes:

> apt-get update
> sudo apt-get install linux-image-extra-$(uname -r)
> apt-get install apparmor
> sudo apt-get install linux-image-generic-lts-trusty
> sudo reboot



Et pour finir, tout simplement installer Docker et lancer le service associé:

> sudo apt-get install docker-engine
> sudo service docker start

Utiliser Docker avec NodeJs

Tout d'abord, nous allons nous créer un projet NodeJs très classique.

Il faut commencer par mettre à jour

Dans ce dernier, nous allons déclarer deux fichiers pour Docker:
  • Un fichier ".dockerignore" pour dire quels fichiers / répertoires ne doivent pas être copié lorsque nous voulons créer notre conteneur
    • Il ressemble un peu à notre fichier ".gitignore"
  • Un fichier "Dockerfile" qui lui décrit précisément ce que doit faire notre conteneur Docker


Pour lancer notre application

Tout d'abord, créeons dans le répertoire élibé notre fichier "index.js":



/** * Created by julienroche on 12/02/16. */
'use strict';

console.log('My NodeJs program has runned');


Comme vous pouvez le voir, plutôt simple. Je n'oublie par déclarer dans le "package.json" de lancer ce script lorsque nous tapons "npm start".

Maintenant regardons le contenu du fichier "Dockerfile":


# -------------------------------------------------------------------------------# Load
FROM node:4.3.0
# -------------------------------------------------------------------------------# Install the NodeJs App
# Install app dependenciesCOPY package.json /docker-nodejs/package.json
RUN cd /docker-nodejs; npm install

# Bundle app sourceCOPY ./lib /docker-nodejs/lib

# -------------------------------------------------------------------------------# Expose if needed some ports
#EXPOSE  8080
# -------------------------------------------------------------------------------# Run the application
WORKDIR /docker-nodejs
CMD ["npm", "start"]

Si nous décortiquons, nous avons:
  1. Un chargement d'un conteneurDocker. en l’occurrence ici, un conteneur Docker se basant sur Ubuntu et qui contient la version 4.3.0 de NodeJs
  2. Nous demandons de copier des fichiers dans le répertoire "docker-nodejs" du conteneur
  3. Nous faisons un "npm install" pour récupérer les dépendances
  4. Nous lançons la commande "npm start" pour lancer notre script

Avant toute chose, nous avons plusieurs étapes avant d'utiliser notre conteneur.
  1. Tout d'abord, s'assurer que le service Docker est lancé.
    • Pour cela taper "sudo service docker start"
  2. Ensuite il faut "compiler" notre conteneur
    • Taper alors "docker build -t jroche/docker-nodejs ."
      • Où "jroche/docker-nodejs" sera le nom de notre conteneur
      • "." représente le répertoire où contient le "Dockerfile"
Une fois cela fait, pour lancer l'image Docker:

docker run jroche/docker-nodejs


Et nous obtenons:


A noter néanmoins que si le script lancé un serveur sur le port 9000, nous ne pouvons pas y accéder en-dehors de l'instance du conteneur. Pour ce faire, il faut demander de l'exposer, et nous pouvons préciser sur quel port:

docker run -p 9000:9000 -d jroche/docker-nodejs

Facile non ?

Pour lancer des tests


Maintenant, nous allons déclarer des tests unitaires. Je ne vais pas décrire les tests à proprement parlé, mais plutôt ce que va faire la commande "npm test":

{
  "name": "docker-nodejs",
  "version": "1.0.0",
  "description": "A sample program to test docker with NodeJS program",
  "main": "./lib/index.js",
  "scripts": {
    "start": "node ./lib/index.js",
    "test": "node ./node_modules/mocha/bin/mocha --recursive --ui bdd --reporter mocha-junit-reporter --reporter-options mochaFile=./target/mocha-reporter-junit.xml --colors ./test"  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "chai": "3.5.0",
    "mocha": "2.4.5",
    "mocha-junit-reporter": "1.9.1",
    "sinon": "1.17.3"  }
}

Comme vous pouvez le voir, j'analyse le répertoire "test" et à la fin, je génère un rapport JUnit dans le répertoire target.

Du coup, notre Dockerfile va ressembler à ceci:

# -------------------------------------------------------------------------------# Load
FROM node:4.3.0
# -------------------------------------------------------------------------------# Install the NodeJs App
# Install app dependenciesCOPY package.json /docker-nodejs/package.json
RUN cd /docker-nodejs; npm install

# Bundle app sourceCOPY ./lib /docker-nodejs/lib
COPY ./test /docker-nodejs/test

# -------------------------------------------------------------------------------# Run the application
WORKDIR /docker-nodejs
CMD ["npm", "test"]


Une fois que nous aurons compilé notre conteneur, la question se pose: comment allons-nous récupérer notre rapport de test du conteneur Docker ?

en fait, c'est plutôt simple: il suffit de partager des répertoires / volumes entre votre système et le conteneur Docker. Pour cela, il faut bien le préciser (en absolue) lors de la commande:

docker run -v $(pwd)/target:/docker-nodejs/target jroche/docker-nodejs


Nous obtenons:




Et là, miracle, nous avons notre rapport !!






Commentaires

Posts les plus consultés de ce blog

ISO: liens & outils utiles

NodeJs et SSL: une petite analyse

Créer sa commande slack en quelques minutes