使用docker部署node集羣

本文會經過三個簡單的demo,演示如何經過docker部署node集羣。node

若是想學習docker,官方文檔是一個不錯的入門指引,或者能夠看這個gitbooklinux

1、部署node容器git

首先準備一個node服務demo,代碼以下:web

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
    ctx.body = 'Hello World';
});

app.listen(8080);

部署node服務redis

製做本身的node服務鏡像,最簡單的方式就是基於已有的node鏡像,在此基礎上,添加本身的內容,能夠經過Dockerfile描述本身的node鏡像,內容以下:docker

FROM node:8.9.1

# 複製當前代碼到指定目錄下
ADD . /home/app
WORKDIR /home/app
RUN npm install

EXPOSE 8080
CMD ["npm", "run", "dev"]

有了鏡像文件以後,能夠經過docker build構建鏡像:npm

docker build -t node-demo .  
# -t 表示定義鏡像名

查看當前構建的鏡像:bash

docker images

經過鏡像運行容器:app

docker run -d -p 8080:8080 node-demo 
# -d 表示後臺運行

查看運行中容器信息:koa

docker ps

查看容器運行日誌:

docker logs xxx
# xxx 爲容器id

暫停容器:

docker container stop xxx

由於鏡像底層是一個linux鏡像,因此能夠鏈接上容器bash:

docker exec -i -t xxx bash

2、部署node、redis服務

在第一步代碼的基礎上,咱們使用node鏈接一個redis,模擬一個訪客計數的功能,修改後的node代碼以下:

const Koa = require('koa');
const bluebird = require("bluebird");
const redis = require("redis");
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
const app = new Koa();

// 注意這裏的host被指定爲 redis,這是docker compose提供的功能
let host = 'redis';
let port = '6379';

let client = redis.createClient({
    host,
    port
});

app.use(async ctx => {
    if (ctx.path == '/incr') {
        let num = await client.getAsync('num');
        num++;
        client.set('num', num, redis.print);
        return ctx.body = `num is ${num}`;
    }
    ctx.body = 'Hello World';
});

app.listen(8080);

node服務須要鏈接redis服務,docker提供了compose工具簡化了容器間通訊,要使用compose功能,須要定義描述文件docker-compose.yml:

version: '3'
services:
  web:
    build: .
    ports:
     - "8080:8080"
  redis:
    image: "redis:alpine"

這裏描述了兩個容器web和redis,分別對應node和redis。

而後經過docker-compose啓動容器,默認若是沒有構建鏡像,會先構建或者pull鏡像:

docket-compose up -d

查看容器運行狀況:

docker-compose ps

暫停容器:

docker-compose stop

3、部署node集羣

最後例子是啓動多個node容器,構成集羣,而後訪問同一個redis:

利用docker提供的實例擴展,其實很容易作到,只要修改docker-compose.yml以下:

version: '3'
services:
  web:
    image: node-demo
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
     - "8080:8080"
  redis:
    image: "redis:alpine"

惟一的區別就是添加了deploy聲明,指定是node實例數量和資源狀況。

對於真正的集羣部署,docker提供了swarm功能,swarm功能很強大,能夠管理跨機器部署,這裏就只用到最簡單的實例擴展。

首先建立集羣:

docker swarm init

而後部署集羣

docker stack deploy -c docker-compose.yml node-swarm

查看集羣運行狀況

docker service ls

而後查看容器運行狀況

docker container ls

能夠看到當前有6個容器在運行,一個redis容器,五個node容器。

相關文章
相關標籤/搜索