将 ssh 隧道暴露到远程 mysql 服务器到其他容器?

Expose ssh tunnel to remote mysql server to other container?

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

我遇到了这个 Docker-image: 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 服务器通过 mysql -h 127.0.0.1 -P 33306 -u user -p.

然后我进入另一个 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:

所以你的问题是你将 SSH 隧道绑定到 127.0.0.1 所以到 localhost 并且 localhost 只适用于带有 SSH 隧道的那个容器所以你可以从那个容器而不是其他容器到达隧道。

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

所以像

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

应该完成这项工作。

好像是用

打开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