本文會經過三個簡單的demo,演示如何經過docker部署node集羣。node
若是想學習docker,官方文檔是一個不錯的入門指引,或者能夠看這個gitbook。linux
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容器。