Docker - 入門(二),docker&nodeJs製做鏡像與本地部署

在熟悉docker基本命令與運做邏輯後,嘗試實戰。html

目標:製做一個nodejs服務鏡像,並使用nginx反向代理,在本地跑通。java

本次項目配置與工具構成:node

  1. node後端:使用阿里的 Egg.js 腳手架
  2. db:mongodb
  3. nginx
  4. NoSqlBooster for MongoDB,一個mongodb可視化工具
  5. postman 一個能夠發起網絡請求的工具,用於測試

注:本機操做系統爲 macOSnginx

本文主講docker部分,其他知識面僅描述部分

準備工做:mongodb

  1. docker鏡像:nginx:latest、node:10.15.三、mongo:latest
  2. docker-compose可用
  3. Egg.js腳手架初始化後端項目,命名爲 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根目錄(./)下新增文件:

  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後端部署例子

相關文章
相關標籤/搜索