在熟悉docker基本命令与运做逻辑后,尝试实战。html
目标:制做一个nodejs服务镜像,并使用nginx反向代理,在本地跑通。java
本次项目配置与工具构成:node
NoSqlBooster for MongoDB
,一个mongodb可视化工具postman
一个能够发起网络请求的工具,用于测试注:本机操做系统为 macOSnginx
本文主讲docker部分,其他知识面仅描述部分
准备工做:mongodb
egg-center
项目配置docker
Egg.js
安装egg-mongoose
库,以便链接mongodb。数据库
数据库配置,修改./config/config.default.jsnpm
config.mongoose = { clients: { center: { url: 'mongodb://你本地的内网ip:27017/example', options: { dbName: 'center', // 数据库名,本身取 user: '', // 链接数据库的帐号,默认为空 pass: '', // 链接数据库的帐号,默认为空 } } } }
接下来写一个后台用户管理系统
在 ./app/controller 下新增对应的控制器、在./app/model下新增对应的表结构。json
而后写几个简单的接口,修改:./app/router.js,定义路由:segmentfault
'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根目录(./)下新增文件:
Dockerfile
// Egg.js镜像制做的配置文件docker-compose.yml
// Egg.js和nginx容器的配置mongodb-compose.yml
// mongodb容器的配置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:端口。
结束