UDN-企业互联网技术人气社区

板块导航

浏览  : 1070
回复  : 2

[Nodejs] Windows下运用Docker部署nodejs开发环境

[复制链接]
小辫儿的头像 楼主
发表于 2016-12-31 15:12:27 | 显示全部楼层 |阅读模式
  文章开头先明确一下我们希望实现的效果:

  依然在Windows下编辑源代码,在Docker容器中运行代码,最后在Windows的浏览器中看到运行结果,方便后续debug。

  可以将我开发完成的程序和运行环境一起打包制作成Docker的image,移交image给小伙伴运行或者直接发布到服务器上。

  安装与启动

  Docker引擎核心是运行在Linux操作系统上的Linux容器。所以要在Windows上使用Docker容器,先要提供Linux运行环境。Docker项目组提供了 Docker ToolBox工具 ,可以很方便的在Windows和Mac环境下安装Docker。

  安装过程会附带安装Oracle VM VirtualBox虚拟机,如下图:
11.png

  Kitematic为Docker的GUI管理工具,打开Docker Terminal可以快速地启动Docker。
10.png

  可以发现此时Docker给default machine分配了一个IP:192.168.99.100。我们可以直接在该终端下执行Docker命令。

  由于在Windows中运行Docker多加了一层虚拟机,有几个概念需要了解:

  Docker主机指的是Linux虚拟机,也就是说,此时Docker主机(即Linux虚拟机)的IP地址为192.168.99.100。

  与一般的ssh访问虚拟机一样,我们也可以通过该IP用ssh登录到Docker主机去执行命令。(用户名:Docker;密码:tcuser)

  如要用root权限去执行Linux命令(如mount),则需要打开VirtualBox。
9.png

8.png

  搭建Image

  新安装好的Docker主机中没有任何image( Docker images 查看已有的image)。运行node应用需要搭建node环境镜像,可以从 Docker Hub 上pull轻量级的Linux镜像作为基础镜像(如CentOS),在上面手动安装node;也可以直接pull一个已安装了node的镜像( Docker pull 拉取镜像)。从Docker Hub下载镜像可能非常慢,可以借助国内的云服务商下载(如 daocloud.io )。

  现在假设我们pull了一个不包含node环境的CentOS镜像。
  1. $ Docker run -it centos bash
复制代码

  启动一个容器,并进入容器的bash进行交互式操作。采用与CentOS下一样的方式安装node。安装完成后 exit 退出容器。请放心,如果不使用 Docker rm 或者 Docker run 时不增加 --rm 参数,即使退出容器,容器本身及其中的修改不会消失。可以用Docker ps -a 查看所有容器, Docker ps 查看正在运行的容器。
  1. $ Docker commit <CONTAINER_ID> <IMAGE>
复制代码

  提交之前修改的容器到新的image。该镜像就是已经安装了node环境的镜像(命名为nodejs)。

  在后续的开发中我们可以用 Docker run -it nodejs bash 启动容器。

  在Windows和虚拟机之间共享文件

  我们现在需要在Docker容器中运行源代码,而Docker容器是在Docker主机中的,所以首先,我们需要先保证Docker主机(即Linux虚拟机)能访问到Windows中的源代码文件。

  打开VirtualBox,点击“设置”->“共享文件夹”,指定路径和名称后勾选“自动挂载”和“固定分配”。“自动挂载”可以使得虚拟机下次启动时自动挂载文件夹,否则每次启动都需要重新手动挂载。
7.png

  如果顺利,重启虚拟机输入 mount 命令,可以看到共享文件夹挂载到了哪里,进入该目录就能看到与Windows下同步的文件。
6.png

  如果自动挂载遇到问题,取消这个选项,使用以下命令手动挂载:
  1. mount -t vboxsf Docker_share <mount_point>
复制代码

  在Docker容器中运行node代码

  首先在Windows的共享文件夹下编辑测试代码app.js:
  1. var http = require('http');
  2.     http.createServer(function (req, res) {
  3.       res.writeHead(200, {'Content-Type': 'text/plain'});
  4.       res.end('Hello World\n');
  5.     }).listen(1337);
  6. console.log('Server running at http://0.0.0.0:1337/');
