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
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:
- 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
- Nous demandons de copier des fichiers dans le répertoire "docker-nodejs" du conteneur
- Nous faisons un "npm install" pour récupérer les dépendances
- Nous lançons la commande "npm start" pour lancer notre script
Avant toute chose, nous avons plusieurs étapes avant d'utiliser notre conteneur.
- Tout d'abord, s'assurer que le service Docker est lancé.
- Pour cela taper "sudo service docker start"
- 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
Enregistrer un commentaire