如何通过 SSH 连接到 MySQL Docker 容器?
Posted
技术标签:
【中文标题】如何通过 SSH 连接到 MySQL Docker 容器?【英文标题】:How to connect to a MySQL Docker Container via SSH? 【发布时间】:2017-06-30 11:07:11 【问题描述】:当我尝试通过 SSH 隧道连接到主机 Mashine (vServer),然后尝试通过内部 docker Container-IP 连接时,我无法连接到 mysql。
这是我的 docker-compose 文件。
version: '2'
services:
mysql:
build: ./mysql
environment:
MYSQL_ROOT_PASSWORD: test
volumes:
- ./db:/var/lib/mysql
我找到的唯一解决方案是将 mysql 容器的 MySQL-Port 转发到 Host-Mashine。
version: '2'
services:
mysql:
build: ./mysql
environment:
MYSQL_ROOT_PASSWORD: test
volumes:
- ./db:/var/lib/mysql
ports:
- 3306:3306
然后我可以通过主机 IP 连接到 MySQL,但这没有 SSH,它直接通过 TCP 和端口。 将 MySQL 服务引入 Internet 对我来说是不行的。
可以在这里找到原因https://security.stackexchange.com/questions/63881/is-it-not-safe-to-open-mysqls-port-to-the-internet 为什么将 mysql 端口接入互联网不是一个好习惯。
那么使用 SSH 连接到我的 docker mysql 容器但保持 mysql 端口关闭的好习惯是什么?
【问题讨论】:
【参考方案1】:一种简单的方法是将 MySQL 端口仅绑定到 localhost 地址。这假设主机在 Docker 之外有一个可用的 mysql 客户端。
ports:
- 127.0.0.1:3306:3306
您也可以完全省略 ports
部分(根本没有端口绑定),并使用容器内已经存在的 mysql 客户端。
docker-compose exec mysql bash
然后在容器内运行mysql
命令来做任何你想做的查询。
【讨论】:
第一个建议为我解决了这个问题,现在我可以通过 SSH 通过 HeidiSQL 连接到我的 MySQL 容器,而无需付出太多努力。您的第二个建议适用于小事情,但我喜欢我的 GUI HeidiSQL。【参考方案2】:实现此目的的一种简单方法是将 docker conatiner 的 ssh 端口转发到主机上的某个端口,即
ports:
- 22:<some free host port>
然后通过 ssh 访问容器到您使用的主机端口。请注意,使用端口 22 是个坏主意,因为这会导致与您主机上运行的 ssh 服务器发生冲突。
【讨论】:
这也是一个很好的答案,但目前对于我的目的来说有点矫枉过正。然后我必须对 ssh 服务进行 dockerize 并使其可供其他容器访问。起初我会坚持 Dan Lowe 的回答,但当项目变得更大时,你的回答可能就是要走的路。 不需要 dockerize ssh。您可以通过ssh localhost:<some free port>
简单地访问容器
@TobiasGuggenmos 仅当 sshd 服务器在容器内侦听时,在大多数容器中并非如此。以上是关于如何通过 SSH 连接到 MySQL Docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)
使用 Java 通过 SSH 连接到远程 MySQL 数据库