How I Do Node Deploy

Docker Docker Docker

  • 不需要在服务器上做太多的事
  • node 的版本,global 库的版本,都可以自己控制。
  • 安全

## Docker base image

base image 就像设计模式的模板模式,好处是,给你一个标准的流程,且最大限度的帮你完成一些重复的操作,同时,也限定了这个容器的操作范围,不会让你出错。

于是我们就做了一个

这个 base image onbuild 做了以下几件事情

  • 限定工作目录 /app/
  • 安装指定版本 pm2
  • 复制 package.json 和 yarn.lock,并进行 production 的安装。
  • 复制项目到 /app
  • 导出端口 80 443
  • 指定启动脚本 pm2-docker(脚本参数可改)

## boilerplate

https://github.com/lanvige/koa2-boilerplate

对应这个 image 还有一个完整个 node 项目,是基于 koa2 的。

项目的目录结构:

1
2
3
4
5
6
7
8
9
10
.
├── app
├── bin
├── config
├── lib
├── docker-compose.yml
├── Dockerfile
├── package.json
├── process.yml
└── yarn.lock

dockerfile

其中 dockerfile 最简单,因为 base image 中做了全部的事情,这里只需要一个空的设置就可以了。

因为是 base image 是 onbuild 的,所以还是需要一个这个的文件。

docker-compose.yml

compose 文件,是构建 docker image 和 启动的一些设置。像容器名字,端口绑定,环境设置

process.yml

process.yml 这是 pm2 启动的配置。


## 使用
  • yarn build,将代码进行编译,生成目录 dist
  • app config build,创建使用环境的 config 到 dist/config 目录
  • docker-compose up -d, 在 dist 目录下,运行 docker compose 命令构建镜像并启动。

简单到无聊~


## 线上发布

理论上好的流程是,一台 docker build server 负责制作 image,然后推到 registry,线上服务器拉取镜像,再启动。

但实际中,这个成本有点高,首先需要一台 build server,其实,镜像很大,占流量。

于是,在个人项目中,直接使用 shipit 来进行发布,在本地做项目的构建,然后,将 dist 的代码同步到服务器,服务器直接本机构建 docker image,然后启动。

通过 shipit-deploy,可以方便的完成 前面的代码构建,同步到服务器上的操作。
通过 shipit remote 的功能,也很方便的扩展 docker 的一些命令。


## 演进

NODE_ENV: 之前将 node_env 放在了 Node 构建时进行设置,后来发现,这样可能就导致一个容器只能在一种环境下启动,想修改,必须在启动后,通过 exec 进入容器后才能修改。

于是将这个配置向后移,放到了 pm2 的配置中。

这样,在启动容器时,可以通过修改 docker cmd 来进行配置:

1
command: start --env production /app/process.yml

## REF:: ---
  • [none]