使用PDO和Postgres的PHP7.3的连接问题(Docker图像)

使用PDO和Postgres的PHP7.3的连接问题(Docker图像),docker,pdo,postgresql-10,php-7.3,Docker,Pdo,Postgresql 10,Php 7.3,我正在将我的开发环境从旧的XAMPP安装更改为新的停靠解决方案(OS:Ubuntu Mate LTS 18.03)。看起来一切正常,但我仍然无法从Apache2 docker映像连接到我的Postgres DBMS docker映像:-/ 我在Postgres 10.3服务器上使用正式的docker映像。数据库已经启动,我可以通过我的NetBeans 11 IDE、PgAdmin工具和本地运行的JavaEE Tomcat服务器进行连接。服务器还接受本地主机之外的连接。启动postgres映像的命

我正在将我的开发环境从旧的XAMPP安装更改为新的停靠解决方案(OS:Ubuntu Mate LTS 18.03)。看起来一切正常,但我仍然无法从Apache2 docker映像连接到我的Postgres DBMS docker映像:-/

我在Postgres 10.3服务器上使用正式的docker映像。数据库已经启动,我可以通过我的NetBeans 11 IDE、PgAdmin工具和本地运行的JavaEE Tomcat服务器进行连接。服务器还接受本地主机之外的连接。启动postgres映像的命令为:

docker run -d -p 5432:5432 --name postgres -v /media/veracrypt1/Applications/docker/postgreSQL:/var/lib/postgresql/data postgres
作为Apache/PHP映像,我还使用DockerHub的官方版本。我实例化的图像是:

docker run -d -p 80:80 --name php-7.3 -v /media/veracrypt1/htdocs:/var/www/html -v /media/veracrypt1/Applications/docker/php-7.3/apache:/etc/apache2 -v /media/veracrypt1/Applications/docker/php-7.3/php:/usr/local/etc/php php:7.3-apache
PHP脚本也得到了很好的执行

然后我通过php_info()发现Apache映像不包含postgres pdo扩展。我通过在谷歌上找到的解决方案在docker图像中添加了扩展:

apt-get install -y libpq-dev \
    && docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql \
    && docker-php-ext-install pdo pdo_pgsql pgsql
完成此过程后,postgres PDO扩展将显示在php_info()中,并通过命令\PDO::getAvailableDrivers()显示。但当我尝试连接时,仍会收到服务器超时: [错误]DBMS连接SQLSTATE[08006][7]超时已过期

当驱动程序输出得到以下信息时:可用驱动程序:数组(2){[0]=>string(6)“sqlite”=>string(5)“pgsql”}

我的php代码片段似乎也不错:

$dsn = sprintf("pgsql:host=%s;port=%d;dbname=%s;user=%s;password=%s",
                    $params[$this->host],
                    $params[$this->port],
                    $params[$this->schemata],
                    $params[$this->user],
                    $params[$this->password]);
$ dbh = new \PDO($dsn $this->user, $this->password);
$dbh->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(\PDO::ATTR_TIMEOUT, 10);
$pdo = $dbh->query($sql);
数据库表可用,SELECT语句在NetBeans IDE中运行良好

看来php7.3-apache映像有问题。我想我激活分机的方式不合适。如果有人能帮我连接数据库管理系统,那就太好了。非常感谢你的帮助

编辑:完整POD连接字符串为: pgsql:host=172.17.0.1;端口=5432;dbname=tinycms;用户=tinycms;密码=tinycms 数据库用户etc是正确的,因为我在我的Netbeans IDE中使用它来连接postgres

postgres docker容器的CMD(包括PHP脚本的执行:

jean@jean-ThinkPad-T540p:~$ docker start -a postgres
2019-07-13 16:19:20.680 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2019-07-13 16:19:20.680 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2019-07-13 16:19:20.848 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2019-07-13 16:19:21.446 UTC [26] LOG:  database system was shut down at
2019-07-13 16:18:45 UTC
2019-07-13 16:19:21.637 UTC [1] LOG:  database system is ready to accept connections

请添加您在此处添加的数据,以及运行这两个容器时,
pgsql:host=%s;port=%d;dbname=%s;
的输出。[已解决]经过一些调查,我得到了使用docker inspect命令找到解决方案的提示。我忘记链接两个容器,并在php-7.3容器中打开数据库端口。在销毁php容器并使用以下命令重新创建后,一切正常:
docker run-d-p 80:80-p 5432-p 443——命名为php-7.3-v/media/veracrypt1/htdocs:/var/www/html-v/media/veracrypt1/Applications/docker/php-7.3/apache:/etc/apache2-v/media/veracrypt1/Applications/docker/php-7.3/php:/usr/local/etc/php--link postgres php:7.3-apache
您能在这里添加什么数据吗
pgsql:host=%s;port=%d;dbname=%s;
以及
docker-ps的输出是什么
运行两个容器时。[已解决]经过一些调查,我得到了使用docker inspect命令找到解决方案的提示。我忘记链接两个容器,并在php-7.3容器中打开数据库端口。在销毁php容器并使用以下命令重新创建后,一切正常:
docker run-d-p 80:80-p 5432-p 443——命名为php-7.3-v/media/veracrypt1/htdocs:/var/www/html-v/media/veracrypt1/Applications/docker/php-7.3/apache:/etc/apache2-v/media/veracrypt1/Applications/docker/php-7.3/php:/usr/local/etc/php--link postgres php:7.3-apache