我正在嘗試從 Docker 容器連接到在 Go 中創建的 HTTPS 會話,當我在本地運行它時它作業正常,但是一旦我嘗試在容器中運行它,我就無法訪問該 URL。
func main() {
// I'm using Go-Chi V5
r := chi.NewRouter()
// TLS connection. Inspired from https://blog.cloudflare.com/exposing-go-on-the-internet
tlsConfig := &tls.Config{
PreferServerCipherSuites: true,
CurvePreferences: []tls.CurveID{
tls.CurveP256,
tls.X25519,
},
MinVersion: tls.VersionTLS12,
CipherSuites: []uint16{
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
},
}
srv := &http.Server{
Addr: "localhost:9090",
ReadTimeout: 5 * time.Second,
WriteTimeout: 20 * time.Second,
IdleTimeout: 200 * time.Second,
TLSConfig: tlsConfig,
Handler: r,
}
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
})
err := srv.ListenAndServeTLS("./.dev/localhost.crt", "./.dev/localhost.key")
if err != nil {
log.Fatalf("server failed to start: %v", err)
}
}
我的 Dockerfile:
FROM golang:1.17-buster AS build
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY ./.dev/localhost.key .
COPY ./.dev/localhost.crt .
COPY . .
RUN go build -o /dev-admin ./cmd/admin
##
## Deploy
##
FROM gcr.io/distroless/base-debian10
WORKDIR /
COPY --from=build /dev-admin /dev-admin
COPY --from=build ./app/localhost.key ./.dev/localhost.key
COPY --from=build ./app/localhost.crt ./.dev/localhost.crt
EXPOSE 9090
EXPOSE 443
ENTRYPOINT ["/dev-admin"]
docker-compose.yml:
version: '3.9'
services:
web:
image: api_test
build: .
ports:
- '9090:9090'
volumes:
- .:/app
$ curl https://localhost:9090
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to localhost:9090
當我嘗試正常的 HTTP 版本時,容器作業正常,所以只有 HTTPS 被阻塞,我無法弄清楚它是什么。
uj5u.com熱心網友回復:
您正在定義中指定要偵聽的地址Server:
srv := &http.Server{
Addr: "localhost:9090",
...
將此更改為:
srv := &http.Server{
Addr: ":9090",
...
需要進行此更改的原因是地址“指定了服務器偵聽的 TCP 地址”。當您指定localhost:9090要系結到容器內的環回介面時,在大多數情況下,這是無法從外部訪問的(有關更多資訊,請參閱此問題)。
uj5u.com熱心網友回復:
問題似乎出在您的 docker-compose.yaml 中。您只轉發埠 9090。盡管 SSL 需要 443。
像這樣,它應該作業:
version: '3.9'
services:
web:
image: api_test
build: .
ports:
- '9090:9090'
- '443:443'
volumes:
- .:/app
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400790.html
