为什么我的docker编写端口配置工作



我正在创建一个docker compose配置,该配置维护:

  1. 一个node.js服务器,以及
  2. 一个单独的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文档中的服务将自动添加到网络中。没有必要公开此网络中的端口。

如果您想向外部世界公开容器上的端口,则需要像以前那样显式映射这些端口。然而,这对于同一网络中的服务之间的通信没有任何改变。如果您没有理由从网络外部访问数据库(例如,使用自己机器上的数据库工具检查数据(,则不必映射/暴露数据库容器的任何端口。

最新更新