【问题标题】:Expose ssh tunnel to remote mysql server to other container?将远程 mysql 服务器的 ssh 隧道暴露给其他容器?
【发布时间】:2019-12-07 22:23:21
【问题描述】:

我想使用 Docker 进行本地 Web 开发,并为此遵循了不同的教程。我们只能通过 ssh 隧道访问 mysql 服务器。 我想把那部分放到一个特殊的容器中,只负责设置到 mysql 服务器的 ssh 隧道,然后其他容器可以连接到该容器,就好像它是本地 mysql 服务器一样。我认为这比通过 ssh 连接的每个容器本身更有意义。 或者这会是一个更好的主意吗?

我遇到了这个 Docker 镜像:https://hub.docker.com/r/dogstudio/remote-ssh,但无法让它为我工作,所以我自己尝试了。

到目前为止,我设法创建了一个 Docker 容器,并在它的 bash shell 中调用ssh user@example.com -4 -L 33306:127.0.0.1:3306 -N,然后能够通过mysql -h 127.0.0.1 -P 33306 -u user -p 连接到远程 mysql 服务器。

然后我进入另一个 Docker 容器 (php) 的 bash 并尝试调用 mysql -h ssh_mysql -P 33306 -u user -p。 不幸的是,我总是收到错误ERROR 2003 (HY000): Can't connect to MySQL server on 'ssh_mysql' (111 "Connection refused")

我尝试了很多,例如这里解释的内容:https://superuser.com/questions/588591/how-to-make-ssh-tunnel-open-to-public 但可能我做错了什么或误解了什么。

我的 docker-compose.yml:

version: "2.1"

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - "${PROJECT_ROOT}:/var/www/html:ro"
        networks:
            - server
        depends_on:
            - php

    php:
        build: ./php/
        expose:
            - 9000
        links:
            - ssh_mysql
        volumes:
            - "${PROJECT_ROOT}:/var/www/html"
            - "${SSH_FOLDER}:/root/.ssh"
        networks:
            - database
            - server
        depends_on:
            - ssh_mysql

    ssh_mysql:
        build: ./mysql/
        expose:
            - 33306
        networks:
            - database
        volumes:
            - "${SSH_FOLDER}/id_rsa:/root/.ssh"

volumes:
    data:

networks:
    database:
    server:

【问题讨论】:

  • “很遗憾,我无法从另一个容器连接到 mysql 服务器,我总是收到错误消息...”此时您正在运行什么实际命令,或者您具体在做什么哪个失败了?你得到什么具体的错误信息?您如何指定要连接的主机名和端口?
  • 对于任何对这个问题感兴趣的人:似乎用ssh user@host -4 -L 3307:0.0.0.0:3306 -N -g0.0.0.00.0.0.0-g 标志)打开ssh隧道会有所不同......然后我能够从其他容器调用mysql -h "IP-address of container" -u mysql_user -p -P 3307

标签: mysql docker ssh ssh-tunnel


【解决方案1】:

好像用

打开ssh隧道
ssh user@host -4 -L 3307:0.0.0.0:3306 -N -g

(尤其是-g 标志)

与众不同...

然后我可以通过调用另一个容器的 SSH 隧道访问远程服务器上的 MySQL 数据库:

$ mysql -h ssh_mysql -u mysql_user -p -P 3307

【讨论】:

    【解决方案2】:

    所以您的问题是您将 SSH 隧道绑定到 127.0.0.1 所以到 localhost 并且 localhost 仅适用于具有 SSH 隧道的容器,因此您可以从该容器内访问隧道,但不能从其他容器访问。

    要解决此问题,您应该执行本文中所述的操作:Can I get ip address inside my docker container?

    类似

    ssh user@example.com -4 -L 33306:$(awk 'END{print $1}' /etc/hosts):3306 -N
    

    应该做的工作。

    【讨论】:

    • 感谢您的回复。不幸的是,如果我这样做,甚至无法从同一个容器(现在到达那里ERROR 2002 (HY000): Can't connect to MySQL server on '192.168.16.3' (115))或另一个容器(仍然收到错误"Connection refused",如上所述)连接到远程mysql服务器......
    猜你喜欢
    • 2016-02-13
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2014-12-13
    • 2013-08-24
    • 2014-05-03
    相关资源
    最近更新 更多