nodejs操作mongodb

前一篇博文说明了如何在win7下安装mongodb,下面简要测试一下nodejs操作mongodb:

首先安装nodejs mongodb

npm  install mongodb
var  mongodb = require('mongodb');
var  server  = new mongodb.Server('localhost', 27017, {auto_reconnect:true});
var  db = new mongodb.Db('mydb', server, {safe:true});

//连接db
db.open(function(err, db){
    if(!err){
        console.log('connect db');
        // 连接Collection(可以认为是mysql的table)
        // 第1种连接方式
        // db.collection('mycoll',{safe:true}, function(err, collection){
        //     if(err){
        //         console.log(err);
        //     }
        // });
        // 第2种连接方式
        db.createCollection('mycoll', {safe:true}, function(err, collection){
            if(err){
                console.log(err);
            }else{
                //新增数据
                // var tmp1 = {id:'1',title:'hello',number:1};
       //          collection.insert(tmp1,{safe:true},function(err, result){
       //              console.log(result);
       //          }); 
                   //更新数据
                   // collection.update({title:'hello'}, {$set:{number:3}}, {safe:true}, function(err, result){
                   //     console.log(result);
                   // });
                   // 删除数据
                       // collection.remove({title:'hello'},{safe:true},function(err,result){
        //                   console.log(result);
        //               });

                // console.log(collection);
                // 查询数据
                var tmp1 = {title:'hello'};
                   var tmp2 = {title:'world'};
                   collection.insert([tmp1,tmp2],{safe:true},function(err,result){
                   console.log(result);
                   }); 
                   collection.find().toArray(function(err,docs){
                   console.log('find');
                   console.log(docs);
                   }); 
                   collection.findOne(function(err,doc){
                    console.log('findOne');
                      console.log(doc);
                   }); 
            }

        });
        // console.log('delete ...');
        // //删除Collection
        // db.dropCollection('mycoll',{safe:true},function(err,result){

  //           if(err){

        //         console.log('err:');
        //         console.log(err);
        //     }else{
        //         console.log('ok:');
        //         console.log(result);
        //     }
  //       }); 
    }else{
        console.log(err);
    }
});

ubuntu下安裝nodejs最省心的方法

ubuntu的方法很多,apt里面非常旧里,还是4.x的;

源码解压编译其实并不省心,

我是这么安装

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

如果安装nodejs 9.x版本

curl -sL https://deb.nodesource.com/setup_9.x | sudo -E bash -
sudo apt-get install -y nodejs

1感觉这种方法还是非常ok的r;

首先需要下载WebStrom的Linux安装包,地址如下:

https://www.jetbrains.com/webstorm/download/
然后运行如下命令解压并安装并运行WebStorm:

1、解压缩

sudo tar xfz ~/Downloads/WebStorm-16.2.3.tar.gz

2、解压文件移动到/opt下

sudo mv ~/Downloads/WebStorm-162.2228.20 /opt/

3、进入到此文件夹中:

cd /opt/WebStorm-162.2228.20/bin/

4、启动webstorm:

sudo sh webstorm.sh

参考

注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址:

http://idea.codebeta.cn

Ubuntu下安装nodejs,npm

前提

GCC 4.2 以上、G++ 4.2 以上、python2.7环境、wget 工具、make 工具

安装以上环境

sudo apt-get install python gcc g++ wget make

在官网找到符合自己系统的源文件(source code), 官网地址:https://nodejs.org/en/download/ 。

1、使用wget工具下载

wget https://nodejs.org/dist/v8.9.1/node-v8.9.1.tar.gz

2、解压

tar -zxvf node-v8.9.1.tar.gz //注意下载.tar.gz

3、进入解压文件,运行configure文件配置源代码

sudo ./configure

4、使用make install 编译安装nodejs

sudo make install

5、编译源文件需要一段时间,编译结束后,检查nodejs的版本号

node -v

如果能显示版本号,表明安装成功。

nodejs安装的同时也安装了npm,检测npm版本号。

