Docker-入门二dockernodeJs制作镜像与本地部署

38次阅读

共计 3237 个字符,预计需要花费 9 分钟才能阅读完成。

在熟悉 docker 基本命令与运作逻辑后,尝试实战。

目标:制作一个 nodejs 服务镜像,并使用 nginx 反向代理,在本地跑通。

本次项目配置与工具构成:

  1. node 后端:使用阿里的 Egg.js 脚手架
  2. db:mongodb
  3. nginx
  4. NoSqlBooster for MongoDB,一个 mongodb 可视化工具
  5. postman 一个可以发起网络请求的工具,用于测试

注:本机操作系统为 macOS

本文主讲 docker 部分,其余知识面仅描述部分

准备工作:

  1. docker 镜像:nginx:latest、node:10.15.3、mongo:latest
  2. docker-compose 可用
  3. Egg.js 脚手架初始化后端项目,命名为 egg-center

项目配置

Egg.js

安装 egg-mongoose 库,以便连接 mongodb。

数据库配置,修改./config/config.default.js

  config.mongoose = {
    clients: {
      center: {
        url: 'mongodb:// 你本地的内网 ip:27017/example',
        options: {
          dbName: 'center', // 数据库名,自己取
          user: '', // 连接数据库的账号,默认为空
          pass: '', // 连接数据库的账号,默认为空
        }
      }
    }
  }

接下来写一个后台用户管理系统

在 ./app/controller 下新增对应的控制器、在./app/model 下新增对应的表结构。

然后写几个简单的接口,修改:./app/router.js,定义路由:

'use strict'

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {const { router, controller} = app
  router.get('/', controller.home.index)

  /* 新增用户 */
  router.post('/api/admin/user', controller.admin.user.create)
  
  /* 用户列表 */
  router.get('/api/admin/user', controller.admin.user.index)
  
  ... 略
}

本地启动服务测试: npm run dev
本地使用 postman 调通接口,造些测试数据。

修改 package.json

"start": "egg-scripts start --deamon --title=egg-server-egg-center",

修改为:

"start": "egg-scripts start --title=egg-server-egg-center",

删除出--deamon,我们是在 docker 里跑项目,所以需要 node 服务跑在 docker 前台。

配置 Dockerfile

Egg.js 根目录 (./) 下新增文件:

  1. Dockerfile // Egg.js 镜像制作的配置文件
  2. docker-compose.yml // Egg.js 和 nginx 容器的配置
  3. mongodb-compose.yml // mongodb 容器的配置
  4. nginx.conf // nginx 配置文件

我们本次部署不使用 jenkins,采用较为简单的部署方式。

解释下为什么要把 mongodb 的配置单独写:
1. 绝大部分情况,数据库都是不关闭的,而业务服务器和 nginx 是会随着版本迭代等影响重启,所以将 mongodb 的配置单独拎出来
2. 业务服务会依赖 mongodb 启动,若写在同一个 docker-compose 文件里会出现异步问题,即 mongodb 还未完全启动至 ready 状态,node 服务已经启动连接数据库报错了。

接下来看文件内容。

Dockerfile:

FROM node:10.15.3 # 使用 node:10.15.3 镜像
RUN mkdir -p /egg-center # 在容器中新建目录文件夹 egg-center
WORKDIR /egg-center # 将 /egg-center 设置为默认工作目录
COPY package.json /egg-center/package.json
RUN yarn --production # 先 copy package.json 文件至容器,并安装依赖
COPY . /egg-center # 再 copy 代码至容器。也可以部分先后直接 copy 整个代码
EXPOSE 7006 # 暴露 7006 端口

docker-compose.yml:

version: '3'
services:
  nginx:
    image: nginx:latest # 使用 nginx:latest 镜像
    ports:
      - 8080:8080 # 宿主机端口: 容器端口
    volumes:
      - "/Users/liaoxinyu/JsProject/eggJsProject/server/egg-center/nginx.conf:/etc/nginx/conf.d/nginx.conf" # 挂载 nginx 配置文件
  egg-center:
    build:
      context: . # 以 Dockerfile 文件配置 build
    ports:
      - 7006:7006 # 宿主机端口: 容器端口,用于 nginx 转发
    command: ["npm", "start"] # 启动服务

配置 mongodb 容器,修改 mongodb-compose.yml:

version: '3'
services:
  mongodb:
    image: mongo:latest # 使用 mongo:latest 镜像
    ports:
      - 27017:27017 # 宿主机端口: 容器端口
    volumes:
      - "/Users/liaoxinyu/db/mongodb/data:/data/db/" # 挂载数据库目录至本地,若不挂载,容器关闭后数据丢失。

修改 nginx.conf:

upstream api {server 10.10.1.31:7006;} # 后端服务容器 端口:ip

server {
    listen         8080; # 监听 8080 端口,docker-compose 里做的映射
    server_name    localhost; # 本地配置就直接用 localhost 了,线上的话改成域名或公网 ip

    location /api {
        # /api 前缀的请求,全部转发至 Egg.js 服务
        proxy_pass http://api;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        # 可写多个 location,转发至不同的服务或静态资源路由
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri /index.html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {root   /usr/share/nginx/html;}
}

启动项目:
1. 先启动数据库:docker-compose -f mongodb-compose.yml up
2. 数据库完全启动后,启动 Egg.js 服务与 nginx:docker-compose up

验证:
1. 使用 NoSqlBooster for MongoDB 连接数据库,配置很简单,配置ip:port,查看数据库内容
2. 使用 postman 请求 http://localhost:8080/api/admin/user,这里发的请求是直接发到 nginx 代理的 8080 上。由 nginx 转发至业务服务端口 7006。

线上服务器就直接请求域名了,且不对外公开业务服务器的公网 ip: 端口。

结束


附:使用 nginx – docker 镜像部署服务器,配置 https,附带 java 后端部署例子

正文完
 0