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

i2loujxw  于 2023-04-20  发布在  Docker
关注(0)|答案(2)|浏览(302)

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

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@localhost:9906下的数据库?

y53ybaqx

y53ybaqx1#

这是正确的。对于Postgres来说,它似乎运行在5432上,但是在docker-container的内部。
使用9906:5432,您可以设置一个规则,将端口9906上的docker-host(通常是您的PC)的所有流量重定向到postgres-containers端口5432。
这只会在你尝试从本地主机(而不是从docker容器)调用数据库时起作用。
如果你想改变端口,搜索“postgres change port”。下面是一个结果:https://portal.perforce.com/s/article/691
但是...我认为你改变端口不是一个好主意。使用docker,所有的都是完美的隔离,你可以在同一个端口上有多个postgres-instances。它们是隔离的。
我猜你的应用程序也是一个docker-container。从那里你可以只使用postgresql://postgres_db:5432访问数据库。你必须删除POSTGRES_HOST: localhost行。默认设置是好的。

wkyowqbh

wkyowqbh2#

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

ports:
  - "9906:5432"
  • 这是端口Map,意味着外部网络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 = ""
}

Docker compose中的network mode: host将忽略主机和端口Map。Postgres将从docker-compose主机上的初始postgres端口“5432”可用
如果您的应用程序在某些网络中由于某种原因无法访问Docker网络(例如Windows主机上的应用程序,当Docker在WSL中时),仍然可能出现问题,那么这里存在其他解决方案

相关问题