通过 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
将解决此问题,但也会允许网络上的其他人连接到转发的数据库。对此没有简单的解决方案。
我是 运行 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
将解决此问题,但也会允许网络上的其他人连接到转发的数据库。对此没有简单的解决方案。