【问题标题】:Can't connect to Postgres database using PHP PDO and Docker无法使用 PHP PDO 和 Docker 连接到 Postgres 数据库
【发布时间】:2021-06-15 10:43:33
【问题描述】:

我正在运行一个基于三个映像构建的 Docker 应用程序:php:7.4-fpmnginx:stable-alpinepostgres:alpine

我之前尝试使用图像php:7.4-fpm-alpine,但显然它没有附带Postgres PDO 驱动程序,这导致could not find driver 错误。 This post 对此进行了更多解释,以及如何解决它。我按照那篇文章中的步骤操作,包括为我的 PHP FPM 服务创建Dockerfile(尽管我没有创建 PHP CLI 服务),这解决了我的驱动程序问题。但是,当我尝试使用 PDO 连接到我的 PSQL 数据库时,我现在收到以下错误:

SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 6432?

我知道我的数据库正在运行(在端口 6432 上),因为我可以从终端和 Positco 访问它,并且在我的 Docker 应用程序创建后创建了表。我还尝试连接到端口 5432 上的数据库(通过该端口运行我的 Postgres 桌面应用程序),但这也不起作用。我还尝试重新启动我的 Postgres 容器,但没有帮助。

这是我的 PHP:

class Database {

    private $connection;

    private static $options = array(
        PDO::ATTR_EMULATE_PREPARES => FALSE, 
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );

    public function __construct() {
        try {
            $dsn = 'pgsql:host=localhost;port=6432;dbname=db_my_test_app';
            $username = 'root';
            $password = 'secret';
            $connection = new PDO($dsn, $username, $password, self::$options);
            $this->connection = $connection;
            return $connection;      
        } catch (PDOException $e) {
            exit($e->getMessage());
        }
    }
}

$database = new Database();

...还有我的docker-compose.yml 文件:

version: '3'

networks: 
    my_test_app:

services: 

    # nginx
    nginx-service:
        image: nginx:stable-alpine
        container_name: nginx-container
        ports: 
            - "8080:80"
        volumes: 
            - ./app:/var/www/project
            - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
        depends_on: 
            - php-fpm-service
            - postgres-service
        networks: 
            - my_test_app  
  
    # php
    php-fpm-service:
        build: 
            context: .
            dockerfile: ./php-fpm/Dockerfile
        container_name: php-fpm-container
        ports:
            - "9000:9000"
        working_dir: /var/www/project
        volumes:
            - ./app:/var/www/project
        networks: 
            - my_test_app  

    # postgres
    postgres-service:
        image: postgres:alpine
        container_name: postgres-container
        ports: 
            - "6432:5432"
        volumes: 
            - ./postgres:/var/lib/postgresql/data
        restart: always
        environment: 
            POSTGRES_USER: root
            POSTGRES_PASSWORD: secret
            POSTGRES_DB: db_my_test_app
        networks: 
            - my_test_app

...和 ​​PHP 服务 Dockerfile(来自上述网站):

FROM php:7.4-fpm
RUN apt-get update && apt-get install -y libpq-dev
RUN docker-php-ext-install pdo pdo_pgsql pgsql
RUN ln -s /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
RUN sed -i -e 's/;extension=pgsql/extension=pgsql/' /usr/local/etc/php/php.ini
RUN sed -i -e 's/;extension=pdo_pgsql/extension=pdo_pgsql/' /usr/local/etc/php/php.ini

【问题讨论】:

标签: php postgresql docker pdo


【解决方案1】:

您在默认网络模式下配置 docker:bridge。为了使php-fpm-service 能够访问postgres-service,您需要进行以下修改:

docker-compose.yml 文件中,您需要将depends_on 添加到php-fpm-service

# php
php-fpm-service:
    build: 
        context: .
        dockerfile: ./php-fpm/Dockerfile
    container_name: php-fpm-container
    ports:
        - "9000:9000"
    working_dir: /var/www/project
    volumes:
        - ./app:/var/www/project
    networks: 
        - my_test_app  
    depends_on:
        - postgres-service

在您的 PHP 配置中,您需要将 localhost 修改为 postgres-service 并使用端口 5432:

$dsn = 'pgsql:host=postgres-service;port=5432;dbname=db_my_test_app';

【讨论】:

  • 谢谢;这行得通。您能否解释一下为什么我必须在$dsn 中使用端口5432 而不是6432?另外,有什么地方可以让我了解更多关于 Docker 的网络模式的信息吗?我阅读并观看了许多关于将数据库链接到 PHP 和 nginx 的教程,但从未讨论过任何相关内容。
  • @GingerandLavender 如果您使用默认网络模式,docker 会将您的容器隔离在专用网络上,端口 6432 是您指定的端口,以便 docker 外部的组件可以访问容器和 docker 网络内部,容器仍然使用端口 5432 访问您的 postgres 服务。您可以在此处阅读有关 docker 网络的更多信息:docs.docker.com/network
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多