【发布时间】:2021-04-04 13:42:52
【问题描述】:
我正在创建一个 docker-compose 配置,它维护:
- node.js 服务器,以及
- 单独的 postgres 服务器。
教程强调postgres 5432端口必须暴露或转发,以便节点容器可以访问它:促进在下面docker-compose.yml。
version: "3.7"
services:
db:
container_name: db
image: postgres:alpine
ports:
- "5010:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: verysecretpass
POSTGRES_DB: pg-dev
server:
container_name: dashboard-api
build: .
volumes:
- .:/server
ports:
- "5000:5000"
这会产生以下docker ps 输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d790cd4929e server_server "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:5000->5000/tcp dashboard-api
818296c1fc02 postgres:alpine "docker-entrypoint.s…" 7 minutes ago Up 4 minutes 0.0.0.0:5010->5432/tcp pg
在上述状态下,节点在尝试连接此 url 时获得 ECONN REFUSED:postgres://postgres:verysecretpass@db:5010/pg-dev
然而,当使用 5432 而不是 5010 时,相同的连接字符串可以连接。
事实上,使用 5432,即使 pg 容器没有任何端口配置,连接也会成功。下面的docker ps 输出反映了节点容器可以愉快连接的 no-port-config 状态:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76da96c15c05 server_server "docker-entrypoint.s…" 7 seconds ago Up 7 seconds 0.0.0.0:5000->5000/tcp dashboard-api
51c221ac2c54 postgres:alpine "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 5432/tcp db
为什么会这样?我在这里错过了什么?
使用:
- Docker 版本 20.10.0,构建 7287ab3
- docker-compose 版本 1.27.4,构建 40524192
【问题讨论】:
-
当你使用 docker name 连接时,你连接的是 docker 本身,而不是使用 docker proxy(5010) 映射到外部的端口,如果你想连接到 5010,只需使用 localhost 或您的主机的公共 ip
标签: docker docker-compose