如何与 Docker 容器建立 TCP 传出连接?

How to make a TCP outgoing connection with Docker container?

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

主机 运行 时工作正常:

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

注 1:与使用 docker run -p $(docker-machine ip):2500:2500 ...

的行为相同

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

Docker 使用 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"]

主机是OS X 运行ning docker-machine.

问题

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

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

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

我现在看到您正在使用 docker-machine,因此关于 docker-machine 的 post 应该可以回答您的问题。

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

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

重新启动容器,突然传出连接正常。容器有可能在 docker?

的更新后幸存下来

当前使用 Docker 版本 18.09.3,内部版本 774a1f4