【问题标题】:How to specify different port for a Docker postgres instance?如何为 Docker postgres 实例指定不同的端口?
【发布时间】:2021-11-04 14:44:52
【问题描述】:

我正在尝试让一个 postgres 容器在不同的端口(5433 而不是默认的 5432)上运行几个在线线程,如下所示: https://github.com/docker-library/postgres/issues/196#issuecomment-310209118

(更改端口的原因是因为我离开运行的一个不相关的项目已经在使用端口 5432,所以我希望能够在多个项目上同时运行 rspec。)

在我的测试环境中,我有 DATABASE_URL=postgresql://postgres:@db.local:5433/test_agile_self

当我使用端口 5432(在 DATABASE_URL 和 docker-compose.yml 中)时,一切正常

将端口更改为 5433 后,当我运行 rspec 时,我得到:

PG::ConnectionBad:
  could not connect to server: Connection refused
    Is the server running on host "db.local" (172.22.0.2) and accepting
    TCP/IP connections on port 5433?
# ./spec/spec_helper.rb:62:in `block (2 levels) in <top (required)>'

容器似乎确实在端口 5433 和 IP 地址 172.22.0.2 上运行:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a8f5dee227e8        postgres:10.5       "docker-entrypoint.s…"   27 minutes ago      Up 14 seconds       0.0.0.0:5433->5432/tcp   zarc_db.local_1
$ docker inspect a8f5dee227e8 | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.22.0.2",

根据上面链接的讨论,我的 docker-compose.yml 使用 ports: "5433:5432"

#docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "3010:3010"
    volumes:
      - .:/my_app
    links:
      - db.local
    depends_on:
      - db.local

  db.local:
    image: postgres:10.5
    ports:
      - "5433:5432"

如果我在这两个位置(ENV 和 docker-compose.yml)将 5433 改回 5432,它会再次起作用。

这是在运行 Mohave 10.14.3 和 Docker 18.09.2 的 Mac 上

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    在容器内部,因此在DATABASE_URL 中,端口需要保持相同的 5432,即它必须匹配容器内的数据库配置。在docker-compose 中,您只需使用给定的 5433 将现有端口 5432 映射到外部世界

    ports:
        - "5433:5432"
    

    【讨论】:

    • 宾果游戏!谢谢!
    • Docker 端口映射也困扰了我很多次 ;)
    • 为了澄清上述答案,您的应用程序的 DATABASE_URL 应该继续引用标准目标端口 (5432),即 DATABASE_URL=postgresql://postgres:@db.local:5432/test_agile_self(即使 published 端口是 5433)跨度>
    • 为什么 DATABASE_URL 中的端口需要保持不变?我认为容器通过端口映射进行通信
    • 你是对的@Äxel,如果你不改变容器内的数据库配置,它只需要在 docker-compose 中保持不变。如果您更改配置,则必须在撰写中进行相应的更改。我已经更新了这方面的答案。
    【解决方案2】:

    在您的docker-compose 中,您可以添加以下内容:(长语法)

    ports:  
      - target: 80
        published: 8080
        protocol: tcp
        mode: host
    

    在哪里,

    • target:容器内的端口
    • published:公开的端口
    • protocol:端口协议(tcp 或 udp)
    • mode:用于在每个节点上发布主机端口的主机,或用于负载均衡的集群模式端口的入口。

    或者单行:(短语法)

    ports:
      - "4040:5432" # HOST:CONTAINER
    

    在哪里,

    • 4040 是要在 HOST 上公开的端口
    • 5432 是暴露在容器上的端口

    注意:

    使用低于 60 的容器端口时,您可能会遇到错误的结果,因为 YAML 将 xx:yy 格式的数字解析为 base-60 值。因此,我们建议始终将端口映射明确指定为字符串。

    【讨论】:

      猜你喜欢
      • 2016-07-25
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2017-11-04
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多