Php Docker容器可以';我们不能互相联系

Php Docker容器可以';我们不能互相联系,php,docker,docker-compose,Php,Docker,Docker Compose,我在docker compose中有两个容器,一个Postgres DB和一个Symfony PHP应用程序 在后端应用程序(PHP Symfony)中,我希望执行处理DB连接的命令,但我尝试的配置似乎都不起作用。 我添加了expose()作为提示,还添加了默认网络作为提示 docker-compose.yml 根据后端容器中的DB配置,我在执行php bin/console原则:schema:update--forceinsideBackend-app时会收到不同的错误消息: DATABASE

我在docker compose中有两个容器,一个Postgres DB和一个Symfony PHP应用程序

在后端应用程序(PHP Symfony)中,我希望执行处理DB连接的命令,但我尝试的配置似乎都不起作用。 我添加了
expose
()作为提示,还添加了默认网络作为提示

docker-compose.yml 根据后端容器中的DB配置,我在执行
php bin/console原则:schema:update--force
inside
Backend-app
时会收到不同的错误消息:

DATABASE\u URL=“postgresql://user:password@数据库:5431/my_db?serverVersion=11&charset=utf8“

导致

驱动程序中发生异常:SQLSTATE[08006][7]无法连接到服务器:连接被拒绝。服务器是否在主机“数据库”(172.21.0.2)上运行,并在端口5431上接受TCP/IP连接

DATABASE\u URL=“postgresql://user:password@localhost:5431/my_db?serverVersion=11&charset=utf8“

导致

SQLSTATE[08006][7]无法连接到服务器:连接被拒绝服务器是否在主机“localhost”(127.0.0.1)上运行并在端口5431上接受TCP/IP连接


我的方法哪里错了?

您无法选择容器在compose创建的内部docker网络中公开的内容

,因此您的
expose:5431
指令只公开postgress未侦听的端口,因此它是无用的

因此,在两个容器之间,您必须使用postgress的端口
5432
,除非您从现有映像派生,否则请更改其中的配置并公开您想要的端口

下面的说明仅更改容器暴露于外部世界的端口

端口:
- 5431:5432
这意味着您将容器的端口
5432
暴露给主机的端口
5431

指定两个端口(
HOST:CONTAINER
),或仅指定容器端口(选择临时主机端口)

资料来源:


总而言之:

  • 您的Symfony配置应为:
    DATABASE\u URL=“postgresql://user:password@数据库:5432/my_db?serverVersion=11&charset=utf8“
    
  • 撰写文件中的
    expose
    指令无效
  • 您编写的
    ports
    指令只有在您希望从主机连接到postgress容器的端口与默认端口不同时才方便(即,因为您已经有一个本地postgress服务器在运行,因此该端口正在使用)

数据库服务的端口配置配置为响应主机端口上的端口5431和容器端口上的端口5432。将您的
数据库\u URL
连接字符串改为使用端口5432。至于我使用的端口,它与此完全相同,我有一个本地Postgres正在运行。如果我不需要从外部访问它,
端口
参数是否必要?那么,不,您的postgress db将只能在compose创建的docker网络内部访问。如果您有一个DB工具,希望直接插入DB以轻松执行SQL命令,那么它会很方便,但这当然不是必须的。
version: '3'

services:
  database:
    image: postgres:11
    ports:
      - 5431:5432
    expose:
      - "5431"
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: user
      POSTGRES_DB: my_db
    volumes:
      - ./database:/var/lib/postgresql/data
  frontend:
    image: frontend-image:latest
    ports:
      - 8090:80
  backend-app:
    image: backend-app:latest
    links:
      - database
  backend-web:
    image: backend-web:latest
    ports:
      - 8091:80
    depends_on:
      - backend-app
      - database
networks:
  default: