尝试连接到在docker中运行的mariadb

时间:2019-09-10 10:32:09

标签: docker socat

我有一个在docker容器中运行的数据库。它不会发布mariadb的端口3306。

现在我想远程登录Docker主机,连接到容器并从我的笔记本电脑访问数据库

laptop ---> dockerhost ---> container

以使用gUI工具(如DbVisualizer)访问数据库。

这个想法是要打开一个与socat的连接,但是我被卡住了。基本上像这样:

socat TCP4-LISTEN:3306 EXEC:'ssh dockerhost sudo docker exec container "socat - TCP:localhost:3306"'

最后一次尝试失败,并显示“查询期间遇到意外异常”。在DbVisualizer中显示,并在外壳程序中显示“ 2019/09/10 12:19:54 socat [17462] E write(6,0x7f9985803c00,114):管道损坏”。

该命令(为便于阅读而中断):

socat TCP4-LISTEN:3306,forever,reuseaddr,fork \
exec:'
    ssh dockerhost \
        sudo docker exec container "
            socat STDIO TCP:localhost:3306,forever,reuseaddr,fork
        "
'

我希望有人可以指出我做错了什么,或者告诉我如何实现自己的目标。

1 个答案:

答案 0 :(得分:1)

使用docker run -p或Docker Compose ports:选项删除并重新启动容器,以使其在Docker空间之外可见。 (您正在将实际的数据库数据存储在一个卷中,对吗?重新启动后,它将继续使用该卷中的数据。)

如果您对直接从脱离主机访问的容器感到满意,则可以使用普通端口调用-p 3306:3306,然后使用dockerhost作为主机名和第一个端口来访问它数字作为端口号。

如果仍然需要ssh隧道,则可以将端口绑定到Docker主机的localhost接口,然后使用ssh端口转发。

dockerhost$ docker run -p 127.0.0.1:3306:3306 -v ... mysql
laptop$ ssh -L 3306:localhost:3306 dockerhost
laptop$ mysql -h 127.0.0.1

docker exec在许多方面与ssh root@...等效,并且不是与网络可访问服务进行交互的常规方式。