PostgreSQL 数据库没有公开到我在 docker-compose 中期望的端口

PostgreSQL database is not exposed to the port I expect in docker-compose

我正在尝试使用 docker 在我的 Node.js 后端中设置多服务架构。我目前有两个服务和两个独立的数据库

version: "3"
services:
  server-api-getaway:
    build:
      context: "."
      dockerfile: "./server-api-gateway/Dockerfile"
    depends_on:
      - db
      - redis
    ports:
      - "7100:7100"
    volumes:
      - ./server-api-gateway:/usr/src/app/server-api-gateway
    environment:
      - CHOKIDAR_USEPOLLING=true
      - REDIS_URL=redis://cache
      - DATABASE_URL=postgres://postgres:postgres@db:3336/dbname
      - DATABASE_PORT=3336
      - DATABASE_HOST=host.docker.internal
      - POSTGRES_DB=dbname
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - PORT=7100

  db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_DB=dbname
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "3336:3306"

  server-user-service:
    build:
      context: "."
      dockerfile: "./server-user-service/Dockerfile"
    depends_on:
      - user-service-db
    ports:
      - "7000:7000"
    volumes:
      - ./server-user-service:/usr/src/app/server-user-service
    environment:
      - CHOKIDAR_USEPOLLING=true
      - REDIS_URL=redis://cache
      - DATABASE_URL=postgres://postgres:postgres@user-service-db:3307/dbname
      - DATABASE_PORT=3307
      - DATABASE_HOST=host.docker.internal
      - POSTGRES_DB=dbname
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - PORT=7000

  user-service-db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_DB=dbname
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "3307:3306"

  redis:
    image: redis
    container_name: cache
    restart: always
    ports:
      - 6379:6379

volumes:
  pgdata:
    driver: local
  pgconf:
    driver: local
  pglog:
    driver: local

我希望两个数据库 运行 在不同的端口上,但是当我 运行 docker-compose up 它们暴露于 5432端口

2021-03-05 07:12:10.111 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432

当我将我的服务连接到端口 5432 时,一切正常。但是我需要两个数据库暴露给不同的端口。我怎样才能实现它?

更新

我已经按照评论中的建议更改了端口映射。

  user-service-db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_DB=dbname
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "5432:3336"

并在docker-写下来后重新开始

结果保持不变

user-service-db_1 | 2021-03-05 10:01:23.023 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432

可能我遗漏了一个细节

您需要公开正确的端口。
Postgres 默认端口是 5432:即 docker 容器中的 postgres 服务将监听端口 5432.
我想,在主机上,您想听 3336(或 3306?)。

在这种情况下,映射必须是:

ports:
  - "3336:5432"

即格式为 HOST:CONTAINER

另见:

作为一个实现细节,容器有自己的私有 IP 地址。您通常不能从外部 Docker 访问这些地址,但是当您的容器尝试连接到主机名 db 时,它会映射到这些内部地址之一。这意味着不同容器中的进程可以监听同一个端口,因为每个进程都在自己的隔离网络中 space.

这意味着打包进程在其“正常”端口上侦听是标准的。您看到的输出是 PostgreSQL 启动的输出;这将总是 监听 0.0.0.0:5432(除非你对其配置文件进行棘手的修改)。

容器之间的连接也始终连接到“正常”端口:

 # Use ordinary port, ports: are ignored       vvvv
- DATABASE_URL=postgres://postgres:postgres@db:5432/dbname

发布一个端口可以使用主机的 IP 地址(和 DNS 名称)从外部 Docker 访问它。第二个 ports: 数字需要与容器内的端口号匹配,第一个可以是任何尚未使用的端口号。容器之间的连接从不使用这个。

ports:
  #       vvvv the ordinary port, fixed by the image
  - "3336:5432"

“揭露”作为动词在现代 Docker 中几乎没有任何意义。 Docker 文件中的 EXPOSE 主要是文档,没有理由使用 Compose expose: 设置。