【问题标题】:Why does my docker-compose port config work?为什么我的 docker-compose 端口配置有效?
【发布时间】:2021-04-04 13:42:52
【问题描述】:

我正在创建一个 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 时获得 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


【解决方案1】:

除非另有配置,否则 docker-compose 文档中的服务是automatically added to a network。无需公开此网络中的端口。

如果你想将容器上的端口暴露给外界,你需要像你一样显式地映射这些端口。但是,这不会改变同一网络中服务之间的通信。如果您没有理由从网络外部访问数据库(例如,使用您自己机器上的 DB 工具检查数据),您不必映射/公开 db 容器的任何端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 2021-02-27
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多