我正在尝试使用 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)
Run Code Online (Sandbox Code Playgroud)Docker 版本:Docker 版本 17.03.0-ce,构建 60ccb22
我不认为有任何其他方法可以做到这一点,除了停止容器,删除它,然后从 Dockerfile 开始再次运行它,或者通过添加 -p 8000:8000 简单地使用 docker run 来运行它。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
Run Code Online (Sandbox Code Playgroud)
和:
iptables -A DOCKER ! -i your_bridge0 -o your_bridge0 -d 172.17.0.2 -p tcp --m tcp --dport 80 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
当然,你必须确保规则得到遵守,这完全是一个不同的问题。Docker 似乎不太关心谁管理 iptables(ufw、firewalld 等)。
即使 docker proxy 根本没有运行,这也会起作用。docker-proxy 绑定到主机的端口,这意味着您可以控制过滤器表中 INPUT 链上的流量(因此主机本身)。我仍然没有弄清楚为什么 docker 是这样构建的,但是默认情况下,如果你公开一个容器(使用 -p)然后删除 DNAT 规则,它仍然会工作,因为请求将命中 INPUT直接上链。这令人难以置信,但没关系。
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |