CURL 在 Docker 映像中不起作用 [无法访问 Docker 映像中的主机]

码头工人文件


# Start from the latest golang base image

FROM golang:latest


# Add Maintainer Info

LABEL maintainer="Sumit Thakur <sumitthakur@yahoo.com>"


# Set the Current Working Directory inside the container

WORKDIR /app


# Copy go mod and sum files

COPY go.mod go.sum ./


# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed

RUN go mod download


# Copy the source from the current directory to the Working Directory inside the container

COPY . .


# Build the Go app

RUN go build -o testapp myapplication.go testapp.go


# Expose port 50051 / for internal comunication 


ENV PORT 50051

RUN echo $PORT


EXPOSE ${PORT}


# Command to run the executable

CMD ["./testapp"]

构建 Docker 文件


docker build -t testapp  -f Dockerfile .

这是完美的工作


运行 Docker 文件


docker run -d -p 50051:50051 testapp

这也可以正常工作


我检查正在运行的容器


docker ps

这会给我


CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                      NAMES

57cd3c01bcda        testapp           "./testapp"       2 seconds ago       Up 2 seconds        0.0.0.0:50051->50051/tcp   gracious_bhaskara

当我检查网络检查时


docker network inspect bridge


开心每一天1111
浏览 157回答 3
3回答

SMILET

从评论中的讨论来看,问题似乎与https握手有关。一个简单的解决方案是使用以下 URL 查询服务:curl&nbsp;-H&nbsp;"Content-type:application/json"&nbsp;-X&nbsp;GET&nbsp;'https://localhost:50051/testapp/v1/order'&nbsp;-v&nbsp;-k使用-k,您将忽略HTTPS验证。注意:我已将 URL 从更改http为https.

守候你守候我

从容器内部,您需要侦听所有接口,而不是 localhost 或环回接口。网络是在 docker 中命名的,因此您不仅可以获得一个新的私有 ip,还可以获得容器内部一个无法从外部访问的单独环回接口。为此,请更改:http.ListenAndServe("localhost:50051",&nbsp;headersOk)到:http.ListenAndServe(":50051",&nbsp;headersOk)

哆啦的时光机

上提供的代码main.go不会启动 TLS,因此请停止使用 curl 来卷曲https,它将无法正常工作。卷曲http会起作用package mainimport (&nbsp; &nbsp; "io"&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "github.com/gorilla/handlers")func main() {&nbsp; &nbsp; http.HandleFunc("/testapp/v1/order", testHandler)&nbsp; &nbsp; headersOk := handlers.AllowedHeaders([]string{""})&nbsp; &nbsp; http.ListenAndServe(":50051", headersOk)}func testHandler(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; io.WriteString(w, "Heyyy!")}该命令openssl s_client https://localhost:50051/testapp/v1/order -connect localhost:50051向您确认您请求的端口上不存在 TLS很多评论确认 usinghttps不相关,再次在您的代码上未激活 TLScurl -H "Content-type:application/json" -X GET 'http://localhost:50051/testapp/v1/order'作品。再次确认 不使用 TLS结论:https当您的代码上未激活 TLS 时,不要尝试 curl
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go