【问题标题】:Connect from laravel app in docker container to Postgresql in host machine?从 docker 容器中的 laravel 应用程序连接到主机中的 Postgresql?
【发布时间】:2020-10-21 09:26:21
【问题描述】:

我收到了错误SQLSTATE[08006] [7] timeout expired (SQL: select count(*) as aggregate from "users")

我已将 postgresql 监听地址设置为 0.0.0.0,但它没有解决

需要更好的解决方法

.env 文件:

DB_CONNECTION=pgsql
DB_HOST=172.17.0.1 // <-- this won't connect. I declare like that based on docker0
DB_PORT=5432
DB_DATABASE=mydb
DB_USERNAME=postgres
DB_PASSWORD=postgres

docker-compose.yml 文件:

version: '3'

networks:
  laravel:
    driver: bridge

volumes:
  dbdata:
    driver: local

services:
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx.dockerfile
    container_name: nginx
    ports:
      - "${DOCKER_SITE_HOST}:80"
    volumes:
      - .:/var/www/html
    depends_on:
      - php
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: ./docker/php.dockerfile
    container_name: php
    volumes:
      - .:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - laravel

  composer:
    build:
      context: .
      dockerfile: ./docker/composer.dockerfile
    container_name: composer
    volumes:
      - .:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php
    user: laravel
    entrypoint: [ 'composer', '--ignore-platform-reqs' ]
    networks:
      - laravel

  artisan:
    build:
      context: .
      dockerfile: ./docker/php.dockerfile
    container_name: artisan
    volumes:
      - .:/var/www/html
    working_dir: /var/www/html
    user: laravel
    entrypoint: [ 'php', '/var/www/html/artisan' ]
    networks:
      - laravel

【问题讨论】:

    标签: php laravel postgresql docker docker-compose


    【解决方案1】:

    终于通过使用这个解决方法让它工作了:

    1. 允许 postgresql 主机的端口
    2. postgresql.conf 上的listen_addresses 配置更改为*,因此它变为listen_addresses = '*'
    3. 将此配置放在pg_hba.conf 的顶部
    # TYPE DATABASE USER CIDR-ADDRESS  METHOD
    host  all  all 0.0.0.0/0 md5
    
    1. 重启postgresql
    2. 最后在.env上使用docker0接口

    【讨论】:

      【解决方案2】:

      试试这个:

      1. 打开cmd,执行ipconfig命令

      2. 获取您的 IP 以太网 192.168.x.x

      3. DB_HOST Ip 更改为.env 文件中的以太网IP

      4. 保存

      另一种方法是您可以使用以下命令获取正在运行的容器的 Ip:

      docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

      【讨论】:

        【解决方案3】:

        在我看来,您可以连接到数据库,正如您在.env 文件的评论中指出的那样,如果您使用另一个 IP,您会收到连接错误:

        DB_HOST=172.17.0.1 // <-- this won't connect. I declare like that based on docker0
        

        因此,由于您的错误不是连接错误,而是超时错误,因此您的问题依赖于 sql 查询的时间成本太高,或者您的数据库的查询超时时间很短,因此在我看来是不相关的到您的 docker 设置。

        【讨论】:

          【解决方案4】:

          你有两种可能:

          1. 在你的 laravel docker 中使用与你的主机相同的 localhost 接口。

          2. 使用 docker-network。

          如果你想访问DB_HOST=host.docker.internal,考虑到你的 docker 的 localhost 和你主机的 localhost 不同

          【讨论】:

            猜你喜欢
            • 2018-01-31
            • 1970-01-01
            • 2022-12-06
            • 2016-01-05
            • 2018-11-28
            • 2023-01-19
            • 1970-01-01
            • 2016-07-14
            相关资源
            最近更新 更多