使用方法
舊版可以用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 做。