npm安装的不一定是最新版本。

npm -v // 检测版本号。

sudo npm install -g npm   //安装最新版本npm

卸载node:(通过源文件编译安装的node)

进入安装时的源文件 cd 源文件

如果源文件不存在,下载一份,解压,进入源文件

sudo make uninstall           //使用 make 卸载

进入/usr/local/lib/ 删除node_modules目录

在命令行输入 node -v 系统提示安装node

如果没有进入/usr/local/lib删除node_modules目录,执行 node -v 时,系统提示在/usr/local/bin中无执行文件

— END

ubuntu安装nodejs并升级到最新版本

ubuntu版本信息如下:

Linux muir 4.13.0-16-generic #19-Ubuntu SMP Wed Oct 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

nodejs最新版本为:8.8.1

一、安装之前首先update

sudo apt-get update
sudo apt-get upgrade

二、安装nodejs

sudo apt-get install nodejs-dev
sudo apt-get install npm

三、查看版本

node -v
npm -v

可以看到版本是6.xxx.xx

四、升级node版本

sudo npm cache clean -f
sudo npm install -g n
sudo n stable

未分类

再看版本号:

未分类

阿里云ubuntu 最新文档版nodejs 的安装

1、安装使用node

19-30,mins 讲解linux下的安装和搭建测试代码

不要忘记配置阿里云3000端口!!!

1.1 linux 安装node.js

`ubuntu 的安装node`
linux ubuntu 安装node
Ubuntu apt-get命令安装

命令格式如下:
sudo apt-get install nodejs
sudo apt-get install npm

ubuntu 测试nodejs
nodejs -v
显示4.* ++ 的版本

升级nodejs 到最新版本

如果node不是最新的,node有一个模块叫n,是专门用来管理node.js的版本的。使用npm(NPM是随同nodejs一起安装的包管理工具)安装n模块

$ sudo npm install -g n  

然后,升级node.js到最新稳定版

$ sudo n stable  

旧版本的 npm,也可以很容易地通过 npm 命令来升级,命令如下:

$ sudo npm install npm -g

使用n模块安装的最新node

已经配置好环境变量

node 和 npm

测试nodejs

node -v

8.7.* 版本

Docker配置NodeJS+MongoDB

未分类

需求

在Docker中运行一个Nodejs项目,连接Mongo数据库进行数据操作,并启动RockMongo容器。

思路

  • 使用容器连接(link)方法,Mongo容器与WebApp容器连接
  • 数据库连接语句要通过容器别名构建!!!
  • 宿主机只需监听Web端口即可
  • Rockmongo用于图形化界面管理数据库

前期准备

服务器上已有nodejs环境并可运行,根目录在/usr/local/node
项目中的数据库连接语句改成数据库容器别名,实例化Mongo容器时–name casebasedb,mongoose连接语句改为

var store = new SessionStore({url: 'mongodb://containerdb/session',interval: 1440});
mongoose.connect('mongodb://containerdb:27017/casebasedb', {useMongoClient: true,});

拉取镜像

$ sudo docker pull node
$ sudo docker pull mongo
$ sudo docker pull pataquets/rockmongo

构建Web镜像

编写Dockerfile

$ vim /***/Dockerfile

Dockerfile内容

FROM node:latest # 基于node镜像
COPY . /***/casebase # 项目源文件目录
COPY . /usr/local/node # 直接拖进去的node环境
WORKDIR /***/casebase # nodejs运行目录
RUN npm install # 重新安装下依赖包
EXPOSE 8001 # 暴露端口8001
CMD ["node", "app.js"] # 执行命令

根据Dockerfile新建镜像,命令结尾的 . 是指示Dockerfile文件在当前目录下

$ sudo docker build -t hugh/casebase .

实例化容器

  • -p映射到当前8001端口;
  • –link语句连接数据库 [数据库容器名]:[容器别名]
  • 当连接成功后在web容器中可以直接ping到[容器别名containerdb]作为主机标识,所以一定要将数据库连接语句中的主机改成[容器别名]!!!
