在Docker搭建Node.js+mongoDB开发环境

这周通过docker将整个技术栈更新一下,首先介绍Docker的基本概念。

Docker是在LXC上构建的容器引擎。我这里主要讲起当作更加灵巧的虚拟机用。Docker主要有如下4个概念,简单介绍一下。

  • 镜像:类似虚拟机快照,大多都是在现有工具镜像上创建新镜像。我今天使用的都是官方的镜像。

  • 容器:从镜像中创建应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。

  • 数据卷:完成数据持久化的功能,使得宿主系统和容器之间可以数据访问

  • 链接:引用其他容器,进行容器间通讯。


  1. 安装Docker

    使用 'sudo apt-get install docker.io' 命令安装 docker,然后通过 'docker version' 查看版本。这样docker就在本机上安装了。

  2. mongoDB容器

    通过 'docker search mongo' 搜索mongoDB镜像,我们可以看到有两个官方镜像。我们需要使用的是mongo,mongo-express是mongodb和node、bootstrap 3。

    通过 'docker pull mongo:latest' 获得最版本的mongoDB。执行过程如下图。

    通过执行 'docker run -v /my/own/datadir:/data/db --name mongo -d mongo mongod --smallfiles' 运行mongo容器。-v参数用来指明数据卷的位置,并以命名为/data/db。--name参数指明容器的名字,-d 表示以后台运行容器并返回容器ID。mongo mongod --smallfiles表示建立mongo镜像的容器并以smallfiles参数执行mongod。

    通过 'docker ps' 查看当前的运行的容器,比如下图中的mongo容器就是运行的mongo:latest的镜像。

    接下来介绍一些与容器操作相关的命令。使用 'docker ps -a' 查看所有的容器,我们可以通过CONTAINER ID或者NAMES的值来控制容器。比如 'docker rm NAMES' 删除容器或者 'docker restart NAMES' 来重启容器。

    当然这样运行容器,docker外部是无法访问到数据库的。必须添加-p参数主动将容器内部端口给保留出来。 'docker run -v /my/own/datadir:/data/db -p 27017:27017 -p 28017:28017 --name mongo -d mongo mongod --smallfiles' 。这样就能通过Robomongo远程连接数据库了。

  3. Node容器

    同样的方式安装node镜像。使用 'docker pull node:latest' 最新版本的node.js。如果我们想要与上面执行的mongoDB进行链接,则在run命令下使用 --link 来连接mongoDB。

    执行 'docker run -it --name node -v /my/own/datadir:/data --link mongo:mongo -w /data -p 5000:5000 node bash' 命令。

    node镜像后面接的bash表示我们以交互模式启动,这将显示node容器的提示符。-i参数则是表示在交互模式下启动容器,一旦交互结束,容器就会退出。-t则是分配一个伪tty。

    下面我们通过一个运行node脚本来验证node、mongodb两个容易已经能相互通信。

    我们在配置路径找到数据卷的地址(/my/own/datadir/),并建立项目目录 runNode(可以通过bash,也可以通过宿主系统)。并新建包含如下代码的js文件,这个文件用来测试node与mongoDB是否能连接成功。如果成功打印出'OK!',否则打印出错误。

    var MongoClient = require('mongodb').MongoClient;
    //连接数据库 注意 mongodbUrl使用的是Docker的容器名 mongo
    MongoClient.connect('mongodb://mongo:27017/testMongo', function(err, db){
        if(err){
            console.log(err);
        }else{
            console.log('OK!');
        }
    });
    

    还记得运行node容器时加入的bash环境吗,我们需要在容器中启动node实例。在data目录下进入runNode(主要目录和宿主系统是共享的)。执行 'npm install mongodb' && 'node app.js' 。如果连接成功就会返回如下内容。

    当然也可以直接通过 'docker run' 命令来直接运行容器下的应用。只要把上述命令的 node bash 修改成 node node app.js 并将 -w 指向应用目录 /data/runNode即可。


Docker可远远不只这些内容,今天只是简单上手了Docker部分功能。

参考:

  1. docker相关资料
  2. 官方安装docker文档
  3. 安装mongoDB+node镜像和使用
  4. Docker命令行
  5. 基于Docker开发NodeJS应用