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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Docker容器建立TCP传出连接?相关的知识,希望对你有一定的参考价值。

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

从主机运行时它工作正常:

enter image description here

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

enter image description here

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

注意2:除了docker-machine的默认VM附带的默认设置之外,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"]

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

如何使TCP传出连接起作用?

答案

您正在使用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后幸存下来吗?

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

以上是关于如何使用Docker容器建立TCP传出连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS Beanstalk 和 Spring Cloud Netflix 在 Docker 容器之间建立连接

docker weave网络

Docker使用Link在容器之间建立连接

Docker使用link建立容器之间的连接

Docker在高负载下阻止传出连接?

Erlang 建立TCP连接后,怎么样从返回的Socket获取客户端ip和端口