docker - 尝试连接到在 docker 中运行的 mariadb
问题描述
我有一个在 docker 容器中运行的数据库。它不发布 mariadb 的 3306 端口。
现在我想远程登录 docker 主机,连接到容器并从我的笔记本电脑访问数据库
laptop ---> dockerhost ---> container
为了使用 DbVisualizer 等 gUI 工具访问数据库。
这个想法是打开与socat的连接,但我被卡住了。基本上是这样的:
socat TCP4-LISTEN:3306 EXEC:'ssh dockerhost sudo docker exec container "socat - TCP:localhost:3306"'
最后一次尝试以“查询期间遇到意外异常”失败。在 DbVisualizer 和 shell 中的“2019/09/10 12:19:54 socat[17462] E write(6, 0x7f9985803c00, 114): Broken pipe”中。
该命令是(为便于阅读而中断):
socat TCP4-LISTEN:3306,forever,reuseaddr,fork \
exec:'
ssh dockerhost \
sudo docker exec container "
socat STDIO TCP:localhost:3306,forever,reuseaddr,fork
"
'
我希望有人能指出我做错了什么或告诉我如何实现我的目标。
解决方案
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@...
并且不是与网络可访问服务交互的正常方式。
推荐阅读
- node.js - 72 小时后自动终止 PM2 Cron 作业?
- javascript - 表单根据插入的数据提交到特定的url
- ios - Flutter iOS 应用程序不适用于 xcode 模拟器 - 如何修复它?
- excel - Excel 相当于 Google 表格范围 A2:A
- javascript - 我们可以在firestore angular中监听特定的键值变化吗
- rust - 从 String Rust 中删除表情符号
- javascript - 当与其他数组数据一起推入状态数组时,按索引添加和删除项目 React
- node.js - 如何通过命令提示符同时使用 npm run watch 和 php artisan serve?
- gitlab - 在 CentOS 上启动 gitlab-runner 注册失败
- ssl-certificate - 仅在 webkit 中使用 Playwright 启动测试 e2e 时出错