【问题标题】:PostgreSQL database is not exposed to the port I expect in docker-composePostgreSQL 数据库没有暴露给我在 docker-compose 中期望的端口
【发布时间】:2021-06-03 21:16:02
【问题描述】:

我正在尝试使用 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] 日志:侦听 IPv4 地址 “0.0.0.0”,端口 5432

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

更新

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

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

docker-compose down

之后又重新开始

结果保持不变

用户服务-db_1 | 2021-03-05 10:01:23.023 UTC [1] 日志: 监听 IPv4 地址“0.0.0.0”,端口 5432

可能我缺少一个细节

【问题讨论】:

    标签: node.js postgresql docker express microservices


    【解决方案1】:

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

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

    ports:
      - "3336:5432"
    

    即格式为HOST:CONTAINER

    另见:

    【讨论】:

    • 感谢您提供我将阅读的链接。我已经按照您的建议更改了端口映射,但结果是一样的。我做了 docker-compose down 甚至删除了图像以从 skratch 开始。我会更新我的问题。
    • 哦 - 抱歉,我想我已经交换了端口:应该是 3336:5432:我会更新答案。
    【解决方案2】:

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

    这意味着打包进程在其“正常”端口上侦听是标准的。您看到的输出是 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 中几乎没有任何意义。 Dockerfile 中的 EXPOSE 主要是文档,没有理由使用 Compose expose: 设置。

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多