À propos de cette application de nœud
Cette application contient un package.json, server.js et un fichier .gitignore, qui sont assez simples pour être facilement terminés.
.gitignore
node_modules / *
package.json
{"name": "docker-dev", "version": "0.1.0", "Description": "docker dev", "dépendances": {"connect-redis": "~ 1.4.5", "express": "~ 3.3.3", "Hiredis": "~ 0.1.15", "redis": "~ 0.8.4"}}server.js
var express = require ('express'), app = express (), redis = required ('redis'), redisstore = required ('connect-redis') (express), server = required ('http'). createServer (app); app.configure (function () {app.use (express.cookieParser ("clavier-cat ')); app.use (express.sesshe Redisstore ({host: process.env.redis_host || 'localhost', port: process.env.redis_port || 6379, db: process.env.redis_db || 0}), cookie: {expires: false, maxage: 30 * 24 * 60 * * 1000}}));}); app.get ('/', fure res.json ({status: "ok"});}); var port = process.env.http_port || 3000; server.Listen (port); console.log («écoute sur le port» + port);Server.js tire toutes les dépendances et lance une application spécifique. Cette application spécifique est définie pour stocker les informations de session dans Redis et expose un point de terminaison de demande qui répondra à un message d'état JSON. C'est tout très standard.
Une chose à noter est que les informations de connexion pour Redis peuvent être réécrites à l'aide de variables d'environnement - cela jouera un rôle dans la migration ultérieure de l'environnement de développement Dev vers l'environnement de production Prod.
Fichier Docker
Pour les besoins de développement, nous aurons Redis et Node exécuter dans le même conteneur. Pour ce faire, nous utiliserons un DockerFile pour configurer ce conteneur.
Dockerfile
De Dockerfile / UbuntumAINTAINER ABHinav ajgaonkar <[email protected]> # Installer redisrun / apt-get -y -qq installer python redis-server # http://nodejs.org/dist/v0.10.28/node-v0.10.28-Linux-x64.tar.gz && / tar -xzf node-v0.10.28-linux-x64.tar.gz &&& / mv node-v0.10.28-linux-x64 Node && / cd / usr / local / bin & gyd / lin / lnin / Lnnn -s / opt / node / bin / *. && / rm -f /opt/node-v0.10.28-linux-x64.tar.gz# Définissez le répertoire de travail / srccmd ["/ bin / bash"]
Comprenons-le un par un,
De dockerfile / ubuntu
Cette fois, Docker est invité à utiliser l'image Dockerfile / Ubuntu fournie par Docker Inc. comme image de référence à construire.
COURIR /
apt-get -y -qq installer python redis-server
L'image de référence ne contient rien du tout - nous devons donc utiliser APT-get pour obtenir tout ce dont l'application doit exécuter. Cette phrase installera Python et Redis-Server. Le serveur Redis est nécessaire car nous y stockons les informations de session, et la nécessité de Python est qu'elle peut être intégrée à l'extension C requise par le module de nœud Redis via NPM.
Exécuter / cd / opt && / wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-Linux-x64.tar.gz && / tar -xzf node-v0.10.28-linux-x64.tar.gz && / Mv Node-V0.10.28-linux-x64.Tar.Tar.Gz & Mv / Mv Node-V0.10.28-Linux-Z64.TAR.TAR.GZ & MV & MV / MV-V0.10 MV Node-V0.10.28-linux-x64 Node && / cd / usr / local / bin && / ln -s / opt / node / bin / *. && / rm -f /opt/node-v0.10.28-linux-x64.tar.gz
Cela télécharge et extrait le binaire Nodejs 64 bits.
WorkDIR / SRC
Cette phrase indique à Docker qu'une fois le conteneur démarré, il doit faire CD / SRC une fois avant d'exécuter les choses spécifiées par la propriété CMT.
Cmd ["/ bin / bash"]
En dernière étape, exécutez / bac / bash.
Construire et exécuter des conteneurs
Maintenant que le fichier docker est écrit, créons une image Docker.
docker build -t sqldump / docker-dev: 0.1.
Une fois l'image construite, nous pouvons exécuter un conteneur en utilisant l'instruction suivante:
docker run -i -t --rm / -p 3000: 3000 / -v `pwd`: / src / sqldump / docker-dev: 0.1
Jetons un coup d'œil à ce qui se passe dans la commande Docker Run.
-Je commencerai le conteneur en mode interactif (par rapport à -D est en mode séparé). Cela signifie qu'une fois la session interactive terminée, le conteneur sortira.
-t attribuera un pseudo-tty.
--RM supprimera le conteneur et son système de fichiers à la sortie.
-P 3000: 3000 Traire le port 3000 sur l'hôte du port 3000 sur le conteneur.
-v `pwd`: / src
Cette phrase montera le répertoire de travail actuel vers / src dans le conteneur hôte (par exemple, notre fichier de projet). Nous accrochons le répertoire actuel en tant que volume au lieu d'utiliser la commande ADD dans le DockerFile, de sorte que toutes les modifications que nous apportons dans l'éditeur de texte peuvent être immédiatement vues dans le conteneur.
SQLDump / docker-dev: 0.1 est le nom et la version de l'image docker à exécuter. C'est la même chose que le nom et la version que nous avons utilisés pour construire l'image Docker.
Étant donné que le dockerfile spécifie CMD ["/ bin / bash"], dès le démarrage du conteneur, nous nous connecterons à un environnement de coquille bash. Si la commande docker run est exécutée avec succès, elle ressemblera à ce qui suit:
Développer le développement
Maintenant, le conteneur est en cours d'exécution, avant de commencer à écrire du code, nous devrons trier certaines choses standard et non liées au Docker. Tout d'abord, nous devons utiliser l'instruction suivante pour démarrer le serveur Redis dans le conteneur:
Service Redis-Server Start
Ensuite, installez les dépendances du projet et NODEMON. Nodemon observe les modifications du fichier du projet et redémarre le serveur dans le temps.
npm installnpm install -g nodemon
Enfin, démarrez le serveur avec la commande suivante:
Nodemon Server.js
Maintenant, si vous naviguez vers http: // localhost: 3000 Dans votre navigateur, vous devriez voir quelque chose comme ceci:
Ajoutons un autre point de terminaison comme Server.js pour simuler le processus de développement:
app.get ('/ hello /: name', function (req, res) {res.json ({hello: req.params.name});});Vous verrez que Nodemon a détecté les modifications que vous avez apportées et redémarré le serveur:
Et maintenant, si vous naviguez sur votre navigateur vers http: // localhost: 3000 / Hello / world, vous verrez la réponse suivante:
Environnement de production
Les conteneurs à l'état actuel sont loin d'être libérés en tant que produits. Les données de Redis ne seront plus persistantes lors du redémarrage entre les conteneurs. Par exemple, si vous redémarrez le conteneur, toutes les données de session seront anéanties. La même chose se produira lorsque vous détrurez le conteneur et ouvrez un nouveau conteneur, ce qui n'est évidemment pas ce que vous voulez. Je parlerai de ce problème dans le contenu productif de la deuxième partie.