如何通过SSH连接到MySQL Docker容器?

17

当我尝试通过SSH隧道连接到主机机器(vServer),然后尝试通过内部Docker容器IP连接时,我无法连接到MySQL。

这是我的docker-compose文件。

version: '2'
services:
  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: test
    volumes:
      - ./db:/var/lib/mysql

我找到的唯一解决方案是将mysql容器的MySQL端口转发到主机上。

version: '2'
services:
  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: test
    volumes:
      - ./db:/var/lib/mysql
   ports:
     - 3306:3306

然后我能够通过主机IP直接通过TCP和端口连接MySQL,但这是没有使用SSH的。对我来说,这是一个不可行的方案,因为我不想将MySQL服务暴露在互联网上。

这里有一些原因说明为什么将MySQL端口暴露在互联网上不是一个好的做法。


那么,如何连接到我的Docker MySQL容器,并保持MySQL端口关闭是一个好的实践呢?

2个回答

23

一种简单的方法是仅将MySQL端口绑定到本地主机地址。这假设主机在Docker之外有一个可用的mysql客户端。

ports:
  - 127.0.0.1:3306:3306

您也可以完全省略 ports 部分(不进行任何端口绑定),并使用容器内已经存在的 mysql 客户端。

docker-compose exec mysql bash

然后在容器内运行mysql命令,执行您想要执行的任何查询操作。


1
第一条建议对我有用,现在我可以轻松地通过SSH连接到我的MySQL容器中的HeidiSQL。您的第二个建议适合小事情,但我喜欢我的GUI HeidiSQL。 - TatzyXY

3

一种简单的实现方法是将docker容器的ssh端口转发到主机上的某个端口,例如:

ports:
   - 22:<some free host port>

然后通过ssh访问容器,使用您使用的主机端口。请注意,使用端口22是一个不好的主意,因为这会与运行在您的主机上的ssh服务器发生冲突。


这也是一个很好的答案,但对于我目前的目的来说有点过度。然后我必须将ssh服务docker化并使其可访问其他容器。起初,我会采用Dan Lowe的答案,但当项目变得更大时,您的答案可能是正确的选择。 - TatzyXY
不需要将ssh加入到Docker容器中。您只需通过ssh localhost:<某个空闲端口>访问容器即可。 - Tobias Guggenmos
3
只有在容器内部监听sshd服务器的情况下,才能使用它,但大多数容器并非如此。 - Dan Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接