docker-compose with node&pm2&nginx 使用

jackple發表於2017-12-15

前言

我也只是一個初學者, 這篇文章同時作為筆記記錄一下學習過程.

在理解docker-compose之前, 首先我們要知道docker是什麼, 引言自知乎:

Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,可以把貨物規整的擺放起來。並且各種各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裡封裝的好好的,那我就可以用一艘大船把他們都運走。

docker就是類似的理念。現在都流行雲端計算了,雲端計算就好比大貨輪。docker就是集裝箱。

1.不同的應用程式可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在一個伺服器上就要除錯很久,而且很麻煩,還會造成一些衝突。比如IIS和Apache訪問埠衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在伺服器上建立不同的虛擬機器在不同的虛擬機器上放置不同的應用,但是虛擬機器開銷比較高。docker可以實現虛擬機器隔離應用環境的功能,並且開銷比虛擬機器小,小就意味著省錢了。

2.你開發軟體的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的資料庫,只有Ubuntu支援,centos不支援,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。

3.在伺服器負載方面,如果你單獨開一個虛擬機器,那麼虛擬機器會佔用空閒記憶體的,docker部署的話,這些記憶體就會利用起來。

繼以上所說, compose 就如同它的字面意思"組合",它就好像是一個大箱子,可以把幾個不相關的集裝箱(docker容器)給組合起來,變成一個整體。

使用

  1. 安裝docker並配置加速器DaoCloud(不詳述, 如有需要請點選前往官網)
  2. 新建資料夾並初始化工程

    mkdir test && cd test && npm init複製程式碼

  3. 以koa為例測試, 安裝koa

    npm i koa -S複製程式碼

  4. 新建nginx資料夾並向其中新增並編輯nginx.conf

    user nginx;worker_processes 1;
    events {  worker_connections 512;}
    http {  log_format main  '$remote_addr - $remote_user[$time_local] "$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';  access_log /etc/nginx/access.log main;
      # 設定server叢集,負載均衡關鍵指令  upstream test_server {    server app:3000;  }
      server {    listen 80;    server_name localhost;    location / {      proxy_pass http://test_server;    }  }}複製程式碼

  5. 專案根目錄新增並編輯app.js

    const Koa = require('koa')
    const app = new Koa()
    app.use(ctx => {  ctx.body = 'Hello World'})
    app.listen(3000)console.log('app started at http://localhost:3000/')複製程式碼

  6. 專案根目錄新增並編輯pm2配置檔案process.json

    {  "apps": [    {      "name": "app-name",      "script": "app.js",      "instances": 4,      "env": {        "production": true      }    }  ]}複製程式碼

  7. 專案根目錄新增並編輯配置檔案docker-compose.yaml

    version: "2"
    services:
      nginx:
        restart: always
        image: nginx
        volumes:
          #~/Documents/docker/test/nginx為本機目錄, /etc/nginx為容器目錄, port同理
          - ~/Documents/docker/test/nginx:/etc/nginx 
        ports:
          - 80:80
        links:
          #建立連線,web容器就無需暴露埠出去
          - app
      app:
        #指定container的名稱, 後續方便使用命令進入到容器內以及與nginx.conf相對應
        container_name: app
        #構建容器
        build: .
        volumes:
          - ~/Documents/docker/test:/usr/src/app
        ports:
          - "3000:3000"
    複製程式碼

  8. 專案跟目錄新增並編輯Dockerfile

    FROM node:9WORKDIR usr/src/appADD . /usr/src/appRUN npm config set registry https://registry.npm.taobao.org/ && \    npm i -g pm2 --no-optionalEXPOSE 3000
    #pm2在docker中使用命令為pm2-dockerCMD ["pm2-docker", "start", "--json", "process.json"]複製程式碼

  9. 啟動

    // 構建並啟動
    // 加"-d"為後臺啟動
    docker-compose up
    // 強制重新構建並啟
    docker-compose up --force-recreate --build複製程式碼

啟動成功:

docker-compose with node&pm2&nginx 使用

瀏覽器訪問http://localhost:3000/


如果有什麼不正確的地方還希望指正, 謝謝!!!


相關文章