在Docker搭建Node.js+mongoDB开发环境
这周通过docker将整个技术栈更新一下,首先介绍Docker的基本概念。
Docker是在LXC上构建的容器引擎。我这里主要讲起当作更加灵巧的虚拟机用。Docker主要有如下4个概念,简单介绍一下。
镜像:类似虚拟机快照,大多都是在现有工具镜像上创建新镜像。我今天使用的都是官方的镜像。
容器:从镜像中创建应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。
数据卷:完成数据持久化的功能,使得宿主系统和容器之间可以数据访问
链接:引用其他容器,进行容器间通讯。
- 安装Docker
使用 ‘sudo apt-get install docker.io’ 命令安装 docker,然后通过 ‘docker version’ 查看版本。这样docker就在本机上安装了。
- 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远程连接数据库了。
- 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部分功能。
###参考: