Docker 笔记 打造node.js开发环境 安装nvm

通过制作一个Docker镜像,统一管理开发环境,使不同开发者可以在任何平台下开发,同时拥有相同的开发环境配置。

文章所用的示例代码发布在Github上了,点击此处查看

创建Dockerfile文件


###########
# Usage:
#
#   docker run -it -v <project-resource-directory>:/workspace \
#                  --name <container-name> [image-name]
#

FROM centos
MAINTAINER ijse

RUN yum -y update
RUN yum -y install tar git

# 配置环境变量
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 0.10.32
ENV WORK_DIR /workspace

# 下载和配置Node.js环境
# 这些命令一定要写在一起, 否则`nvm`命令会找不到
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.24.0/install.sh | bash \
    && source $NVM_DIR/nvm.sh \
    && nvm install v$NODE_VERSION \
    && nvm use v$NODE_VERSION \
    && nvm alias default v$NODE_VERSION

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH

# 设置工作目录
WORKDIR $WORK_DIR

# 公开镜像的80端口
EXPOSE 80

CMD node
  • 每条RUN命令即是一层(Layer),Docker会将其缓存,对提高存储加快build速度很有用。
  • 每次RUN命令,都被分配了一个单独的进程环境执行,因此一些环境变量等是不同的。
  • CMD命令相当于docker run中执行的命令,

构建出image

$ docker build --force-rm -t ijse/nvm .
$ docker images

构建成功后,会看到出现了一个ijse/nvm的镜像。

注意,build 的时候到如下一步时:
“`
=> Close and reopen your terminal to start using nvm

不要动,这时候正在下载安装Node.js,可能会花费比较长时间,如果等得不耐烦,可以另开一个终端,用`docker ps`查到容器Id, 然后`docker attach <容器Id>`来查看进度。

#### 试着跑一下~
镜像构建成功后,就应该出现在`docker images`列表中了,用如下命令试着运行一下容器内的终端:

$ docker run -it –name test-nvm ijse/nvm

接着便进入了node的交互命令行下,可以执行
process.version`查看容器中node.js的版本。

把代码装载

由于代码会经常更新,将它们打包进镜像中不太合适,一般通过目录挂载的方式,将代码目录放在宿主机上,这样可以分开管理。

启动的时候添加-v参数挂载代码目录:

$ docker run -it --name test-nvm -p 80 -v /myPorject:/workspace ijse/nvm bash

运行后即进入容器的bash下,此时可以继续执行开发相关的命令了,如npm install && npm start

-p 3000:80参数,将容器的80端口绑定到宿主机的3000端口上,于是我们可以访问http://localhost:3000来访问容器的80端口服务了。

注意:

  • 如果是在Windows或Mac系统下,由于Docker是运行在虚拟机里的,所以访问时localhost要换为虚拟机的ip地址。
  • npm install的时候,由于挂载机制,在Windows下可能需要添加--no-bin-links参数

全部代码

示例的代码放到了Github上: http://github.com/ijse/nodejs-docker-image

后记

这个示例很简单,而通常情况下我们的项目会更复杂些,不仅环境会有很多配置修改,还会需要其它服务,如MongoDB, Redis,甚至其它一些Web Services等。我们可以把这些服务都打包进一个镜像中,也可以分开。使用差不多的方式编写相应的Dockerfile,并配置环境即可。

于是便可以看出Docker的方便之处:

  1. 直接分发Dockerfile即可,其它开发者可以自己构建出镜像,并且与大家开发环境一致
  2. 跨平台开发的方便,无论宿主机是什么平台,Docker都可以保证代码运行的环境与线上环境一致
  3. 维护方便,只需要维护Dockerfile即可随时管理更新开发环境

Docker上手很快,一般使用的话,运行几条命令即可满足需求。简直是程序开发的福音。

发表评论