Docker Docker Docker
- 不需要在服务器上做太多的事
- node 的版本,global 库的版本,都可以自己控制。
- 安全
## Docker base image
base image 就像设计模式的模板模式,好处是,给你一个标准的流程,且最大限度的帮你完成一些重复的操作,同时,也限定了这个容器的操作范围,不会让你出错。
于是我们就做了一个
- hub: https://hub.docker.com/r/lanvige/node-deploy/
- github: https://github.com/lanvige/docker-node-deploy
这个 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 | . |
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]