【问题标题】:dial tcp 127.0.0.1:8000: connect: connection refused golang docker containers拨打 tcp 127.0.0.1:8000:连接:连接被拒绝 golang docker 容器
【发布时间】:2020-12-31 13:21:15
【问题描述】:

我正在尝试使用 GO 从一个项目向另一个项目发出 http 请求。发出请求的项目具有以下 dockerfile:

FROM golang:alpine as builder
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o main .
FROM scratch
WORKDIR /app
COPY --from=builder /build .
CMD ["./main"]

正在等待请求的项目正在 localhost:8000 上运行,它具有以下 dockerfile:

FROM golang:1.13.8 AS build-env
ADD . /dockerdev
WORKDIR /dockerdev
RUN go get -d -v ./...
RUN go build -o /server
# Final stage
FROM debian:buster
EXPOSE 8000
WORKDIR /
COPY --from=build-env /server /
CMD ["/server"]

当我制作时

resp, err := http.Post("http://localhost:8000/orders", "application/json", bytes.NewBuffer(requestBody))

它给了我以下错误

拨号 tcp 127.0.0.1:8000:连接:连接被拒绝

我是 docker 新手,欢迎任何改进!

【问题讨论】:

  • 第二个 docker 容器中的 127.0.0.1 localhost 只会指向容器本身,而不是主机本身。删除主机名并列出端口,即:8000,并确保将端口传递到主机操作系统。
  • 对不起,我没听懂……
  • Docker 容器有独立的网络栈。出于所有意图和目的,您可以在这方面将它们视为不同的计算机。因此,一个容器中的 localhost 与另一个容器中的 localhost 是不同的网络接口。见docs.docker.com/network/network-tutorial-standalone。
  • 您可以创建自己的网络并连接这两个容器,也可以使用--link 选项。使用docker inspect <name-of-container> 检查配置并检查网络。它应该具有相同的网关。
  • docker-compose 是一种用于编排多个 docker 容器并链接它们的网络的有用技术。

标签: docker go dockerfile


【解决方案1】:

扩展我的评论。您的客户端代码的网络地址将不起作用:

resp, err := http.Post("http://localhost:8000/orders", "application/json", bytes.NewBuffer(requestBody)) // broken

因为它实际上是在自言自语(localhost 指的是 client docker 容器 - 不是 主机操作系统)。


为了测试目的,将这两个容器暴露给您的主机操作系统的最快方法如下:

docker run -it --rm -p 8000:8000 dockweb  # server container
docker run -it --rm --net host dockcli    # client container

除了琐碎的测试之外,这很快就会变得笨拙。所以我建议使用docker-compose 之类的东西,它可以让您轻松链接容器及其网络。

【讨论】:

  • 2020/09/13 18:24:47 发布“http://:8000/orders”:拨号 tcp :8000:连接:连接被拒绝
  • @fbarril 更新了答案,提供了一些短期和长期建议。
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2019-12-12
  • 2018-12-26
  • 2019-12-25
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多