如何通过 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:&lt;some free port&gt; 简单地访问容器 @TobiasGuggenmos 仅当 sshd 服务器在容器内侦听时,在大多数容器中并非如此。

以上是关于如何通过 SSH 连接到 MySQL Docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)

如何连接到远程机器上的 docker mysql 容器

使用 Java 通过 SSH 连接到远程 MySQL 数据库

Spring Cloud Config Server 无法通过 Docker 中的 ssh 连接到 git

使用 SSH.NET 库通过 SSH 连接到 MySQL

通过ssh隧道连接到MySQL到localhost