第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

你如何將 WebSocket 服務(wù)器 docker 化?

你如何將 WebSocket 服務(wù)器 docker 化?

Go
PIPIONE 2023-06-01 14:12:17
我在將我的 WebSocket 服務(wù)器放入 Docker 容器時遇到了問題。這是服務(wù)器代碼,它使用“connected”寫入新連接。// server.gofunc RootHandler(w http.ResponseWriter, r *http.Request) {    upgrader := websocket.Upgrader{ // (Uses gorilla/websocket)        ReadBufferSize:  4096,        WriteBufferSize: 4096,    }    conn, err := upgrader.Upgrade(w, r, nil)    if err != nil {        panic(err)    }    if err = conn.WriteMessage(websocket.TextMessage, []byte("connected")); err != nil {        panic(err)    }}func main() {    fmt.Println("server is running")    // For graceful shutdown    stop := make(chan os.Signal, 1)    signal.Notify(stop, os.Interrupt)    server := http.Server{Addr: "localhost:8000"}    defer server.Close()    http.HandleFunc("/", RootHandler)    go func() {        err := server.ListenAndServe()        if err != nil && err != http.ErrServerClosed {            panic(err)        }    }()    <-stop}這是客戶端:// client.gofunc main() {    connection, _, err := websocket.DefaultDialer.Dial("ws://localhost:8000", nil)    if err != nil {        panic(err)    }    _, b, err := connection.ReadMessage()    if err != nil {        panic(err)    }    fmt.Println(string(b)) // "connected"}運行server.go然后client.go打印“已連接”,表明代碼正在運行。現(xiàn)在我想把服務(wù)器放在一個 Docker 容器中。這是dockerfile:FROM golang:1.11.4-alpine3.8COPY . $GOPATH/src/websocket-testWORKDIR $GOPATH/src/websocket-testRUN ["go", "build", "server.go"]EXPOSE 8000CMD ["./server"]我使用這些命令來構(gòu)建和啟動容器,暴露 8000/tcp。docker build -t websocket-test .docker run -p 8000:8000 websocket-test我可以確認(rèn)服務(wù)器正在運行,因為它打印“服務(wù)器正在運行”。如果我client.go從容器外開始,它會恐慌:panic: read tcp [::1]:60328->[::1]:8000: read: connection reset by peer我期望的是與以前相同的結(jié)果——在客戶端打印“connected”。錯誤消息意味著服務(wù)器在握手之前斷開了連接。我不明白“60328”這個數(shù)字。據(jù)我所知,WebSocket 不會在升級時更改端口,所以我應(yīng)該可以只公開 8000。我不知道我必須更改什么才能通過 WebSocket 連接到我的服務(wù)器。
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

當(dāng)您指定要偵聽的主機名或 IP 地址(在本例中l(wèi)ocalhost解析為127.0.0.1)時,您的服務(wù)器將僅偵聽該 IP 地址。


當(dāng)您在 Docker 容器之外時,監(jiān)聽localhost不是問題。如果您的服務(wù)器只監(jiān)聽127.0.0.1:8000,那么您的客戶端可以輕松連接到它,因為連接也是從127.0.0.1.


當(dāng)你在 Docker 容器中運行你的服務(wù)器時,它只會像以前一樣監(jiān)聽127.0.0.1:8000。這127.0.0.1是一個本地環(huán)回地址,在容器外無法訪問。


當(dāng)您使用 啟動 docker 容器時-p 8000:8000,它會將前往的流量轉(zhuǎn)發(fā)127.0.0.1:8000到容器的 IP 地址,在我的例子中是172.17.0.2.


容器在 docker0 網(wǎng)絡(luò)接口中獲取 IP 地址(您可以使用命令查看ip addr ls)


因此,當(dāng)您的流量被轉(zhuǎn)發(fā)到 上的容器時172.17.0.2:8000,那里沒有任何監(jiān)聽并且連接嘗試失敗。


修復(fù):

問題出在監(jiān)聽地址上:


server := http.Server{Addr: "localhost:8000"}

要解決您的問題,請將其更改為


server := http.Server{Addr: ":8000"}

這將使您的服務(wù)器監(jiān)聽所有容器的 IP 地址。


附加信息:

當(dāng)您在 Docker 容器中公開端口時,Docker 將創(chuàng)建 iptables 規(guī)則來執(zhí)行實際的轉(zhuǎn)發(fā)??吹竭@個。您可以使用以下方式查看這些規(guī)則:


iptables -n -L 

iptables -t nat -n -L


查看完整回答
反對 回復(fù) 2023-06-01
  • 1 回答
  • 0 關(guān)注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號