Docker SQLSTATE [08006] для службы pgsql только из службы php - PullRequest
0 голосов
/ 01 января 2019

Не уверен, что мой заголовок точен, но вот моя проблема.Я работаю с базовым сайтом laravel на Docker и не могу заставить сам сайт подключиться к службе 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 голосов
/ 01 января 2019

В сообщении об ошибке спрашивается Is the server running on host "127.0.0.1", но в вашем случае PostgreSQL работает на другом контейнере Docker, который не является 127.0.0.1 ссылкой на приложение php, поэтому измените хост сервера на postgresql внутри приложения php.

А для измененной ошибки это связано с тем, что вы использовали порт 5433 внутри приложения php, который является портом хост-машины, который предназначен для использования вне контейнера докера (для хост-машины, поэтому ваш клиент Postico PostgreSQLработал).Но порт, который вы должны использовать внутри докерской сети: 5432 измените порт сервера на 5432 внутри вашего php-приложения.

И вы сделали составной файл сложным, определив сеть на каждом хосте по умолчаниюсеть.(Вы можете перейти по этой ссылке для получения более подробной информации.) Если у вас нет требований для этого, вам не нужно это делать, так как docker-compose развернет все контейнеры в одной сети.

И вам не нужно использовать ссылки, которые устарели .Когда несколько контейнеров находятся в одном файле 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:
...