详解Windows下运⽤Docker部署Node.js开发环境
开始
在windows下部署nodejs开发环境着实遍地坑,每遇到⼀个问题都要去google原因再试图解决。⽽且如果你想把你写好的应⽤交给别⼈跑跑看,他可能同样需要折腾很久才能真正在他的环境下运⾏起来。被坑了好些时⽇最终还是放弃,转战Docker。
⽂章开头先明确⼀下我们希望实现的效果:
1、依然在Windows下编辑源代码,在Docker容器中运⾏代码,最后在Windows的浏览器中看到运⾏结果,⽅便后续debug。
2、可以将我开发完成的程序和运⾏环境⼀起打包制作成Docker的image,移交image给⼩伙伴运⾏或者直接发布到服务器上。
安装与启动
Docker引擎核⼼是运⾏在Linux操作系统上的Linux容器。所以要在Windows上使⽤Docker容器,先要提供Linux运⾏环境。
去下载msi安装程序,若你的系统版本(例如64bit Windows 10 Pro, Enterprise and Education)⽀持Hyper-V虚拟技术,那么不需要使⽤额外的虚拟机(VirtualBox),安装程序会⾃动为你安装完成Docker(Docker for Windows)。
The Hyper-V package must be enabled for Docker for Windows to work. The Docker for Windows installer will enable it for you, if needed. (This requires a reboot). If your system does not satisfy these requirements, you can install Docker Toolbox, which uses Oracle Virtual Box instead of Hyper-V.
若不能使⽤Hyper-V虚拟技术,Docker项⽬组也提供了⼯具,可以很⽅便的在Windows环境下安装Docker。
更详细内容参考。
本⽂中的执⾏系统为Win7,故使⽤Docker toolbox。
安装过程会附带安装Oracle VM VirtualBox虚拟机,如下图:
Kitematic为Docker的GUI管理⼯具,打开Docker Terminal可以快速地启动Docker。
可以发现此时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。
搭建Image
新安装好的Docker主机中没有任何image(docker images 查看已有的image)。运⾏node应⽤需要搭建node环境镜像,可以从上pull轻量级的Linux镜像作为基础镜像(如CentOS),在上⾯⼿动安装node;也可以直接pull⼀个已安装了node的镜像(docker pull 拉取镜像)。从Docker Hub下载镜像可能⾮常慢,可以借助国内的云服务商下载(如)。
现在假设我们pull了⼀个不包含node环境的CentOS镜像。
$ docker run -it centos bash
启动⼀个容器,并进⼊容器的bash进⾏交互式操作。采⽤与CentOS下⼀样的⽅式安装node。安装完成后exit退出容器。请放⼼,如果不使⽤docker rm或者docker run时不增加--rm参数,即使退出容器,容器本⾝及其中的修改不会消失。可以⽤docker ps -a查看所有容器,docker ps查看正在运⾏的容器。
$ docker commit <CONTAINER_ID> <IMAGE>
提交之前修改的容器到新的image。该镜像就是已经安装了node环境的镜像(命名为nodejs)。
在后续的开发中我们可以⽤docker run -it nodejs bash启动容器。
在Windows和虚拟机之间共享⽂件
我们现在需要在Docker容器中运⾏源代码,⽽Docker容器是在Docker主机中的,所以⾸先,我们需要先保证Docker主机(即Linux虚拟机)能访问到Windows中的源代码⽂件。
打开VirtualBox,点击“设置”->“共享⽂件夹”,指定路径和名称后勾选“⾃动挂载”和“固定分配”。“⾃动挂载”可以使得虚拟机下次启动时⾃动挂载⽂件夹,否则每次启动都需要重新⼿动挂载。
如果顺利,重启虚拟机输⼊mount命令,可以看到共享⽂件夹挂载到了哪⾥,进⼊该⽬录就能看到与Windows下同步的⽂件。
如果⾃动挂载遇到问题,取消这个选项,使⽤以下命令⼿动挂载:
mount -t vboxsf docker_share <mount_point>
在Docker容器中运⾏node代码
⾸先在Windows的共享⽂件夹下编辑测试代码app.js:
var http = require('http');
res.writeHead(200, {'Content-Type': 'text/plain'});
}).listen(1337);
console.log('Server running at 0.0.0.0:1337/');
可以在Docker主机中看到该⽂件。
⽤nodejs镜像启动⼀个容器,我们希望这个容器能访问Docker主机中的⽂件作为源代码,还希望能在Windows下访问运⾏后的执⾏端⼝查看结果。⽤以下命令启动容器:
$ 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
Windows下通过浏览器访问192.168.99.100:1337可看到结果
⾄此,基本的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 <CONTAINER> bash
更优雅地,我们将不同的服务运⾏在不同的容器上,然后使⽤--link name:alias容器互联的⽅式将他们关联起来。
3. 实时响应代码变化
在开发过程中,如果每次修改代码都需要结束node进程然后重启必然会很⿇烦。可以使⽤⼯具实现监控代码变化并⾃动重启进程的效果,这样⼀来只需要在浏览器下刷新就可以看到新的运⾏效果。
安装nodemon:
npm install -g nodemon
依然以app.js为例,在容器中运⾏app.js时使⽤命令:
nodemon -L app.js
注:如果不在容器下运⾏,使⽤nodemon app.js即可,⽽在容器中,需要使⽤-L或--legacy-watch参数打开Chokidar轮询,才能监听到挂载⽬录中⽂件的改变。
尝试更改app.js内容,保存后可以发现nodemon⾃动重启了:
刷新浏览器看到修改后的结果:
关于nodemon,更详细的使⽤参见GitHub-nodemon。docker进入容器
打包源码和环境为Image
在⼯程⽬录下编辑Dockerfile和.dockerignore⽂件。Dockerfile:
FROM nodejs
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
EXPOSE 8080
CMD [ "npm", "start" ]
FROM指定基础镜像,接下来列出基于基础镜像需要做的操作命令,搭建起新的Image环境(包括复制源码和执⾏npm install)可以参考。
.dockerignore:
node_modules
npm-debug.log
在build新镜像时忽略其中的⽂件。
在Docker主机中的⼯程⽬录下(Dockerfile所在⽬录)使⽤命令:
$ docker build -t <ImageName> . //注意末尾的点不可省去
可得到⾃⾏build的镜像。该镜像会⾃动添加到你的docker主机下,你可以直接启动新镜像的容器运⾏代码(镜像内就包含代码,所以⽆需重复挂载到数据卷,不过就不能在Windows下修改了),也可以将镜像分享给⼩伙伴。
总结
到此,应该已经能满⾜基本的开发需求。
虽然在Windows下使⽤Docker因为多加的⼀层虚拟机会觉得有⼀点别扭,但是Docker本⾝⽤容器和镜像将开发环境封装隔离的特性依然带来诸多⽅便。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。