容器方式安装 PhpMyAdmin 并访问宿主机数据库

以前以容器的方式安装过 PhpMyAdmin,但这次安装又出问题了,所以还是简单记录一下。

协议不一致

通过 nginx 代理访问 PhpMyAdmin 需要配置 PMA_ABSOLUTE_URI 这个环境变量,值为 nginx 那边设置的域名。否则网页登录的时候会报“服务器和客户端上指示的HTTPS之间不匹配……”这样的错误。

另外,nginx 也需要设置,否则登录之后 502 之类的。

location /
{
   proxy_pass http://127.0.0.1:9800/;
   proxy_set_header Host $http_host;
   charset utf-8;
   ###start####
   add_header Access-Control-Allow-Headers X-Requested-With;
   add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
   add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
   ###end ###
}

这里的配置我不保证对,因为当登录页路径为 index.php 的时候依然会出现无法设置 cookie 的问题。所以我是去掉 index.php 再登录。

PMA_ARBITRARY 无效

我需要在登录的时候可以指定数据库地址,所以 docker 环境变量里设置了 PMA_ARBITRARY 为 1,但是,网页不管怎么刷新都没有输入数据库地址的输入框。后来在 github 的 issue 里发现有人在某个版本碰到了这个问题,然后作者(可能是)表示会修复。所以,可能现在这个最新的版本又出问题了,因此,我把 latest 改成了 5.0 版本,然后就可以了。

无法访问宿主机 3306

我的数据库是单独买的,然后通过 nginx 代理的(《Nginx 代理远程数据库》)。当我通过 docker0 的 ip:172.17.0.1 登录的时候,死活登录不上去,但换成数据库在内网的地址之后就可以???

难道 docker 内部无法通过 docker0 的地址访问宿主机?

然后我在 docker 内部安装了 iputils-ping,ping 了一下 172.17.0.1,结果是通的。然后我又安装了 telnet,尝试了 telnet 172.17.0.1 3306,结果不通。

接着查找宿主机 iptables,命令行输入 iptables -S 命令,一大串结果中有这么一行:-A INPUT -p tcp -m tcp –dport 3306 -j DROP。

算了算了,不改规则了,直接换端口吧。于是我把 nginx 里监听的端口改成了其他的,然后再次通过 phpmyadmin 试了一下,果然可以了。