在我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
下的数据库?
2条答案
按热度按时间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
行。默认设置是好的。wkyowqbh2#
这取决于你在docker compose中的网络模式。
如果你的应用也在这个docker compose中,那么你可以直接使用postgres_db:5432,就像下面的例子一样
但是如果你的应用程序在网络postgres_db之外-它可以像这样访问数据库
Docker compose中的
network mode: host
将忽略主机和端口Map。Postgres将从docker-compose主机上的初始postgres端口“5432”可用如果您的应用程序在某些网络中由于某种原因无法访问Docker网络(例如Windows主机上的应用程序,当Docker在WSL中时),仍然可能出现问题,那么这里存在其他解决方案