$ sudo docker run -d --name casebasedb mongo
$ sudo docker run --name casebaseapp -d -p 8001:8001 --link casebasedb:containerdb hugh/casebase 
$ sudo docker run --name rockapp -d -p 8003:80 --link casebasedb:containerdb pataquets/rockmongo

验证容器

查看容器情况

$ sudo docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                    NAMES
4e2ab928a683        dh/casebase:17.09.16.1   "node app.js"            14 minutes ago      Up 14 minutes       0.0.0.0:8001->8001/tcp   casebaseapp
66e6ba5f5873        mongo                    "docker-entrypoint..."   17 minutes ago      Up 17 minutes       27017/tcp                casebasedb

查看端口监听情况

$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::8001                 :::*                    LISTEN      32211/docker-proxy

访问宿主机ip:8001,此时已可以访问web项目了。

使用Docker来部署NodeJs应用

Docker的环境无关性以及自动化特性实在是令人称赞,最近遇到的一个问题是,NodeJs使用8.x版本开发,但是线上服务器是7.x的,这时候又不能动线上的应用。

于是想到了使用Docker来部署NodeJs,服务器是Ubuntu的。

安装Docker

apt install docker.io

Dockerfile编写

由于默认的dockhub速度非常慢导致下载镜像慢,而且镜像下来的Ubuntu apt源又是国外的,简直是慢上加慢,本文使用daocloud.io的Ubuntu镜像以及阿里云的Ubuntu源

FROM daocloud.io/library/ubuntu
MAINTAINER xialeistudio<[email protected]>
ENV PATH $PATH:/opt/node/bin
ENV PORT 80
ENV HOST 0.0.0.0
# prepare
ADD sources.list /etc/apt/sources.list
RUN apt update
RUN apt install wget gcc python git -y
# nodejs
RUN wget https://npm.taobao.org/mirrors/node/latest-v8.x/node-v8.6.0-linux-x64.tar.gz
RUN tar xf node-v8.6.0-linux-x64.tar.gz
RUN mv node-v8.6.0-linux-x64 /opt/node
# app
RUN mkdir app
ADD . /root/app
WORKDIR /root/app
RUN /opt/node/bin/npm install --registry=https://registry.npm.taobao.org
# start app
ENTRYPOINT ["npm","start"]

指令解释一下

  1. 指定模板镜像

  2. 维护者信息,这是本人写的,所以署名为本人

  3. 环境变量定义

  4. 复制宿主机当前目录的sources.list到docker中的/etc/apt目录用来替换默认的Ubuntu源

  5. 更新apt并安装必要软件

  6. 从淘宝镜像站下载nodejs二进制版本

  7. 解压并移动到/opt/node目录

  8. 创建应用目录,并把宿主机当前文件夹下的所有文件拷贝到docker景象中

  9. 使用淘宝镜像安装npm包

  10. 启动APP

build镜像

docker build -t demo .

运行完毕后就可以使用docker images查看镜像了

启动容器

docker run -d -p 127.0.0.1:7001:80 demo

这时候容器已经启动,并通过端口转发监听在宿主机的7001端口上,配合nginx做反向代理就可以部署一个公网应用了。

不管你容器中部署何种版本的NodeJs都不会对宿主机造成影响,这点很重要。

Ubuntu 16.04系统下安装nodejs的两种方法

本文将会通过两种方法来讲述如何在Ubuntu 16.4 LTS Linux系统下安装node.js。
Node.js是一种运行在服务器端的JavaScript运行环境。

方法1: 通过apt-get 命令来安装Ubuntu 发行方repo里的版本

执行下面的apt-get 命令:

$ sudo apt-get install nodejs npm

命令输出如下:

root@ubuntutest:~# apt-get install nodejs npm
 正在读取软件包列表... 完成
 正在分析软件包的依赖关系树
 正在读取状态信息... 完成
 将会同时安装下列软件:
 ......
 建议安装:
 ......

