仅来自php服务的pgsql服务的Docker SQLSTATE [08006]

时间:2019-01-01 16:45:17

标签: php postgresql docker connection-refused

不确定我的标题是否准确,但这是我的问题。我在Docker上运行了一个基本的laravel站点,但无法使站点本身连接到PostgreSQL服务。我将在下面发布我的docker-compose.yml。当我运行php artisan migrate时,我没有任何错误,并且一切正常。我什至可以使用Postico PostgreSQL客户端连接到数据库并运行查询。但是,当我尝试从站点连接到数据库时,它会错误地指出:

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

这是我的PostgreSQL客户端设置(可以工作):

Host: 127.0.0.1
Port: 5433
User: homestead
Password: homestead
Database: homestead

我一直在搞弄不同的设置和事情,所以这里是我的docker-compose.yml,尽管我确定那里有些东西我不需要:

version: '2'

services:
  php:
    image: jguyomard/laravel-php:7.2
    build:
      context: .
      dockerfile: infrastructure/php/Dockerfile
    volumes:
      - ./:/var/www/
      - $HOME/.composer/:$HOME/.composer/
    networks:
      - default
    links:
      - postgresql
      - redis

  nginx:
    image: jguyomard/laravel-nginx:1.13
    build:
      context: .
      dockerfile: infrastructure/nginx/Dockerfile
    ports:
      - 81:80
    networks:
      - default
    links:
      - postgresql
      - redis

  postgresql:
    image: postgres:9.6-alpine
    volumes:
      - pgsqldata:/var/lib/postgresql/data
    environment:
      - "POSTGRES_DB=homestead"
      - "POSTGRES_USER=homestead"
      - "POSTGRES_PASSWORD=homestead"
    ports:
      - "5433:5432"
    networks:
      - default

  redis:
    image: redis:4.0-alpine
    command: redis-server --appendonly yes
    ports:
      - "6379:6379"
    networks:
      - default

#  elastic:
#    image: elasticsearch:5.5-alpine
#    ports:
#        - "9200:9200"

volumes:
  pgsqldata:

networks:
  default:

关于为什么站点无法连接到数据库的任何想法?

我的docker network ls输出:

NETWORK ID      NAME               DRIVER        SCOPE
2bf85424f466    bridge             bridge        local
c29d413f768e    host               host          local
0bdf9db30cd8    none               null          local
f3d9cb028ae3    my-app_default     bridge        local

1 个答案:

答案 0 :(得分:1)

错误消息询问Is the server running on host "127.0.0.1",但在您的情况下PostgreSQL在另一个docker容器上运行,而该容器不是127.0.0.1到php应用程序的引用,因此,将服务器主机更改为postgresql php应用程序。

对于修改后的错误,这是因为您已在php应用程序内使用了端口5433,这是主机端口,可在docker容器外部使用(对于主机,这就是您的Postico的原因PostgreSQL客户端正常工作)。但是您必须在docker网络中使用的端口是5432,将您的php应用程序中的服务器端口更改为5432

通过将每个主机中的网络定义为默认网络,使组合文件变得复杂。 (您可以按照此link的更多详细信息)如果您不需要这样做,则无需这样做,因为docker-compose会将所有容器部署在单个网络中。

您不需要使用链接,它们是deprecated。当一个docker-compose.yml文件中包含多个容器时,它们会自动部署在同一单个网络中。

因此,将建议使用此简化的撰写文件。

version: '2'

services:
  php:
    image: jguyomard/laravel-php:7.2
    build:
      context: .
      dockerfile: infrastructure/php/Dockerfile
    volumes:
      - ./:/var/www/
      - $HOME/.composer/:$HOME/.composer/

  nginx:
    image: jguyomard/laravel-nginx:1.13
    build:
      context: .
      dockerfile: infrastructure/nginx/Dockerfile
    ports:
      - 81:80

  postgresql:
    image: postgres:9.6-alpine
    volumes:
      - pgsqldata:/var/lib/postgresql/data
    environment:
      - "POSTGRES_DB=homestead"
      - "POSTGRES_USER=homestead"
      - "POSTGRES_PASSWORD=homestead"
    ports:
      - "5433:5432"

  redis:
    image: redis:4.0-alpine
    command: redis-server --appendonly yes
    ports:
      - "6379:6379"

#  elastic:
#    image: elasticsearch:5.5-alpine
#    ports:
#        - "9200:9200"

volumes:
  pgsqldata: