PostgreSQL 数据库没有公开到我在 docker-compose 中期望的端口
PostgreSQL database is not exposed to the port I expect in docker-compose
我正在尝试使用 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] LOG: listening on IPv4 address
"0.0.0.0", port 5432
当我将我的服务连接到端口 5432 时,一切正常。但是我需要两个数据库暴露给不同的端口。我怎样才能实现它?
更新
我已经按照评论中的建议更改了端口映射。
user-service-db:
image: postgres
restart: always
environment:
- POSTGRES_DB=dbname
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:3336"
并在docker-写下来后重新开始
结果保持不变
user-service-db_1 | 2021-03-05 10:01:23.023 UTC [1] LOG:
listening on IPv4 address "0.0.0.0", port 5432
可能我遗漏了一个细节
您需要公开正确的端口。
Postgres 默认端口是 5432
:即 docker 容器中的 postgres 服务将监听端口 5432
.
我想,在主机上,您想听 3336
(或 3306
?)。
在这种情况下,映射必须是:
ports:
- "3336:5432"
即格式为 HOST:CONTAINER
另见:
作为一个实现细节,容器有自己的私有 IP 地址。您通常不能从外部 Docker 访问这些地址,但是当您的容器尝试连接到主机名 db
时,它会映射到这些内部地址之一。这意味着不同容器中的进程可以监听同一个端口,因为每个进程都在自己的隔离网络中 space.
这意味着打包进程在其“正常”端口上侦听是标准的。您看到的输出是 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 中几乎没有任何意义。 Docker 文件中的 EXPOSE
主要是文档,没有理由使用 Compose expose:
设置。
我正在尝试使用 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] LOG: listening on IPv4 address "0.0.0.0", port 5432
当我将我的服务连接到端口 5432 时,一切正常。但是我需要两个数据库暴露给不同的端口。我怎样才能实现它?
更新
我已经按照评论中的建议更改了端口映射。
user-service-db:
image: postgres
restart: always
environment:
- POSTGRES_DB=dbname
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:3336"
并在docker-写下来后重新开始
结果保持不变
user-service-db_1 | 2021-03-05 10:01:23.023 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
可能我遗漏了一个细节
您需要公开正确的端口。
Postgres 默认端口是 5432
:即 docker 容器中的 postgres 服务将监听端口 5432
.
我想,在主机上,您想听 3336
(或 3306
?)。
在这种情况下,映射必须是:
ports:
- "3336:5432"
即格式为 HOST:CONTAINER
另见:
作为一个实现细节,容器有自己的私有 IP 地址。您通常不能从外部 Docker 访问这些地址,但是当您的容器尝试连接到主机名 db
时,它会映射到这些内部地址之一。这意味着不同容器中的进程可以监听同一个端口,因为每个进程都在自己的隔离网络中 space.
这意味着打包进程在其“正常”端口上侦听是标准的。您看到的输出是 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 中几乎没有任何意义。 Docker 文件中的 EXPOSE
主要是文档,没有理由使用 Compose expose:
设置。