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

Docker Compose启动Postgres容器5432端口被占用的解决方法

问题根因

报错由端口绑定冲突导致:当前配置的端口映射规则是将宿主机0.0.0.0:5432绑定到容器内部的5432端口,但宿主机的5432端口已经被本地运行的PostgreSQL业务服务占用,Docker的userland代理无法监听该端口,因此容器启动失败。
容器内部运行的PostgreSQL服务默认监听5432端口无需修改,仅调整端口映射规则即可解决问题。

调整方案

根据业务访问需求二选一即可:

方案1:无需从宿主机/外部网络直连容器数据库

如果这个PostgreSQL容器只需要给同一个docker-compose网络内的其他业务容器提供服务,直接删除配置里的ports段即可。同网络内的其他容器可以直接通过服务名db:5432访问数据库,完全不会占用宿主机端口,也就不存在冲突问题。
修改后的核心配置参考:

services:
  db:
    image: postgres:10.0
    environment:
      - POSTGRES_USER=${CTR_DB_USER}
      - POSTGRES_PASSWORD=${CTR_DB_PASSWORD}
      - POSTGRES_DB=${CTR_DB_NAME}
    volumes:
      - postgres10-ctr-data:/var/lib/postgresql/data
    # 移除ports配置段

方案2:需要从宿主机/外部网络直连容器数据库

如果需要直接从宿主机或者外部访问这个容器的数据库,保留端口映射配置,仅将宿主机侧的端口修改为当前未被占用的端口即可(比如5433、15432这类未被使用的端口)。

注意:Docker端口映射规则为 宿主机端口:容器内部端口,冒号后面对应容器内部的5432端口不要修改,只需要改冒号前面的宿主机端口。

修改后的核心配置参考(以宿主机映射端口设为15432为例):

services:
  db:
    image: postgres:10.0
    environment:
      - POSTGRES_USER=${CTR_DB_USER}
      - POSTGRES_PASSWORD=${CTR_DB_PASSWORD}
      - POSTGRES_DB=${CTR_DB_NAME}
    volumes:
      - postgres10-ctr-data:/var/lib/postgresql/data
    ports:
      - "15432:5432"

选定端口前可以先执行ss -tulpn | grep 你准备使用的端口号,确认无输出再使用,避免再次出现端口冲突。

生效操作

配置修改完成后,在docker-compose.yml所在目录执行以下命令重新创建启动容器即可:

docker-compose up -d

如果使用方案2修改了宿主机映射端口,后续连接这个容器数据库时,端口要填写你设置的宿主机端口(比如示例中的15432),不要填默认的5432。


内容的提问来源于stack exchange,提问作者Dino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:48:10