我正在尝试使用docker-proxy向Docker容器添加端口转发,但遇到以下错误,
以下是详细信息,
- IP为www.example.com的容器172.17.0.2已经在使用--net=none运行。我们提供自己的网络,不使用docker 0网络。
- 现在我们想向主机公开容器的一些端口,所以考虑尝试docker-agent。
- 我们执行以下命令,
$ 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,构建版本60 ccb 22
2条答案
按热度按时间k2arahey1#
我不认为有任何其他的方法来做到这一点,但停止容器,删除它,然后再次运行它从一个Docker文件开始或简单地与docker运行添加-p 8000:8000。Docker似乎不允许您修补与docker-proxy直接,您必须使用标准命令。
您也可以通过直接修改iptables,即NAT表中的DOCKER chain和filter中的DOCKER chain,手动将端口暴露给外部访问。
以及:
当然,你必须确保这些规则能被遵守,这是一个完全不同的问题,Docker似乎并不太关心谁来管理iptables(ufw,firewalld等)。
即使docker-proxy根本没有运行,这也会起作用。docker-proxy绑定到主机的端口,这意味着您可以控制filter表中INPUT链上的流量(主机本身也是如此)。我仍然不明白为什么Docker是这样构建的,但是默认情况下,如果你公开一个容器(使用-p),然后删除DNAT规则,它仍然可以工作,因为请求将直接命中INPUT链,这令人难以置信,但没关系。
0yycz8jy2#
这docker-proxy二进制文件不能被调用dockerd外直接,如果你想调用它外无论如何,尝试看看moby源代码的关键代码在这里
有一个例子
并在主包中调用它,如:
}