如何仅通过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
相关产品推荐
相关产品推荐

