docker中的node项目从0开始部署到生产环境

245 阅读2分钟

背景

使用 docker 在生产环境运行 node 项目。 本文档以 update-db-avatar 项目为例。

流程

配置 registy 域名

记得在 /etc/hosts 中配置好 build.ykt.io。跳板机上已经配置好,所以在跳板机上不用再配置。

Dockerfile

build 的时候如果没有用 -f 指定文件,默认使用 Dockerfile

举例如下:

FROM build.ykt.io/rain-node
MAINTAINER mahui@xuetangx.com

ENV DEPLOY_DIR  /rain


ADD . ${DEPLOY_DIR}


CMD [ "sh", "-c", "cd $DEPLOY_DIR; node index.js"]

镜像 build.ykt.io/rain-node 中已经配置好了node环境,并安装了必要的 node_modules 模块依赖。所以继承这个镜像。

CMD 指令如果不用 [] 方式的话,或默认加 sh -c

生成镜像

到跳板机上,nvm use 8 切换 node 环境到合适版本后,在项目下执行 npm install(因为 Dockerfile 中没有配置安装模块的步骤),如果使用 common_config 的话,记得把使用的软连接删掉,把真实的文件夹复制进来,从而能够将其 build 进镜像。 sudo su 变身管理员(否则无权使用 docker 服务),然后在当前项目下执行 docker build -t build.ykt.io/avatar ./, 从而生成镜像 build.ykt.io/avatar

在跳板机上继续执行 docker push build.ykt.io/avatar 将镜像推到 build.ykt.io 下的 build.ykt.io/avatar。如果前面不加 build.ykt.io 的话,默认会推到 docker hub。(registry 的知识看另外一篇文章

生产环境拉取镜像

ssh dropa 到生产环境,sudo su, 执行 docker pull build.ykt.io/avatar 将跳板机推的镜像 pull 下来。

启动服务

执行 docker run -d -v logs:/rain/logs --env NODE_ENV=production --hostname=rain-dropa --name=avatar build.ykt.io/avatar, 执行生成后台运行的 container,并配置 volumescontainer 中的 /rain/logs 目录匹配到生成环境的 logs 目录,从而在外部可以访问 container 内部生成的日志文件。并设置了 container 内部的环境变量。

像上面如果没有指定 container name 的话会默认生成一个名字,可以通过 docker ps 去查找其 id。

至此,已经启动了服务。

检查服务

执行 docker exec -it cb276d460efeae2fa794edde5a2eaa61358bc7c9102d0f6020937b59569a386f bash 可以进入 container 内部。

执行 docker stats 可以查看所有 container 的运行状态,包括如下条目:

CONTAINER
CPU %
MEM USAGE / LIMIT
MEM %
NET I/O
BLOCK I/O
PIDS

TODO