我正在创建一个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:postgres://postgres:verysecretpass@db:5010/pg-dev
时得到ECONN REFUSED
然而,当使用5432而不是5010时,相同的连接字符串可以连接。
事实上,使用5432,即使pg容器没有任何端口配置,连接也会成功。下面的docker ps
输出反映了节点容器可以愉快连接的无端口配置状态:
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 compose文档中的服务将自动添加到网络中。没有必要公开此网络中的端口。
如果您想向外部世界公开容器上的端口,则需要像以前那样显式映射这些端口。然而,这对于同一网络中的服务之间的通信没有任何改变。如果您没有理由从网络外部访问数据库(例如,使用自己机器上的数据库工具检查数据(,则不必映射/暴露数据库容器的任何端口。