下列【新】软件包将被安装:
 ......
 下列软件包将被升级:
 libc6 libssl1.0.0 zlib1g
 升级了 3 个软件包,新安装了 104 个软件包,要卸载 0 个软件包,有 123 个软件包未被升级。
 需要下载 54.6 MB 的归档。
 解压缩后会消耗 201 MB 的额外空间。
 您希望继续执行吗? [Y/n]Y

查看Node.js 版本

执行下面的命令:

$ nodejs --version
v4.2.6

方法2: 安装最新版本的Node.js 6.x (稳定版本)或 7.x

首先要安装Node.js 6.x 的repo,执行下面的命令:

$ curl -sL https://deb.nodesource.com/setup_t.x | sudo -E bash -

安装node.js 6.x 版本,执行命令:

$ sudo apt-get install nodejs build-essential

安装node.js 7.x 最新版本,执行下面的命令:

$ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
$ sudo apt-get install -y nodejs build-essential

更多关于node.js 的信息可以查看其官方网站 https://nodejs.org/en/

Docker部署基于Nodejs的Web应用

Docker

docker是一个开源的应用容器引擎,可以为我们提供安全、可移植、可重复的自动化部署的方式。docker采用虚拟化的技术来虚拟化出应用程序的运行环境。此种方式具有以下优势:

  • 每个部署的应用程序都是一个容器,彼此隔离,互不影响;

  • 服务器只需要安装docker即可运行构建好的应用程序镜像,不会涉及复杂的服务器环境配置,因为配置都在特定的应用程序所在的镜像中去配置即可;

  • 简化了自动化部署和运维的繁琐流程,只需将构建好的镜像load到服务器的docker中即可运行我们的应用程序;

  • 可以充分利用服务器的系统资源,一台服务器上可以同时运行多个容器;

未分类

docker采用的是c/s架构,Client通过接口与Server进程通信实现容器的构建,运行和发布。docker比较重要的三个核心概念如下:

  • 镜像(images):一个只读的模板,可以理解为应用程序的运行环境,包含了程序运行所依赖的环境和基本配置,镜像可以按照层级(从基础镜像开始)来构建,每一层包含特定的环境。

  • 仓库(repository):一个用于存放镜像文件的仓库,如果你对git的仓库熟悉,应该很容易理解,对,就是那个。有私有仓库和公有仓库之分。

  • 容器(container):一个运行应用程序的虚拟容器,在我们运行镜像时产生。容器包含自己的文件系统+隔离的进程空间和包含其中的进程。

前言

