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

