代码之家  ›  专栏  ›  技术社区  ›  Leo

如何使用postgres:11.4-alpine更改端口

  •  -1
  • Leo  · 技术社区  · 1 年前

    在我的docker compose中,我有这样的配置:

    services:
      postgres_db:
        image: postgres:14.1-alpine
        restart: always
        cap_add:
          - SYS_NICE
        volumes:
          - "./setup.sql:/docker-entrypoint-initdb.d/setup.sql"
        ports:
          - "9906:5432"
        environment:
          <<: *common-variables
          POSTGRES_USER: postgres
          POSTGRES_HOST: localhost
    

    根据我跑步后的理解 docker-compose up 我应该让postgres服务器监听 postgresql://postgres:postgres@localhost:9906 然而,在日志中,我看到的是

    hess-postgres_db-1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
    chess-postgres_db-1  | 
    chess-postgres_db-1  | 2023-04-13 21:31:17.726 UTC [1] LOG:  starting PostgreSQL 14.1 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 10.3.1_git20211027) 10.3.1 20211027, 64-bit
    chess-postgres_db-1  | 2023-04-13 21:31:17.726 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
    chess-postgres_db-1  | 2023-04-13 21:31:17.726 UTC [1] LOG:  listening on IPv6 address "::", port 5432
    chess-postgres_db-1  | 2023-04-13 21:31:17.730 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
    chess-postgres_db-1  | 2023-04-13 21:31:17.734 UTC [21] LOG:  database system was shut down at 2023-04-13 21:31:12 UTC
    chess-postgres_db-1  | 2023-04-13 21:31:17.738 UTC [1] LOG:  database system is ready to accept connections
    

    postgres仍然监听5432,这是我的本地postgres也在使用的端口。当我的应用程序调用时 localhost:9906 绝对什么都没有 如何旋转容器并获取数据库 postgresql://postgres:postgres@本地主机:9906 ?

    2 回复  |  直到 1 年前
        1
  •  2
  •   akop    1 年前

    这是正确的。对于Postgres来说,它似乎在5432上运行,但是 在…内 码头集装箱的。

    具有 9906:5432 您设置了一个规则,将端口9906上的docker主机(通常是您的PC)的所有流量重定向到postgres容器端口5432。
    只有当您尝试从本地主机(而不是从docker容器)调用数据库时,这才会起作用。

    如果您想更改该端口,请搜索“postgreschangeport”。以下是一个结果: https://portal.perforce.com/s/article/691

    但是我认为改变那个端口不是一个好主意。有了docker,一切都是完美隔离的,你可以在同一个端口上有多个postgres实例。它们是隔离的。

    我想你的应用程序也是一个docker容器。从那里您可以访问您的数据库,只需 postgresql://postgres_db:5432 。 你必须删除 POSTGRES_HOST: localhost 线默认设置是好的。

        2
  •  2
  •   Totibi    1 年前

    这取决于docker compose中的网络模式。

    ports:
      - "9906:5432"
    
    • 这是端口映射,意味着对于外部网络9906,它是postgres_db容器内部的5432

    如果你的应用程序也在这个docker compose中,那么你可以直接使用postgres_db:5432,就像下面的例子一样

    version: "3.8"
    
    services:
      postgres:
        image: ankane/pgvector
        container_name: example-postgres
        ports:
        - 5555:5432
        networks:
          - example_net
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_HOST_AUTH_METHOD=trust
          - POSTGRES_PASSWORD=pswrd
          - POSTGRES_DB=example_bd
        volumes:
          - db:/var/lib/postgresql/data
    
      search_service:
        build: ./services/search_service
        image: example/search_service
        container_name: search_service
        environment:
          - SERVER_HOSTNAME=0.0.0.0
          - SERVER_PORT=3020
          - DB_URL=jdbc:postgresql://example-postgres:5432/example_bd
          - DB_USER=postgres
          - DB_PASSWORD=
        ports:
          - 3020:3020
        networks:
          - example_net
        depends_on:
          - postgres
    
    networks:
      example_net:
        driver: bridge
    volumes:
      db:
        driver: local
    

    但是,如果你的应用程序在网络之外postgres_db,它可以这样访问数据库

    db {
      url = "jdbc:postgresql://localhost:5555/example_bd"
      user = "postgres"
      password = ""
    }
    

    顺便提一下 network mode: host 在docker compose中将忽略主机和端口映射。Postgres将从docker compose主机上的初始Postgres端口“5432”提供

    如果你的应用程序在某个网络中,由于某种原因无法访问docker网络(比如windows主机上的应用程序,当docker在WSL内部时),仍然可能会出现问题,那么还有其他解决方法