sharplook是一款通过大数据分析来解决客户在监控系统中存在的数据采集难、解析难、处理难的IT运维产品。在给客户部署产品的过程中涉及到比较多的环境配置和组件安装以及复杂的依赖项,这些繁琐的流程降低了安装部署的效率和产品质量。基于此,我们开发了一款可以快速便捷的安装部署套件,提供一种漂亮的安装部署流程。产品采用 Nuxt + Koa 的基础架构进行开发,其中采用nuxt来提供SSR(服务端渲染)功能,Nuxt.js是基于Vue.js的通用架构,其中集成了以下组件:

  • Vue2 (https://github.com/vuejs/vue)

  • Vue-Router (https://github.com/vuejs/vue-router)

  • Vuex (https://github.com/vuejs/vuex)

  • Vue-Meta (https://github.com/declandewet/vue-meta)

另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 来处理代码的自动化构建工作(如打包、代码分层、压缩等等)。

我们项目使用Nuxt.js作为中间件来进行UI渲染,使用Koa启动我们自己的服务器,koa2 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。

关于如何快速搭建这样一个项目,小生之前在《vue-cli “从入门到放弃”》中介绍过vue-cli的使用,这个项目我们通过vue-cli工具,使用 nuxt-community/koa-template 模板,vue init nuxt-community/koa-template快速构建出来。具体的代码逻辑,在此不做赘述。

关于为什么选择docker来部署我们的node服务,前面已经介绍了,我们基于node的web应用涉及到的部署环境并不复杂,仅仅需要Node.js作为平台即可,由于依赖的包文件太多,而且比较大,业界还没有特别好用的开源node打包工具。做前端的同学都知道,webpack是一个功能强大的资源加载构建的打包工具,只需要将项目文件打包到一个dist文件下,打包后的文件体量小,解决了文件之间的依赖问题,提取出公共代码库,生产环境只需要部署dist文件夹即可。然而,Nodejs程序涉及到的依赖包,和资源却没法进行打包,node服务开启后仅仅是一个node进程而已。那么我们如何部署node程序呢?既然没法打包,只能将其全部文件进行部署(虽然可能存在别的问题,小生也在研究中,大神可以给点建议),于是小生就希望将其放入docker中去部署,免去生产环境node版本不一致等问题。下面小生就将如何用docker来部署Node项目的过程分享给诸位。

实战

以下将进入战备状态,请同志们准备好大脑和电脑,跟着我左手、右手一个慢动作。

环境准备

  • 安装docker,未安装的同学,请根据自己的开发环境采用不同的安装方式去安装,具体操作参考教程,不做赘述。

  • 安装成功后,可以通过docker -v查看版本号(尽量使用最新的稳定版本)。

项目准备

  • 在你的项目根目录下,添加Dockerfile文件,此文件用来配置我们自定义一个镜像所需要指定的依赖项、环境以及执行的命令等。内容格式如下:
# 指定我们的基础镜像是node,版本是v8.0.0
 FROM node:8.0.0
 # 指定制作我们的镜像的联系人信息(镜像创建者)
 MAINTAINER EOI

 # 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的app文件夹下
 ADD . /app/
 # cd到app文件夹下
 WORKDIR /app

 # 安装项目依赖包
 RUN npm install
 RUN npm rebuild node-sass --force

 # 配置环境变量
 ENV HOST 0.0.0.0
 ENV PORT 8000

 # 容器对外暴露的端口号
 EXPOSE 8000

 # 容器启动时执行的命令,类似npm run start
 CMD ["npm", "start"]

关于Dockerfile文件中的关键字,解释如下:

  • FROM
    语法:FROM [:]
    解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。

  • MAINTAINER
    语法:MAINTAINER
    解释:MAINTAINER指令允许你给将要制作的镜像设置作者信息。

  • ADD
    语法:ADD
    解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,是目标容器的一个绝对路径。

  • WORKDIR
    语法:WORKDIR /path/to/workdir
    解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。

  • RUN
    语法:① RUN #将会调用/bin/sh -c
    ② RUN [“executable”, “param1”, “param2”] #将会调用exec执行,以避免有些时候shell方式执行时的传递参数问题,而且有些基础镜像可能不包含/bin/sh
    解释:RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样。

  • ENV
    语法:ENV
    解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env =参数来修改。
    注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

  • EXPOSE
    语法:EXPOSE [ …]
    解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息。

  • CMD
    语法: ① CMD [“executable”, “param1”, “param2”] #将会调用exec执行,首选方式
    ② CMD [“param1”, “param2”] #当使用ENTRYPOINT指令时,为该指令传递默认参数
    ③ CMD [ | ] #将会调用/bin/sh -c执行
    解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
    注意:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。

其中还有其他的一些关键字:USER、ENTRYPOINT、VOLUME、ONBUILD等,如果你有兴趣可以自行研究。

在项目根目录下添加.dockerignore文件,此文件的作用类似.gitignore文件,可以忽略掉添加进镜像中的文件,写法、格式和.gitignore一样,一行代表一个忽略。本项目添加的忽略如下:

  .DS_Store
  npm-debug.log*
  selenium-debug.log
  .nuxt/
  /package-lock.json
  *.tar
  *.md

  # Editor directories and files
  .idea
  *.suo
  *.ntvs*
  *.njsproj
  *.sln

构建镜像

  • 查看目前本地docker的镜像
> docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

cd 到项目根目录下,执行以下命令

> docker build -t deploy:1.0 .

    Sending build context to Docker daemon  1.436GB
  .... 此处省略1000个字符。
  Successfully built d8f0875e967b
  Successfully tagged deploy:1.0

deploy是镜像名,1.0是镜像的版本号,到此你已经成功构建了一个新的镜像,你可以通过docker images,查看你的镜像。

> docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 deploy              1.0                 d8f0875e967b        3 minutes ago        2.11GB

启动镜像,测试是否成功。

> docker run -d -p 9000:8000 deploy:1.0
8aec5ee037bb253901d2c2e02c7be546580546c493576139f3789fb660f3401d

> docker ps -a
CONTAINER ID    IMAGE        COMMAND          CREATED           STATUS         PORTS                  NAMES
8aec5ee037bb    deploy:1.0   "npm start"     57 seconds ago    Up 56 seconds  0.0.0.0:9000->8000/tcp amazing_bassi

docker run -d -p 9000:8000 deploy:1.0中-d表示后台运行,-p 9000:8000表示指定本地的9000端口隐射到容器内的8000端口。 deploy:1.0为我们要运行的镜像。通过docker ps -a查看docker的进程(容器的运行本身就是一种特殊的进程)运行情况,发现我们的容器已经在运行。本地可以访问localhost:9000。

通过docker logs可以查看我们容器内应用进程的运行日志。docker logs

> docker logs 8aec5ee037bb
  npm info it worked if it ends with ok
  npm info using [email protected]
  npm info using [email protected]
  npm info lifecycle [email protected]~prestart: [email protected]
  npm info lifecycle [email protected]~start: [email protected]

  > [email protected] start /app
  > node ./server/index.js

  Server listening on 0.0.0.0:8000
   DONE  Compiled successfully in 9310ms06:55:56

  > Open http://0.0.0.0:8000
docker stop <CONTAINER ID>可以停止容器运行

 docker start <CONTAINER ID>可以启动容器运行

 docker restart <CONTAINER ID>可以重启容器

 docker rm <CONTAINER ID> -f可以强制删除在运行的容器

上传镜像(这里用上传到公共仓库来演示)

没注册DockerHub的同学,请注册DockerHub

登录docker

> docker login
Username: XXX
Password: XXX
Login Succeeded

docker tag /上传之前必须给镜像打上tag,namespace可以指定为你的docker Id

> docker tag deploy:1.0 lzqs/deploy:1.0

docker push /将镜像上传至docker的公共仓库

> docker push lzqs/deploy:1.0

上传成功后,docker logout 退出,登录 https://hub.docker.com/ 查看上传的镜像。

下载镜像

通过docker pull /下载我们的镜像。

> docker pull lzqs/deploy:1.0

生产部署

前面说了,我们可以将上传到仓库的镜像下载下来部署,但是如果镜像比较大或者部署环境压根无法联网,你是不是要跪了。所以我们采取另一种方法,将开发好的镜像直接打包保存到安装盘里面,到客户生产环境再将镜像包上传并加载到服务器的docker中即可。

在开发环境打包,docker save / .tar

> docker save lzqs/deploy:1.0 > deploy.tar

这里ls会发现目录下生成了deploy.tar的文件。部署时将此文件copy到生产环境服务器上。

确保生产服务器上已经安装了docker,若没装,请参考相关文档,若不装,对不起小生也无力了,然后在服务器上加载上传的镜像包deploy.tar。

> docker load < deploy.tar

  007ab444b234: Loading layer [==================================================>] 129.3 MB/129.3 MB
  4902b007e6a7: Loading layer [==================================================>] 45.45 MB/45.45 MB
  bb07d0c1008d: Loading layer [==================================================>] 126.8 MB/126.8 MB
  ecf5c2e2468e: Loading layer [==================================================>] 326.6 MB/326.6 MB
  7b3b4fef39c1: Loading layer [==================================================>] 352.3 kB/352.3 kB
  677f02386f07: Loading layer [==================================================>] 137.2 kB/137.2 kB
  7333bb4665b8: Loading layer [==================================================>] 55.66 MB/55.66 MB
  e292e64ffb88: Loading layer [==================================================>] 3.757 MB/3.757 MB
  ee76d0e6f6d9: Loading layer [==================================================>] 1.436 GB/1.436 GB
  33dca533c6e5: Loading layer [==================================================>] 331.8 kB/331.8 kB
  24630015679d: Loading layer [==================================================>] 35.18 MB/35.18 MB
  Loaded image: lzqs/deploy:1.0

加载成功后,docker images即可看到加载的镜像

> docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lzqs/deploy         1.0                 d8f0875e967b        About an hour ago   2.115 GB

运行lzqs/deploy镜像,成功后,在外部访问服务器的9000端口, <服务器的IP>:9000

> docker run -d -p 9000:8000 lzqs/deploy
1d0db9a5d0c8826171e501b0e86afd444fca8144b1105e63dae8d621bdda7a77

> docker ps -a
CONTAINER ID  IMAGE           COMMAND      CREATED              STATUS             PORTS                    NAMES
1d0db9a5d0c8  lzqs/deploy:1.0 "npm start"  About a minute ago   Up About a minute  0.0.0.0:9000->8000/tcp goofy_curran

docker exec -it /bin/bash 可以进入容器中执行,方便我们查看内部文件和调试

> docker exec -it 1d0db9a5d0c8 /bin/bash

root@1d0db9a5d0c8:/app#

战功,访问部署的docker应用,<服务器的IP>:9000,效果如下图:

未分类

使用Nodejs对Mongodb简单的增删改查

首先电脑上要装有Node、Mongodb

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/*创建数据库连接*/
var db = mongoose.createConnection('localhost','mytest');

/*创建Schema*/
var mySchema = new Schema({
    name : String,
    age : Number
});

/*创建Model*/
var dbModel = db.model('test1',mySchema);

/*需要插入的数据*/
var lisiData = {
    name : '李四',
    age : 28
};

/*首先实例化一个对象*/
var person = new dbModel(lisiData);

/*调用对象的save方法进行保存 方法接收一个回调函数
*回调函数第一个参数为错误信息,如果没有错误为空,第二个是成功返回的信息
*/
person.save(function(err,_d){
    console.log(_d);
})

控制台打印内容:

未分类

接下来我们可以看到数据库多了一条数据:

未分类

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/*创建数据库连接*/
var db = mongoose.createConnection('localhost','mytest');

/*创建Schema*/
var mySchema = new Schema({
    name : String,
    age : Number
});

/*创建Model*/
var dbModel = db.model('test1',mySchema);

/*查询name为李四的数据*/
dbModel.find({name:'李四'},function(err,_d){
    if(err){
        console.log(err);
    }else{
        console.log(_d);
    }
})

如果查询成功 会返回一个数组 如下图所示:

未分类

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/*创建数据库连接*/
var db = mongoose.createConnection('localhost','mytest');

/*创建Schema*/
var mySchema = new Schema({
    name : String,
    age : Number
});

/*创建Model*/
var dbModel = db.model('test1',mySchema);

/*查询name为李四的数据 并将其name字段值更新为王五*/
dbModel.update({name:'李四'},{name:'王五'},function(err,_d){
    if(err){
        console.log(err);
    }else{
        console.log(_d);
    }
})

如果更新成功 控制台显示如下图所示:

未分类

咱们再看一下数据库是不是确实更新了:

未分类

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/*创建数据库连接*/
var db = mongoose.createConnection('localhost','mytest');

/*创建Schema*/
var mySchema = new Schema({
    name : String,
    age : Number
});

/*创建Model*/
var dbModel = db.model('test1',mySchema);

/*删除name为王五的数据*/
dbModel.remove({name:'王五'},function(err,_d){
    if(err){
        console.log(err);
    }else{
        console.log(_d);
    }
})