我正在运行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端口的隧道。下面是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隧道,即使我使用的是主机网络(我也不确定它实际上是做什么的)。
有人知道我哪里做错了吗?
1条答案
按热度按时间q9yhzks01#
您需要更改服务配置,以表明
您的配置创建了一个名为
host
的合成网络,但它不是“主机网络”。您可以使用不同的方法连接到ssh隧道;特别是,如果你在MacOS或Windows主机上,主机网络就不起作用了(你连接到一个隐藏的Linux VM的“主机网络”),你需要使用特殊的
host.docker.internal
主机名而不是localhost
。为此,你根本不需要任何特殊的networks:
或network_mode:
选项。您可能需要更改ssh隧道侦听器的设置,
127.0.0.1:3306
设置绑定到主机的localhost接口,但至少在本机Linux上,请求实际上是从docker0
接口到达的。将隧道侦听器设置为侦听0.0.0.0:3306
将解决此问题,但也将允许网络上的其他人连接到转发的数据库。这不是一个简单的解决方案。