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



我使用Docker在我的本地机器上使用Docker -compose运行PhpMyAdmin。在远程服务器上,我使用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;

在服务器选择中选择remote-server-name后,我得到以下消息

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

这意味着mysql用户不允许从给定的IP地址访问(在这种情况下我的公共IP),我想这是因为docker容器不使用SSH隧道从我的本地机器,即使我使用主机网络(这再次我不确定它实际上做什么)。

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

你需要改变你的服务配置,说

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

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


您可以使用不同的方法连接到ssh隧道;参见从Docker容器内部,我如何连接到机器的本地主机?特别是,如果你使用的是MacOS或Windows主机,主机网络就无法工作(你连接到"主机网络")。隐藏的Linux虚拟机),您需要使用特殊的host.docker.internal主机名而不是localhost。为此,您根本不需要任何特殊的networks:network_mode:选项。

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

最新更新