通过 Docker (PhpMyAdmin) 使用本地 SSH 隧道 - 连接被拒绝

Using local SSH tunneling with Docker (PhpMyAdmin) - Connection refused

我是 运行 PhpMyAdmin,在我的本地计算机上使用 Docker 和 docker-compose。在远程服务器上,我使用的是 mysql 只能从本地主机访问的用户,这就是我需要 ssh 隧道的原因。

version: '3.1'

services:
  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
    volumes:
      - /usr/local/etc/php/php.ini:/php-make/upload.ini
      - ./config.inc.php:/etc/phpmyadmin/config.inc.php
    networks:
      - host

networks:
  host:

由于我使用的是主机网络,docker 容器应该知道本地端口转发(对此不太确定,但我在网上找不到太多关于主机网络实际工作方式的信息) .

SSH 配置

host remote-server-name
    HostName remote-server-ip
    User user
    IdentityFile path-to-ssh-key
    ForwardAgent yes
    LocalForward 3306 127.0.0.1:3306

在我通过 ssh 连接到远程服务器后,我本地计算机上的端口 3306 上应该有一个隧道指向远程服务器上的 3306。这是 netstat -tulpn 以确认:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      17506/ssh

PhpMyAdmin 的服务器选择配置 (phpmyadmin.config.inc)

$cfg['Servers'][$i]['verbose'] = 'remote-server-name';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['LoginCookieValidity'] = 24*60*60*30;

在服务器选择中选择远程服务器名称后,我收到以下消息

mysqli::real_connect(): (HY000/2002): Connection refused

这意味着 mysql 用户不允许从给定的 ip 地址访问(在本例中是我的 public ip),我想那是因为 docker 容器没有使用 ssh 隧道从我的本地机器,即使我正在使用主机网络(我又不确定它实际上做了什么)。

有人知道我做错了什么吗?

您需要将服务配置更改为 say

services:
  phpmyadmin:
    network_mode: host
    # and not networks:

您的配置创建了一个名为 host 的 Compose 网络,但它不是“主机网络”。


您可以使用不同的方法连接到 ssh 隧道;另见 From inside of a Docker container, how do I connect to the localhost of the machine?。特别是,如果您使用的是 MacOS 或 Windows 主机,则主机网络无法正常工作(您连接到隐藏的 Linux VM 的“主机网络”)并且您需要使用特殊的 host.docker.internal 主机名而不是 localhost。为此,您根本不需要任何特殊的 networks:network_mode: 选项。

您可能需要更改 ssh 隧道侦听器的设置才能使其正常工作。 127.0.0.1:3306 设置绑定到主机的本地主机接口,但至少在本机 Linux 上,请求实际上会从 docker0 接口到达。将隧道侦听器设置为侦听 0.0.0.0:3306 将解决此问题,但也会允许网络上的其他人连接到转发的数据库。对此没有简单的解决方案。