我正在尝试使用docker-proxy添加端口转发到docker容器,但遇到此错误,
以下是详细信息,
IP 172.17.0.2的容器已在运行--net = none。我们提供自己的网络而不使用docker0网络。
现在我们想要将一些容器端口暴露给主机,所以想到尝试使用docker-proxy。
我们执行了以下命令,
$ docker-proxy -container-ip 172.17.0.2 -container-port 8000 -host-ip 0.0.0.0 -host-port 8000 -proto tcp
and we are getting,
2017/03/16 10:02:30 Stopping proxy on tcp/[::]:8001 for tcp/172.17.0.2:8001 (accept tcp [::]:8001: accept4: bad file descriptor)
Docker版本:Docker版本17.03.0-ce,build 60ccb22
答案 0 :(得分:1)
我认为除了停止容器,将其删除然后再从Dockerfile开始运行,或者只是通过添加-p 8000:8000来运行docker之外,没有其他方法可以执行此操作。 Docker似乎并没有让您直接修改docker-proxy,您必须使用标准命令。
您还可以通过直接更改iptables(即NAT表中的DOCKER链和过滤器中的DOCKER链)来手动将端口公开给外部访问。 例如:
iptables -t nat -A DOCKER ! -i your_bridge0 -p tcp -m tcp --dport 8000 -j DNAT --to-destination 172.17.0.2:8000
并且:
iptables -A DOCKER ! -i your_bridge0 -o your_bridge0 -d 172.17.0.2 -p tcp --m tcp --dport 80 -j ACCEPT
当然,您必须确保规则会坚持下去,这完全是一个完全不同的问题。 Docker似乎并不在乎谁来管理iptables(ufw,firewalld等)。
这将起作用,即使docker proxy根本没有运行。 docker-proxy绑定到主机的端口,这意味着您可以控制过滤器表中的INPUT链上的流量(即主机本身)。 我仍然没有弄清楚为什么使用这种方式构建docker,但是默认情况下,如果您公开一个容器(使用-p),然后删除DNAT规则,它将仍然有效,因为请求将要按INPUT键。直接连锁。令人难以置信,但没关系。