【问题标题】:How to make a TCP outgoing connection with Docker container?如何与 Docker 容器建立 TCP 传出连接?
【发布时间】:2016-03-04 04:55:20
【问题描述】:

我的 Go 应用程序使TLS connections via tls.Dial() 交换数据。

从主机运行时效果很好:

但是当应用程序从 Docker 容器运行时,传出连接似乎不起作用。应用无限期挂起。

注意 1:与使用 docker run -p $(docker-machine ip):2500:2500 ... 的行为相同

注意 2:VM 没有额外的端口转发设置,除了 docker-machine 的默认 VM 附带的默认设置。

使用 Dockerfile 构建 Docker 映像:

FROM golang:latest

RUN mkdir -p "$GOPATH/src/path/to/app"
# Install dependencies
RUN go get github.com/path/to/dep

VOLUME "$GOPATH/src/path/to/app"
EXPOSE 2500
WORKDIR "$GOPATH/src/path/to/app"
CMD ["go", "run", "main.go"]

主机是运行 docker-machine 的 OS X。

问题

如何使 TCP 传出连接正常工作?

【问题讨论】:

  • What are the requirements to set up a container for TLS connections? 与常规主机要求相同。

标签: sockets go docker connection


【解决方案1】:

您正在使用 boot2docker 或 docker-machine(因为您在 OSX 上运行 docker)。如果您使用的是 boot2docker,则必须在 VirtualBox 和 docker 上转发端口,请查看此博客文章: https://fogstack.wordpress.com/2014/02/09/docker-on-osx-port-forwarding/

如果你使用 docker-machine,你必须连接到 docker-machine 分配的 ip,而不是 localhost,看看这个帖子: https://github.com/docker/machine/issues/710

我现在看到您专门使用 docker-machine,所以关于 docker-machine 的帖子应该可以回答您的问题。

编辑:我误解了这个问题。您正在尝试在转发端口上建立传出连接。这是不正确的。默认情况下,docker 可以在任何端口上建立传出连接。端口转发仅用于传入连接。请在不指定任何要转发的端口的情况下重试。我怀疑您正试图在传入(转发)端口上建立传出连接。

【讨论】:

  • 您的第二个链接在一定程度上很有帮助。我有另一个网络应用程序(即服务器)可以工作。我怎样才能让它在作为客户端的应用程序(我在这个问题中提到的应用程序)上工作?在有问题的应用程序中,我尝试了docker run -p $(docker-machine ip):2000:2000 -v $GOPATH/src/path/to/app:/go/src/path/to/app myContainer,但没有成功。
  • 请看我上面的编辑。我的假设可能完全错误。让我知道它是否有所作为。如果没有,我会尝试重新创建我的情况。
  • 我还没有设置端口转发。你是对的,我正在尝试建立一个 TCP 传出连接。
  • 我根据这个答案的输入,用更多信息更新了这个问题。
  • 您在哪个端口上尝试传出连接?
【解决方案2】:

我刚刚遇到了同样的问题。根本无法连接。

重新启动容器,突然传出连接工作正常。容器有可能在 docker 更新后幸存下来?

当前使用 Docker 版本 18.09.3,构建 774a1f4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2010-11-03
    • 1970-01-01
    • 2012-11-11
    • 2018-11-25
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多