Docker SQLSTATE[0806]仅用于php服务中的pgsql服务



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

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

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

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

您通过将每个主机中的网络定义为默认网络,使组合文件变得复杂。(您可以点击此链接了解更多详细信息)如果您对此没有要求,则不需要这样做,因为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:

最新更新