前言
项目中会用到 node 做中间层, 部署 node 则是用到了 docker, 在这里总结, 记录下部署要点和步骤; 关于 docker 的介绍和安装这里就不赘述了, 网上也有很多相关的教程和文章了, 需要可自行搜索查看.
项目结构
- -- docker-node
- |-- data
- |-- server
- |-- App.JS
- |-- Dockerfile
- |-- process.YAML
- |-- package.JSON
- |-- docker-compose.YAML
- </pre>
1, 创建 Node.JS 程序
App.JS
- const express = require('express');
- const App = express();
- App.get('/', (req, res) => res.send('hello world!'));
- </pre>
- App.listen(3008);
2, 创建 Dockerfile
- FROM node:8.9-alpine
- RUN mkdir -p /usr/src/App
- WORKDIR /usr/src/App
- RUN NPM set registry https://registry.npm.taobao.org/
- RUN NPM install
- CMD ["./node_modules/pm2/bin/pm2-docker", "process.yml"]
- </pre>
从 Dockerfile 中可以看到我们是通过 pm2-docker 运行 node 应用的, 利用 PM2 我们可以监听文件变化, 达到应用重启, 日志分存等效果; 这里我们需要一个 process.YAML 的配置文件, 相关用法可以查看 PM2 文档.
process.YAML
- apps:
- - script : 'app.js'
- name : 'dokcer-node'
- exec_mode: 'fork'
- watch : true
- instances: 1
- log_date_format : 'YYYY-MM-DD HH:mm Z'
- ignore_watch: ['node_modules']
- </pre>
3, 创建 docker-compose.YAML
生产环境上我们用到往往不只一个容器, 我们可以通过一个配置文件来管理多个 Docker 容器, 然后使用 docker-compose 来启动, 停止, 重启应用.
- docker-compose.YAML
- version: "3.0"
- services:
- server_node:
- container_name: server-node
- build:
- context: ./server
- volumes:
- - ./server:/usr/src/App
- ports:
- - "3008:3008"
- environment:
- - TZ=Asia/Shanghai
- portainer:
- image: portainer/portainer:1.11.4
- container_name: portainer
- expose:
- - "9000"
- ports:
- - "9000:9000"
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- - ./data/portainer:/data
- environment:
- - TZ=Asia/Shanghai
- </pre>
- }// 欢迎加入全栈开发交流圈一起学习交流: 582735936
- ]// 面向 1-3 年前端人员
- } // 帮助突破技术瓶颈, 提升思维能力
4, 启动容器
上述几个文件创建完毕, 我们执行下面的命令, 则会创建我们的镜像并且启动容器
$ docker-compose -f docker-compose.YAML up -d
5, 测试
1, 访问本地的 3008 端口
2, 测试当代码变化, node 自动重启功能, 我们把 "hello world!" 改为 "restart!!!!", 再次刷新页面
3, 利用 Portainer 管理容器; 可视化的界面相比命令行来说, 我们可以很方便, 快速查看容器日志, 容器配置, 状态, 以及对进行重启, 删除等操作; 我们访问本地 9000 端口即可 (docker-compese.YAML 中配置), 结果如下.
来源: http://www.qdfuns.com/article/51116/4d1c9e700cc4873308c813ca0f8a7b61.html