如何使用Docker容器进行TCP传出连接?

My Go应用程序通过tls.Dial()来交换数据,从而实现TLS连接 。

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

在这里输入图像说明

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

在这里输入图像说明

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

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

使用Dockerfile构buildDocker镜像:

 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机

我怎样才能使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,看看这个post: https : //github.com/docker/machine/issues/710

我现在看到你正在使用docker机,所以关于docker机的post应该回答你的问题。

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