【问题标题】:SSH Tunnel from Docker Container来自 Docker 容器的 SSH 隧道
【发布时间】:2020-07-13 15:21:42
【问题描述】:

我需要通过 SSH 隧道进入我的大学网络,以通过 MySQL 数据库处理项目(而不是实际在学校并使用网络)。

我可以使用以下说明(或通过 VSCode 远程资源管理器)访问服务器:

ssh -L 4444:abc.university.ca:443 login.university.ca

ssh -p 4444 'your_username'@localhost

他们会提示输入我的密码。

我还可以从 MySQL Workbench SSH 隧道连接到数据库。

但是我想在我的机器上进行本地开发。

我已经设置了一个带有 Apache PHP 服务器的 Docker 容器,因此我不必通过终端手动将我的文件复制到服务器。

Dockerfile

FROM php:7.2-apache
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
#get mysqli
RUN docker-php-ext-install mysqli
COPY src/ /var/www/html/

docker-compose.yml

version: "3.2"
services:
    web:
        build: php-apache
        container_name: php-apache-server
        ports:
          - "8080:80"

然后我尝试通过 connection.php 连接数据库

<?php 
/* DB Credentials */
$DB_SERVER = 'xxxxxxxxxxxx';
$DB_USERNAME = 'xxxxxxxxxx';
$DB_PASSWORD = 'xxxxxxxx';
$DB_NAME = 'xxxxxxxxx';
$PORT = xxxx;

/* Attempt to connect to MySQL database */
$link = mysqli_connect($DB_SERVER, $DB_USERNAME, $DB_PASSWORD, $DB_NAME);

// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

我的问题是当我通过终端建立 SSH 隧道时,Docker 容器中的应用程序无法连接到 MySQL 数据库。我得到:

PHP Warning:  mysqli_connect(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in /var/www/html/connection.php on line 11

我的问题是,如何从我的容器中打开 SSH 隧道,以便我的本地 apache-php 服务器可以连接到我学校网络上的数据库?

【问题讨论】:

标签: php mysql docker ssh


【解决方案1】:

好吧,我认为您可能更喜欢使用 VPN, 而不是“SSH 隧道”,但无论如何网络连接都将是环境的: 也就是说,“特定于宿主环境,而不是 Docker 幻觉。”

如果隧道暴露了一个特定的已知“主机 IP 地址”,那么 Docker 桥接网络将能够访问它。

【讨论】:

    【解决方案2】:

    为了帮助进行多跳和转发,在您的 .ssh/config 中

    host uni
       hostname login.university.ca
       user  some_user
    
    host abc
       hostname abc.university.ca
       port 443
       ProxyJump uni
       LocalForward localhost:3306 /var/lib/mysql/mysql.sock
    

    然后$DB_SERVER=127.0.0.1localhost 表示本地 unix 套接字到 mysql)从 docker 容器到端口 3306,以利用本地转发到远程服务器。

    .ssh/config 的其他配置提示以减少身份验证:

    ControlMaster auto
    ControlPath ~/.ssh/control-%r@%h:%p
    ControlPersist 600
    ServerAliveInterval 39
    

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 2014-03-01
      • 2018-11-18
      • 1970-01-01
      • 2019-04-14
      • 2020-10-28
      • 1970-01-01
      • 2016-10-01
      • 2020-10-16
      相关资源
      最近更新 更多