docker从容器连接到主机隧道

Posted

技术标签:

【中文标题】docker从容器连接到主机隧道【英文标题】:docker connecting to host tunnel from container 【发布时间】:2017-04-08 12:31:08 【问题描述】:

我想从我的 docker 容器内部与一个在主机中使用隧道的 postgres db 连接。在主机中,我有一个指向数据库主机的隧道:

host$ sudo netstat -tulpen  | grep 555
tcp        0      0 127.0.0.1:5555          0.0.0.0:*               LISTEN      1000       535901      18361/ssh       
tcp6       0      0 ::1:5555                :::*                    LISTEN      1000       535900      18361/ssh       

隧道设置为:

host$ ps -aux | grep 18361
ubuntu    9619  0.0  0.0  10432   628 pts/0    S+   10:11   0:00 grep --color=auto 18361
ubuntu   18361  0.0  0.0  46652  1420 ?        Ss   Nov16   0:00 ssh -i /home/ubuntu/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -f -N -L 5555:localhost:5432 user@remotehost

我可以从主机启动 psql 命令:

host$ psql -h localhost -p 5555 --username user db_name
psql (9.3.15, server 9.5.4)
SSL connection (cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
db_name=# 

当我使用网络模式 BRIDGE [我不能使用 HOST 因为 docker 没有正确地将容器端口暴露给主机请参阅:https://github.com/docker/compose/issues/3442] 我读到了我必须使用容器ip:

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:6c:01:5c:a5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:6cff:fe01:5ca5/64 scope link 

在这种情况下是 172.17.0.1

但是当我进入容器时:

host$ docker exec -ti container_name  /bin/bash

我尝试连接我有:

container# psql -h 172.17.0.1 -p 5555                                                                                                                                                                                              
psql: could not connect to server: Connection refused
    Is the server running on host "172.17.0.1" and accepting
    TCP/IP connections on port 5555?

我错过了什么?

【问题讨论】:

【参考方案1】:

您错过了 bind_address,所以现在您的绑定地址是 127.0.0.1。 设置你的隧道,你必须添加 bind_address 参数。

-L [bind_address:]port:host:hostport

例如

sudo ssh -f -N -L 172.17.0.1:5555:localhost:5432 user@remotehost

【讨论】:

当我尝试绑定我的容器 ip (172.18.0.1) 我收到以下错误bind [172.18.0.1]:4000: Can't assign requested address channel_setup_fwd_listener_tcpip: cannot listen to port: 4000 Could not request local forwarding. 似乎另一个进程正在侦听该端口。如果没有进程在监听,请查看有关任何 LocalForward 或 AllowTcpForwarding 指令的 ssh 配置文件 谢谢。我应该提到这是在macos上。我让它在 Ubuntu 中工作得很好。如果我不指定 172.18.0.1,则转发适用于 macos。当我回到 mac 前时,我会使用 forward 选项调整 ssh 配置并报告。 从阅读 AllowTcpForwarding 开始,这需要在我连接的服务器上启用。这是启用的,因为如果我不指定要绑定的地址,我可以让端口转发正常工作。

以上是关于docker从容器连接到主机隧道的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker windows 容器中的 asp.net 核心应用程序连接到主机数据库

尝试从主机连接到 mysql docker 容器时出现“读取初始通信数据包”错误

在 AWS ELB 上运行 Docker 容器,连接到主机节点应用程序

从 docker 容器连接到主机 mongodb

无法从我的 Docker 容器内部连接到主机的 localhost

从主机连接到 docker 容器中的 mysql