Docker SQLSTATE[08006] 仅用于来自 php 服务的 pgsql 服务
Docker SQLSTATE[08006] for pgsql service only from php service
不确定我的标题是否准确,但这是我的问题。我 运行 在 Docker 上创建一个基本的 laravel 站点,但无法让站点本身连接到 PostgreSQL 服务。下面我会post我的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
错误消息询问 Is the server running on host "127.0.0.1"
但在你的情况下 PostgreSQL 是 运行 在不同的 docker 容器上,它不是 127.0.0.1
对 php 应用程序的引用因此,在 php 应用程序中将服务器主机更改为 postgresql
。
而修改后的错误,是因为你在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:
不确定我的标题是否准确,但这是我的问题。我 运行 在 Docker 上创建一个基本的 laravel 站点,但无法让站点本身连接到 PostgreSQL 服务。下面我会post我的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
错误消息询问 Is the server running on host "127.0.0.1"
但在你的情况下 PostgreSQL 是 运行 在不同的 docker 容器上,它不是 127.0.0.1
对 php 应用程序的引用因此,在 php 应用程序中将服务器主机更改为 postgresql
。
而修改后的错误,是因为你在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: