Maison >interface Web >js tutoriel >Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

零到壹度
零到壹度original
2018-04-13 16:56:022530parcourir


Le contenu de cet article est d'utiliser Alibaba Cloud + docker pour implémenter un service node.js simple. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Récapitulatif des prérequis


Je suis entré en contact avec docker lors de mon stage, et ma compréhension de celui-ci était vague à l'époque. Maintenant, je suis de retour à l'école pour faire mon projet de fin d'études, et il se trouve que personne n'écrit sur les serveurs, alors j'ai examiné un peu nodejs, acheté un Alibaba Cloud, joué avec Docker et construit un serveur simple.

L'effet final

fournit principalement un serveur HTTP, accessible directement via IP, en fournissant deux exemples :
http://120.77.148.92/point_info
http://120.77.148.92/img/mice.png


Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

Principales étapes

1. Configurer Alibaba Cloud (je choisis ce point moi-même, je ne le décrirai pas en détail)
2. Code du service Nodejs
3 Copiez le code sur le serveur
4. créer une image et créer un service

code de service nodejs

1 Le serveur express principal est fourni
2 La base de données utilise sqlite
3. -multiparty

Les répertoires principaux sont les suivants :
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple
Le fichier principal est uniquement server.js, le code est ci-dessous :

var express = require('express');
var fs = require("fs");
var sqlite3 = require('sqlite3');
var multiparty = require('connect-multiparty');
var app = express();

app.use(express.static('public'));
app.use(multiparty({uploadDir: './public/img'}));

app.get('/', function (req, res) {
    res.send('Hello World');
});

app.get('/device', function (req, res) {
    var db = new sqlite3.Database("server.db");
    db.all("SELECT * FROM device", function (err, row) {
        res.send(row);
        db.close();
    });
});

app.get('/device_data', function (req, res) {
    var db = new sqlite3.Database("server.db");
    db.all("SELECT * FROM device_data", function (err, row) {
        res.send(row);
        db.close();
    });
});

app.get('/point_info', function (req, res) {
    var db = new sqlite3.Database("server.db");
    db.all("SELECT * FROM point_info", function (err, row) {
        res.send(row);
        db.close();
    });
});var multipartMiddleware = multiparty();
app.post('/info_post', multipartMiddleware, function (req, res) {
    console.log(req.body, req.files);    
    var body = req.body;    
    var name = body.upload_name;    
    var type = body.upload_type;    
    var longitude = body.longitude;    
    var latitude = body.latitude;    
    var address = body.upload_address;    
    var time = body.upload_time;    
    var description = body.upload_description;    
    var status = body.approval_status;    
    var fileName = req.files.file.path.substring(11);    
    var resource = "http://" + req.headers.host + "/img/" + fileName;
    
    console.log(resource);    var db = new sqlite3.Database("server.db");    var add = db.prepare("INSERT OR REPLACE INTO point_info " +        "(ID,upload_name, upload_type,longitude,latitude,upload_address,upload_time,upload_description," +        "approval_status,upload_resource) VALUES (?,?,?,?,?,?,?,?,?,?)");
    add.run(null, name, type, longitude, latitude, address, time, description, status, resource);
    add.finalize();
    db.close();


    res.end(JSON.stringify("success"));
});

app.get('/change_status', function (req, res) {
    console.log(req.query);    
    var query = req.query;    
    var id = query.id;    
    var status = query.status;    
    var db = new sqlite3.Database("server.db");    
    var modify = db.prepare("UPDATE point_info set approval_status=? where id =?");
    
    modify.run(status, id);
    res.send("success");
    modify.finalize();
    db.close();
});var server = app.listen(80, function () {
    var host = server.address().address;    
    var port = server.address().port;

    console.log("应用实例,访问地址为 http://%s:%s", host, port);    
    var db = new sqlite3.Database("server.db");

    setInterval(function () {
        console.log("change device_data");        
        for (var i = 0; i < 30; i++) {      
              const modify = db.prepare("UPDATE device_data " +                
                   "set rain_time = ?," +                
                   "rain_fall = ?," +                
                   "rain_level = ?," +                
                   "water_speed = ?," +                
                   "water_level = ?," +                
                   "wind_speed = ?," +                
                   "gas_warn = ?," +                
                   "general_level = ? " +                
                   "where id = ? ");

            modify.run(Math.random() * 10,Math.random() * 10,Math.random() * 10,Math.random() * 10,                
            Math.random() * 10,Math.random() * 10,Math.random() * 10,Math.random() * 10,i);

            modify.finalize();
        }
    },3000)

});

Copiez le code au serveur

L'auteur utilise xshell pour simuler le terminal, directement via l'interface graphique Fonctionnement, la capture d'écran est la suivante :
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

Créer image et service de construction via dockefile

Le contenu de dockerfile est le suivant :

FROM node
COPY ./project /home
WORKDIR /home/FloodServer
EXPOSE 80CMD npm install

Signification Comme suit :

Nœud FROM : ce fichier image hérite du image officielle du nœud.
COPIER ./project /home : copiez tous les fichiers du dossier du projet dans le répertoire actuel (à l'exception des chemins exclus par .dockerignore) dans le répertoire /home du fichier image.
WORKDIR /home/FloodServer : Spécifiez le chemin de travail suivant comme /home/FloodServer.
EXPOSE 80 : exposez le port 80 du conteneur et autorisez les connexions externes à ce port.
CMD npm install : exécutez npm install pour installer les dépendances après le démarrage du conteneur.

À l'heure actuelle, il existe des fichiers dockerfile et le code du service nodejs écrits auparavant dans le répertoire courant.
Après avoir écrit le fichier docker, exécutez le code suivant pour construire l'image :

docker image -t build my_node

Le paramètre -t est utilisé pour spécifier le nom du fichier image, et les deux-points peuvent être utilisés ultérieurement pour spécifier l'étiquette.
Une fois la construction terminée, nous pouvons utiliser la commande docker image ls pour afficher l'image.
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

L'image est construite et le conteneur est créé directement via l'image. Les instructions sont les suivantes :

docker run -p 80:80 -it my_node /bin/bash

La signification de chaque paramètre est la suivante :

-p Paramètres : Le port 80 du conteneur est mappé au port 80 de la machine locale.
Paramètre -it : le Shell du conteneur est mappé au Shell actuel, puis les commandes que vous entrez dans la fenêtre locale seront transmises au conteneur.
my_node : le nom du fichier image (s'il y a une balise, vous devez également fournir la balise, la valeur par défaut est la dernière balise).
/bin/bash : la première commande exécutée en interne après le démarrage du conteneur. Ici, nous démarrons Bash pour garantir que les utilisateurs peuvent utiliser le Shell.

Après avoir construit le conteneur, le Shell du conteneur est mappé au Shell actuel, et le service est exécuté directement via le nœud server.js, et le service est construit avec succès.
Utiliser Alibaba Cloud + Docker pour implémenter un service node.js simple

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn