You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过SSH访问Postgres Docker容器并限制公网访问

限制Postgres Docker容器的公网访问方法

你的核心问题在于当前ports配置把容器端口绑定到了主机的所有网卡(默认0.0.0.0),导致公网可以访问。以下是几种可靠的解决方式:

1. 仅绑定本机/内网IP(适合需要主机或内网服务访问的场景)

修改ports配置,指定绑定到回环地址127.0.0.1(仅本机能访问)或你的内网IP(仅同内网机器能访问),而非默认的0.0.0.0。

修改后的docker-compose.yaml示例:

version: "3.5"

services:
  Database:
    image: postgres
    container_name: Example-Production-Database
    # 绑定到本机回环地址,公网无法访问
    ports: [ "127.0.0.1:${DATABASE_PORT}:${DATABASE_PORT}" ]
    environment:
      - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
    volumes:
      # 注意:Postgres默认数据路径是/var/lib/postgresql/data,你原来的路径可能有误
      - DatabaseData:/var/lib/postgresql/data
    # 可选:额外限制Postgres仅监听容器内的localhost,双重保障
    command: ["postgres", "-c", "listen_addresses=localhost"]

volumes:
  DatabaseData: {}

如果需要内网其他机器访问,把127.0.0.1换成你的主机内网IP即可(比如192.168.1.100)。

2. 完全移除ports配置(仅Docker内部服务访问场景)

如果你的数据库只需要被Docker Compose中的其他服务访问(比如你的后端应用),直接删掉ports配置即可。Docker内部服务可以通过服务名(这里是Database)直接访问容器的默认端口5432,端口完全不暴露到主机,公网彻底无法触及。

示例配置:

version: "3.5"

services:
  Database:
    image: postgres
    container_name: Example-Production-Database
    environment:
      - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
    volumes:
      - DatabaseData:/var/lib/postgresql/data
    command: ["postgres", "-c", "listen_addresses=localhost"]

  # 示例:你的应用服务,通过服务名访问数据库
  AppService:
    image: your-app-image
    environment:
      - DB_HOST=Database
      - DB_PORT=5432
    depends_on:
      - Database

volumes:
  DatabaseData: {}

关键注意点

  • 优先选择移除ports配置的方案,这是安全性最高的,因为数据库端口完全不对外暴露。
  • 若必须暴露端口,绝对不要绑定0.0.0.0(默认行为),必须指定具体的安全IP。
  • 配合Postgres的listen_addresses配置,进一步限制数据库仅监听安全地址,形成双重防护。

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:30:20