复制代码

  可以在Docker主机中看到该文件。

  用nodejs镜像启动一个容器,我们希望这个容器能访问Docker主机中的文件作为源代码,还希望能在Windows下访问运行后的执行端口查看结果。用以下命令启动容器:
  1. $ Docker run -v /Docker_share:/app -p 1337:1337 -it nodejs bash
复制代码

  -v 主机目录:容器数据卷目录 使得主机目录被挂载到容器中,可被容器访问。

  -p 主机端口:容器端口 使得容器端口被映射到主机上,可以被容器外部访问到。

  注: 重复多个-p命令可以映射多个端口。

  (Docker 0.11版本以上可以使用--net=host参数使得容器中的所有端口映射在Docker主机上。故也可使用:)

  $ Docker run -v /Docker_share:/app --net=host -it nodejs bash

  进入容器中对应的数据卷目录,执行node app.js
5.png

  Windows下通过浏览器访问192.168.99.100:1337可看到结果
4.png

  至此,基本的node应用已经能在Docker下跑起来啦~

  进一步的开发工作

  1. npm install

  一般在node工程中都会存在node_modules依赖需要用 npm install 安装。在Docker下,期望运行应用的容器中,同样可以执行该命令。但注意增加 --no-bin-links 指令来避免创建软连接。

  npm install --no-bin-links

  2. 关联其他服务与容器互联

  许多node应用都会关联启用redis、mysql等服务。直接地,我们可以像在Windows下一样打开同一个容器的多个终端分别运行服务或执行代码。用以下命令进入一个正在运行的容器:

  $ Docker exec -it bash

  更优雅地,我们将不同的服务运行在不同的容器上,然后使用 --link name:alias容器互联的方式将他们关联起来,详情可以看 这篇博客 。

  3. 实时响应代码变化

  在开发过程中,如果每次修改代码都需要结束node进程然后重启必然会很麻烦。可以使用 nodemon工具 实现监控代码变化并自动重启进程的效果,这样一来只需要在浏览器下刷新就可以看到新的运行效果。

  安装nodemon:

  npm install -g nodemon

  依然以app.js为例,在容器中运行app.js时使用命令:

  nodemon -L app.js

  注:如果不在容器下运行,使用 nodemon app.js 即可,而在容器中,需要使用 -L或 --legacy-watch 参数打开Chokidar轮询,才能监听到挂载目录中文件的改变。
3.png

  尝试更改app.js内容,保存后可以发现nodemon自动重启了:
2.png

  刷新浏览器看到修改后的结果:
1.png

  关于nodemon,更详细的使用参见 GitHub-nodemon 。

  打包源码和环境为Image

  在工程目录下编辑Dockerfile和.Dockerignore文件。

  Dockerfile:
  1. FROM nodejs

  2. # Create app directory
  3. RUN mkdir -p /usr/src/app
  4. WORKDIR /usr/src/app

  5. # Install app dependencies
  6. COPY package.json /usr/src/app/
  7. RUN npm install

  8. # Bundle app source
  9. COPY . /usr/src/app

  10. EXPOSE 8080
  11. CMD [ "npm", "start" ]
复制代码

  FROM 指定基础镜像,接下来列出基于基础镜像需要做的操作命令,搭建起新的Image环境(包括复制源码和执行 npm install )可以参考 node官方文档

  .Dockerignore:
  1. node_modules
  2. npm-debug.log
复制代码

  在build新镜像时忽略其中的文件。

  在Docker主机中的工程命令下(Dockerfile所在目录)使用命令:
  1. $ Docker build -t . //注意末尾的点不可省去
复制代码

  可得到自行build的镜像。该镜像会自动添加到你的Docker主机下,你可以直接启动新镜像的容器运行代码(镜像内就包含代码,所以无需重复挂载到数据卷,不过就不能在Windows下修改了),也可以将镜像分享给小伙伴。

  总结

  到此,应该已经能满足基本的开发需求。

  虽然在Windows下使用Docker因为多加的一层虚拟机会觉得有一点别扭,但是Docker本身用容器和镜像将开发环境封装隔离的特性依然带来诸多方便。


相关帖子

发表于 2016-12-31 15:12:57 | 显示全部楼层
我完全是被标题<<Windows下运用Docker部署nodejs开发环境>>吸引过来的
使用道具 举报

回复

发表于 2016-12-31 17:48:55 来自手机 | 显示全部楼层
无论是不是沙发都得回复下
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部