将特定端口上的 Docker 容器的连接转发到主机上的本地接口

将特定端口上的 Docker 容器的连接转发到主机上的本地接口

我正在尝试在云提供商的容器中运行服务。我希望容器化应用程序能够通过本地 LDAP 服务器进行身份验证,该服务器(当前)可通过 SSH 隧道连接到云。该隧道在 上的 docker 主机上可用127.0.0.1:6636

是否可以让容器访问127.0.0.1:6636主机,例如通过某种代理或 iptables 配置?

GatewayPorts=yes如果我在主机中设置sshd_config并将docker run --add-host主机的docker0IP 添加到/etc/hosts容器中,我可以让隧道工作,但这意味着隧道在所有接口上都可用。我大概可以将对隧道的访问锁定到docker0接口,但我宁愿隧道仅在环回接口上。

我不想使用--net=host,因为我希望能够使用容器链接。

Cloud                    |
                         |
+------------------+     |      +--------+     +----------+
| Host      Tunnel |     |      | Tunnel |     |   Tunnel |
|                O-------------------------------O Target |
| +-----------+  | |     |      |  Host  |     +----------+
| | Container |--+ |     |      +--------+
| +-----------+    |     |
+------------------+     |      Premises
                         |

答案1

您可以将主机的 docker0 接口的 IP 作为环境变量传入并连接到 LDAP 服务器。例如,在主机上:

$ ip addr show docker0
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.1.42.1/16 scope global docker0
   valid_lft forever preferred_lft forever
inet6 fe80::60e4:ffff:fe97:1308/64 scope link 
   valid_lft forever preferred_lft forever
$ DOCKERADDR=$(ip addr show docker0 | grep inet\ | awk '{print $2}' | cut -d/ -f1)
$ docker run -it -e DOCKERADDR=${DOCKERADDR} image 

在容器内部,您可以连接到 ${DOCKERADDR}:6636

注意:在 coreos 上,如果你. /etc/environmentCOREOS_PUBLIC_IPV4并且COREOS_PRIVATE_IPV4

相关内容