最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker部署golang http服務時端口無法訪問的問題解決

 更新時間:2022年08月05日 10:12:05   作者:冬天里的懶貓  
本文主要介紹了docker部署golang http服務時端口無法訪問的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

需要使用docker將golang的httpserver容器化。在這個過程中遇到了一個低級問題,golang http服務時端口無法訪問,特此記錄解決這個問題的過程。

1.背景

1.1 問題描述

問題描述: docker鏡像啟動成果之后,通過curl不能訪問:

[root@hecs-205828 ~]# curl -XGET http://127.0.0.1:8360/hello
curl: (56) Recv failure: Connection reset by peer

1.2 webserver代碼

go文件:main.go

package main

import (
   "fmt"
   "net/http"
   "os"
   "strings"
)

func main() {
   http.HandleFunc("/hello", handler_hello)
   http.HandleFunc("/healthz", handler_healthz)
   http.ListenAndServe("127.0.0.1:8360", nil)
}

func handler_healthz(w http.ResponseWriter, r *http.Request) {
   w.WriteHeader(http.StatusOK)
   w.Write([]byte("OK"))
}

func handler_hello(w http.ResponseWriter, r *http.Request) {
   fmt.Println("method = ", r.Method)
   fmt.Println("URL = ", r.URL)
   fmt.Println("RemoteAddr = ", r.RemoteAddr)
   fmt.Println("IP = ", strings.Split(r.RemoteAddr, ":")[0])
   fmt.Println("header = ", r.Header)
   fmt.Println("body = ", r.Body)
   fmt.Println(r.RemoteAddr, "連接成功")

   for name, values := range r.Header {
      for _, value := range values {
         fmt.Println(name, value)
         _, exits := w.Header()[name]
         if exits {
            w.Header().Add(name, value)
         } else {
            w.Header().Set(name, value)
         }
      }
   }
   VERSION := os.Getenv("VERSION")
   fmt.Println("VERSION is :", VERSION)
   w.Header().Set("VERSION", VERSION)
   w.WriteHeader(http.StatusOK)
   w.Write([]byte("hello http server"))
}

3.Dockerfile文件

Dockerfile文件:

FROM golang:1.17 AS build

WORKDIR /web-server/

COPY . .
ENV CGO_ENABLED=0
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
RUN GOOS=linux go build -installsuffix cgo -o web-server main.go

FROM busybox
COPY --from=build /web-server/web-server /web-server/web-server
EXPOSE 8360
ENV ENV local
WORKDIR /web-server/
ENTRYPOINT ["/web-server/web-server"]

2.問題分析

發(fā)現(xiàn)curl無法訪問docker容器中的服務,telnet結(jié)果如下:

[root@hecs-205828 ~]# telnet 127.0.0.1 8360
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.

于是,打算采用命令進入docker容器內(nèi)部查看:

[root@hecs-205828 ~]# docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                       NAMES
dfb2b46abd34   httpserver:0.0.1   "/web-server/web-ser…"   27 hours ago     Up 2 hours      0.0.0.0:8360->8360/tcp, :::8360->8360/tcp   relaxed_mccarthy

通過docer ps -a 得到容器id為dfb2b46abd34。進入容器:

[root@hecs-205828 ~]# docker exec -it dfb2b46abd34 sh
/web-server # ps 
PID   USER     TIME  COMMAND
    1 root      0:00 /web-server/web-server
   38 root      0:00 sh
   94 root      0:00 sh
  101 root      0:00 ps
/web-server # netstat -an |grep 8360
tcp        0      0 127.0.0.1:8360          0.0.0.0:*               LISTEN      
/web-server #

可以看到,在容器內(nèi)部實際上8360端口已經(jīng)被監(jiān)聽。容器訪問應該不存在問題。 容器內(nèi)部支持wget:

/web-server # wget -q -O -  http://127.0.0.1:8360/hello
hello http server
/web-server # 

可以看到在docker服務內(nèi)部運行是正常的。

查看其網(wǎng)絡端口衍射:

[root@hecs-205828 ~]# docker port  dfb2b46abd34 
8360/tcp -> 0.0.0.0:8360
8360/tcp -> :::8360

端口衍射也不存在問題。那么問題究竟出在什么地方呢? 忽然想到,容器內(nèi)部的nestat監(jiān)聽端口是127.0.0.1,于是瞬間明白了。 在容器內(nèi)部的監(jiān)聽端口為127.0.0.1的話,那么只能接受容器內(nèi)部來自127.0.0.1的本地回環(huán)訪問。來自容器外外部的訪問請求將被拒絕。 因此,這個問題的修復原因?qū)嶋H上很簡單,只需要將main.go的中監(jiān)聽ip改為0.0.0.0即可。

3.解決方案

果斷將監(jiān)聽ip改為0.0.0.0:

func main() {
   http.HandleFunc("/hello", handler_hello)
   http.HandleFunc("/healthz", handler_healthz)
   http.ListenAndServe("0.0.0.0:8360", nil)
}

之后重新制作鏡像:

sudo docker build . -t httpserver:0.0.2

然后啟動本地鏡像:

 sudo docker run -d -p 8260:8230 httpserver:0.0.2

啟動之后:

[root@hecs-205828 ~]# docker ps -a
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS                                       NAMES
ae5e2bf431c7   httpserver:0.0.2   "/web-server/web-ser…"   50 minutes ago   Up 50 minutes   0.0.0.0:8260->8360/tcp, :::8260->8360/tcp   affectionate_nash
dfb2b46abd34   httpserver:0.0.1   "/web-server/web-ser…"   27 hours ago     Up 2 hours      0.0.0.0:8360->8360/tcp, :::8360->8360/tcp   relaxed_mccarthy
[root@hecs-205828 ~]# 

之后再訪問新增的容器,結(jié)果正常:

[root@hecs-205828 ~]# curl -XGET http://127.0.0.1:8260/hello
hello http server
[root@hecs-205828 ~]# 

問題解決。

到此這篇關(guān)于docker部署golang http服務時端口無法訪問的問題解決的文章就介紹到這了,更多相關(guān)docker部署golang http內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何一次重啟所有已停止的docker容器

    如何一次重啟所有已停止的docker容器

    這篇文章主要介紹了如何一次重啟所有已停止的docker容器問題,
    2024-01-01
  • docker?掛載MySQL實現(xiàn)數(shù)據(jù)持久化的實現(xiàn)

    docker?掛載MySQL實現(xiàn)數(shù)據(jù)持久化的實現(xiàn)

    本文主要介紹了docker?掛載MySQL實現(xiàn)數(shù)據(jù)持久化的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 基于docker的redis集群的搭建方式

    基于docker的redis集群的搭建方式

    這篇文章主要介紹了基于docker的redis集群的搭建方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Docker沒有啟動環(huán)境變量的問題解決

    Docker沒有啟動環(huán)境變量的問題解決

    在使用Docker容器時,有時候我們會遇到一個問題,就是在容器中沒有啟動環(huán)境變量,本文主要介紹了Docker沒有啟動環(huán)境變量的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Docker安裝Jenkins的實現(xiàn)步驟

    Docker安裝Jenkins的實現(xiàn)步驟

    版本與jdk版本以及各類插件有對應關(guān)系,所以普通安裝較為麻煩,本文主要介紹了Docker安裝Jenkins的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Docker 命令自動補全的實現(xiàn)

    Docker 命令自動補全的實現(xiàn)

    這篇文章主要介紹了Docker 命令自動補全的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • docker部署mysql8之PXC8.0分布式集群過程

    docker部署mysql8之PXC8.0分布式集群過程

    這篇文章主要介紹了docker部署mysql8之PXC8.0分布式集群過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Docker報錯Operation?not?permitted問題的解決方法

    Docker報錯Operation?not?permitted問題的解決方法

    剛開始接觸Docker的朋友經(jīng)常會遇到問題,下面這篇文章主要給大家介紹了關(guān)于Docker報錯Operation?not?permitted問題的解決方法,需要的朋友可以參考下
    2023-02-02
  • Docker 教程之數(shù)據(jù)管理詳細介紹

    Docker 教程之數(shù)據(jù)管理詳細介紹

    這篇文章主要介紹了Docker 教程之數(shù)據(jù)管理詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Docker容器harbor私有倉庫部署和管理

    Docker容器harbor私有倉庫部署和管理

    這篇文章主要介紹了Docker容器harbor私有倉庫部署和管理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的的參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論

白朗县| 赣州市| 安吉县| 崇明县| 开封市| 汝南县| 麦盖提县| 兴文县| 锡林浩特市| 苏尼特左旗| 修武县| 永平县| 长寿区| 青冈县| 晋州市| 禄丰县| 灵山县| 运城市| 兴业县| 上思县| 彭州市| 海淀区| 含山县| 旬邑县| 突泉县| 德庆县| 三河市| 白城市| 肥东县| 定安县| 海丰县| 于田县| 图片| 平度市| 双牌县| 藁城市| 姜堰市| 霍山县| 巴南区| 东兴市| 台南县|