Contents

Docker compose 做 scale 筆記

使用方法

舊版可以用docker-compose scale ...不過新版改成 docker-compose up --scale web=2,剛好最近學。順便紀錄一下問題。

範例

這邊簡單建立 websocket 測試,nodejs是參考網路上JavaScript | WebSocket 讓前後端沒有距離. WebSocket 是網路協定的一種, Client 可以透過此協定與… | by 神Q超人 | Enjoy life enjoy coding | Medium範例。

main.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//import express 和 ws 套件
const express = require('express')
const SocketServer = require('ws').Server

//指定開啟的 port
const PORT = 3000

//創建 express 的物件,並綁定及監聽 3000 port ,且設定開啟後在 console 中提示
const server = express()
    .listen(PORT, () => console.log(`Listening on ${PORT}`))

//將 express 交給 SocketServer 開啟 WebSocket 的服務
const wss = new SocketServer({ server })

//當 WebSocket 從外部連結時執行
wss.on('connection', ws => {
    console.log('Client connected')

    //對 message 設定監聽,接收從 Client 發送的訊息
    ws.on('message', data => {
        //data 為 Client 發送的訊息,現在將訊息原封不動發送出去
        ws.send(`${process.env.HOSTNAME}: response` + data)
    })

    ws.on('close', () => {
        console.log('Close connected')
    })
})

dockerfile

1
2
3
4
5
FROM node
COPY main.js package.json .
EXPOSE 3000
RUN npm install
ENTRYPOINT npm start

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '3'
services:
  node-app:
    image: 'nodejswebsocket'
    ports:
      - 3000

  nginx:
    image: nginx:stable-alpine
    ports:
      - 8000:80
    depends_on:
      - app
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      # - ./var/log/nginx:/var/log/nginx

nginx.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
map $http_upgrade $connection_upgrade {
    default Upgrade;
    '' close;
}

upstream websocket {
    server 192.168.0.10:9999;
}

server {
  listen  80 default_server;
  location / {
    proxy_pass http://node-app:3000;
	proxy_http_version 1.1; #WebSocket
	proxy_set_header Upgrade $http_upgrade; #WebSocket
	proxy_set_header Connection $connection_upgrade; #WebSocket   
  }
}

https://i.imgur.com/psDOJDg.png

預設 port 會隨機分配。

https://i.imgur.com/YHOvINY.png

Websocket 設定 SLB 反向代理設定可以參考
从websocket服务的nginx配置说起

遇到錯誤問題

docker-compose port 雷

這邊不能使用3000:3000,因為開多個container會撞到port

1
2
3
4
5
6
version: '3'
services:
  node-app:
    image: 'nodejswebsocket'
    ports:
      - 3000:3000

https://i.imgur.com/J7YNGgO.png

需要架一個 SLB 分流

雖然內部node-app是會自動做分流,但對外連線沒辦法使用node-app來訪問,所以需要架設nginx 做反向代理,當然也能使用traefik 做。