Docker和Postgres:无法绑定tcp 0.0.0.0:5432,地址已在使用中。

117

问题

我在Mac上尝试在docker容器中启动postgres,但是我一直收到以下错误信息:

docker: 从守护进程返回的错误响应:driver failed programming external connectivity on endpoint postgres (8392b9e5cfaa28f480fe1009dee461f97e82499726f4afc4e916358dd2d2f61e): Error starting userland proxy: Failed to bind tcp 0.0.0.0:5432 address already in use.

我已经在本地安装了postgres,但我已经停止它运行。

pg_ctl status

返回

pg_ctl: 未运行服务器

我运行了以下命令来检查5432端口的运行情况

lsof -i tcp:5432

&

netstat -anp tcp | grep 5432

端口上没有运行任何内容。

版本

Mac - OS X El Capitan Version 10.11.2

PostgreSQL - 9.5

Docker - Docker version 1.12.0-rc2, build 906eacd, experimental


一样的问题。在本地工作正常,但在Travis CI上失败。我正在使用1.11.2和Compose 1.7.1。 - erikdstock
11个回答

141
如果你使用 lsof -i :5432 没有任何输出,你可以使用 sudo ss -lptn 'sport = :5432' 查看绑定到端口的进程是什么。
然后, 继续使用 kill <pid>

24
我运行这个命令时收到了“sudo: ss: command not found” 的错误提示,你有任何想法是什么原因导致的? - phenderbender
4
看起来系统范围内的Postgres服务正在该端口运行。我们首先要终止它,然后允许docker-compose占用该端口。 - Anton Semenichenko
1
使用以下命令获取进程:sudo lsof -i :5432 - Prateek Kumar Dalbehera
19
对我有效的方法是运行 sudo lsof -i :5432,然后使用 kill <pid> 来终止进程。 - kevin_theinfinityfund
在 macOS 中,您需要使用 kill -9 pid 命令。 - Tanjin Alam
显示剩余3条评论

58
如果您在主机上执行lsof -i:5432,您可以看到哪个进程绑定到该端口。

某个Postgres实例正在运行。如果您想要杀死它,可以执行kill <pid>。您还可以在docker命令或docker-compose文件中使用5432而不是5432: 5432 ,并让docker自动选择主机端口。


嗨,这个问题有点老了,但我尝试了您的建议,将docker-compose.yml文件中的5432:5432更改为只有5432。但它仍然给出相同的错误。 - Baktaawar
22
你有执行 sudo lsof -i :5432 的输出吗? - blockloop
那件事已经解决了。你能帮忙解决这个问题吗?https://stackoverflow.com/questions/55109965/superset-loading-issue-on-ubuntu - Baktaawar
@blockloop 是的,我看到一个进程号为144的PostgreSQL进程正在运行。 - Adarsha Jha
2
运行sudo lsof -i:5432命令,然后运行kill <PID>命令。 - zdravko zdravkin
需要以超级用户身份运行该命令。 - Caco

45

首先要做的是停止 PostgreSQL 服务。在大多数情况下,这可以解决问题。

sudo service postgresql stop
如果上述方法不起作用,则将以下行添加到/etc/postgresql/12/main/postgresql.conf文件中。
sudo vim /etc/postgresql/12/main/postgresql.conf

## good if you add under CONNECTION AND AUTHENTICATION comments
listen_addresses = "*"

34

macOS Monterey

以上命令都无法正常工作-需要进行一些更改。因此,提供完整的解决方案:

  1. 确定运行在5432端口上的进程:sudo lsof -i :5432

  2. 结束运行在该端口下的所有进程:sudo kill -9 <pid>

  3. 再次运行命令以验证现在没有任何进程正在运行:sudo lsof -i :5432

输入图像描述


10

这对我来说有效,也许你应该停止Postgres:

sudo systemctl stop postgresql


2
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

3

这些其他答案对我都没有用。(例如,lsof和netstat只返回空行。) 但是以下方法有效:

sudo -u postgres pg_ctl -D /Library/PostgreSQL/13/data stop

3
使用Mac OS iTerm时,我得到了这个响应:sudo: pg_ctl: command not found - kafinsalim
可能需要将13更改为您的Postgres版本,但这在我的Mac上有效。 - Michael Eliot

3
在有些情况下,在停止或杀死容器/进程之前,更深入地调试问题非常关键。
考虑遵循以下检查清单:
1)检查当前的docker-compose环境
运行docker-compose ps。如果端口被另一个容器使用,请使用docker-compose stop <service-name-in-compose-file>停止它或用rm替换stop来删除它。
2)检查在当前工作空间之外运行的容器
运行docker ps以查看在您的主机下运行的所有容器列表。如果发现该端口被另一个容器使用,可以使用docker stop <container-id>停止它。
(*) 因为您不在原始的compose环境范围内,所以最好先使用docker inspect收集有关要停止的容器的更多信息。

3) 检查端口是否被主机上运行的其他进程使用
例如,如果端口是6379,请运行以下命令:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) 您还可以使用lsof命令,该命令主要用于检索各种进程打开的文件信息(我建议在此之前运行netstat)。

因此,在上面的输出中,PID915。现在您可以运行:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

查看父进程ID (PPID) 和执行命令。
您也可以运行: $ pstree -s <PID> 以可视化显示进程及其相关进程 (使用brew install pstree安装)。
在我们的情况下,我们可以看到该进程可能是一个守护进程 (PPID为1) - 在这种情况下,考虑运行:
A) $ cat /proc/<PID>/status 以获取有关进程的更详细信息,例如进程生成的线程数、其功能等。
B) $ systemctl status <PID> 以查看引起特定进程创建的单元。如果服务不是关键的 - 您可以停止并禁用该服务

4) 重新启动Docker服务
运行sudo service docker restart

5) 您已经到达这个步骤并且..
只有在不会危及您的系统的情况下,考虑重新启动服务器。


2

如果您使用的是Mac电脑,

  • 如果您暂时可以卸载POSTGRES:
brew uninstall postgres

然后检查进程是否仍在运行。

sudo lsof -nP -i4TCP:5432 | grep LISTEN

如果它存在,就杀掉它

kill -9 <pid>

再次检查是否正在监听5432端口,这次不应该有监听。


2

这个命令行非常简单易记,使用第三方 JavaScript 包。npx 已集成在 Node.js 中:

npx kill-port 3000

如果需要更强大的搜索工具:

npx fkill-cli

1
前往项目并点击docker-compose.yml文件。
version: '2'

服务: 网络: 构建:. 端口: -“8000:8000” 卷: -.:/应用程序 链接: -db -mail-server 数据库: 图像:“postgres” 环境: POSTGRES_PASSWORD:hunter2 端口: -“5432:9432” 邮件服务器: 图像:“mailhog/mailhog” 公开: -1025 端口: -“8026:8026”

“将端口更改为8026:8026,因为该端口号上已经运行了另一个容器,只需更改端口号即可”


1
请在您的docker-compose文件中更改端口号,因为您正在运行另一个端口。运行以下命令:"docker-compose up --build"。 - Shah E Rome Wali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接