程式狂想筆記

一個攻城師奮鬥史

0%

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
}
}

預設 port 會隨機分配。

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

需要架一個 SLB 分流

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