在熟悉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:端口。
結束