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

时间:2016-03-04 04:55:21

标签: sockets go docker connection

我的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传出连接起作用?

2 个答案:

答案 0 :(得分:4)

您正在使用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可以在任何端口上建立传出连接。端口转发仅用于传入连接。请重新尝试,不要指定任何要转发的端口。我怀疑你是在尝试在传入(转发)端口上建立传出连接。

答案 1 :(得分:1)

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

重新启动容器,突然外向连接工作正常。容器是否有可能在docker更新中幸免于难?

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