我有一个在容器中运行的 Mariadb 数据库,在服务器计算机中运行(我们称其 IP 地址为“DB”)
在另一台服务器(我们将其IP地址称为“APP”)中,应用程序正在另一个容器中运行。该应用程序需要访问数据库,但我想通过 SSH 隧道而不是 3306 端口来执行此操作。
我对隧道不熟悉,所以,从APP机器上运行的容器中的shell中,我尝试了:
ssh -f user@DB -L 1234:127.0.0.1:3306 -N -p 5678 -4
(5678是数据库机器的SSH端口,我可以在这个端口上成功ssh到这台机器。并且隧道显然已成功建立)
然后我尝试:
mariadb -h localhost -P 1234 -u dbuser -p
但我收到此错误:
ERROR 2013 (HY000): Lost connection to server at 'handshake: reading initial communication packet', system error: 11
但是,直接连接到数据库可以正常工作:
mariadb -h DB -u dbuser -p
你能帮我解决这个问题吗?
我尝试做的隧道是保护数据库访问安全的正确方法吗?
附加信息:在数据库机器上,数据库容器的3306端口映射为:
docker run -v [DB]:3306:3306 ...
非常感谢!
我发现了问题:docker run 的 -v 选项不正确:它必须是 127.0.0.1 而不是 [DB],以便让主机访问其托管容器的 3306 端口。