Docker错误绑定:已在使用的地址

Ngo*_*ral 42 ubuntu bind docker ubuntu-14.04 docker-compose

当我docker-compose up在我的Docker项目中运行时,它会失败并显示以下消息:

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use
Run Code Online (Sandbox Code Playgroud)

netstat -pna | grep 3000 显示这个:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  
Run Code Online (Sandbox Code Playgroud)

我已经尝试过docker-compose down,但它没有帮助.

Bal*_*yan 66

您可以使用以下一个命令轻松终止侦听该端口的进程:

\n
kill -9 $(lsof -t -i tcp:<port#>)\n
Run Code Online (Sandbox Code Playgroud)\n

前任 :

\n
\n

kill -9 $(lsof -t -i tcp:<port#>)

\n
\n

或者对于 ubuntu:

\n
\n

sudo kill -9 `sudo lsof -t -i:8000`

\n
\n

lsof 的手册页:https ://man7.org/linux/man-pages/man8/lsof.8.html

\n

-9 表示硬杀,不检查任何部门。

\n
\n

(不相关,但如果其 PORT 5000 之谜可能会很有用) - 罪魁祸首是 Mac OS monterery。

\n

端口 5000 通常用于为本地开发服务器提供服务。当更新到最新的 macOS 操作系统时,我无法将 docker 绑定到端口 5000,因为它已被使用。(您可能会发现一条类似于端口 5000 已在使用中的消息。)

\n

通过运行 lsof -i :5000,我发现使用该端口的进程名为ControlCenter,这是一个本机 macOS 应用程序。如果这种情况发生在您身上,即使您使用强力(并杀死)应用程序,它也会自行重新启动。在我的笔记本电脑中,lsof -i :5000 返回控制中心正在被进程 id 433 使用。我可以执行killall -p 433,但 macOS 不断重新启动该进程。

\n

在此端口上运行的进程是一个 AirPlay 服务器。您可以在以下位置停用它

\n

系统偏好设置\xe2\x80\xba共享,并取消选中AirPlay接收器以释放端口5000。

\n

  • 对于 Mac 用户来说,这是最好的答案,包括像我这样的 M1 芯片。 (13认同)
  • 哇,5000 的成绩真好! (4认同)

Ayu*_*hya 40

在您的情况下,正是使用该端口的其他一些进程,如评论中所示,sudo netstat -pna | grep 3000帮助您解决问题.

而在其他情况下(我自己多次遇到它),它主要是在其他一些实例上运行的同一个容器.在这种情况下docker ps非常有用,因为我经常在其他目录中运行相同的容器,然后尝试在其他地方再次运行,其中使用了相同的容器名称.

怎么docker ps帮助我: docker rm -f $(docker ps -aq)是一个简短的命令,我用它来删除所有容器.

编辑:添加了如何docker ps帮助我.

  • 实际上,我经常遇到这个问题。没什么,但是`docker-compose down`可以帮助 (2认同)

小智 27

我有同样的问题。我通过停止主机上的 Apache2 服务解决了这个问题。

  • 这也是我的问题,我忘了我安装了 Apache (4认同)
  • `sudo service apache2 stop &amp;&amp; sudo service nginx stop`对我有用。 (3认同)

Lyt*_*les 16

我有同样的问题, docker-compose down --rmi all(在你运行 docker-compose up 的同一目录中)有帮助

UPD:注意 - 这也将删除您提取的本地 docker 图像(来自评论

  • 是的,它总是有帮助,但是“向下”是您通常最不想做的事情。失去目前的状态不是一块糖。 (4认同)
  • 这也会删除您拉取的本地 docker 镜像,因此请谨慎使用 (4认同)

Tom*_*iak 14

这对我有帮助:

docker-compose down
docker rm -fv $(docker ps -aq)
sudo lsof -i -P -n | grep <port number>
Run Code Online (Sandbox Code Playgroud)

然后: kill -9 <process id>(macOS)或sudo kill <process id>(Linux)。

资料来源:用户Rub21发表的评论

  • `sudo lsof -i -P -n | sudo lsof -i -P -n | grep &lt;端口号&gt;` -&gt; 这个足以在 OSX ty 上调试:) (6认同)
  • 对于 macOS,最后一步应该是 google 首先处理 =) 这是我的情况 https://developer.apple.com/forums/thread/682332 (4认同)
  • `docker rm -fv $(docker ps -aq)` 这行就是我所需要的。谢谢 (3认同)
  • 有趣的是,每次我杀死它时,它都会分配到另一个我发现非常有线的端口。 (3认同)
  • lsof 发挥了作用,杀死了进程并重新开始行动...... (2认同)

Nee*_*sal 12

对于 Linux/Unix:

使用以下命令简单搜索 linux 实用程序

netstat -nlp | grep 8888
Run Code Online (Sandbox Code Playgroud)

它将显示在此端口上运行的处理,然后使用该进程的 PID(在行中查找 PID)终止该进程。

kill PID
Run Code Online (Sandbox Code Playgroud)


Zek*_*rpo 12

我的 ubuntu 机器上运行着 apache。我用这个命令杀死了它!

sudo /etc/init.d/apache2 stop
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,但我使用“sudo service apache2 stop”来解决问题。 (3认同)

Ily*_*ich 11

这很可能是因为您已经在主机操作系统上运行 Web 服务器,因此它与 Docker 尝试启动的 Web 服务器发生冲突。

因此,在尝试其他方法之前先尝试一下这一行:

sudo service apache2 stop; sudo service nginx stop; sudo nginx -s stop;


小智 9

如果 redis 服务器作为服务启动,则当您使用kill -9 <process_id>或时,它将自行重新启动sudo kill -9 `sudo lsof -t -i:<port_number>` 。在这种情况下,您需要使用以下命令停止 redis 服务。

sudo service redis-server stop


Rtm*_*tmY 9

在某些情况下,在停止容器或终止进程之前对问题执行更深入的调试至关重要。

考虑遵循以下清单:

1)检查您当前的 docker compose 环境
Run docker-compose ps
如果 port 正在被另一个容器使用,请使用docker-compose stop <service-name-in-compose-file>将其停止或将其替换stoprm

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
Run Code Online (Sandbox Code Playgroud)

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

因此,如果输出高于PIDis 915。现在你可以运行:

$ 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
Run Code Online (Sandbox Code Playgroud)

并查看父进程的 ID ( PPID) 和执行命令。
您还可以运行:$ pstree -s <PID>以可视化显示进程及其相关进程。

在我们的例子中,我们可以看到该进程可能是一个守护进程(PPID 为 1) - 在这种情况下,请考虑运行:
A)$ cat /proc/<PID>/status以获得有关该进程的更深入信息,例如该进程产生的线程数,它的能力等'。
B)$ systemctl status <PID>为了查看导致创建特定进程的单元。如果服务不是关键的 - 您可以停止并禁用该服务

4)重新启动码头工人服务
运行:sudo service docker restart

5)您已经达到了这一点,并且..
仅当它不会将您的系统置于危险之中时 - 考虑重新启动服务器。


小智 7

当我尝试启动新容器时,出现以下错误 -

listen tcp 0.0.0.0:8080: bind: address already in use.

要检查端口上正在运行哪个进程8080,请运行以下命令:

netstat -tulnp | grep 8080

我得到下面的输出

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~]# netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN **12749**/java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~]#

跑步

kill -9 12749

然后尝试重新启动它应该可以工作的容器


小智 6

就我而言,它是

启动用户空间代理时出错:listen tcp 0.0.0.0:9000: bind: address already in use

而我所需要的只是关闭 phpstorm 中的调试监听 图标


Dmi*_*lov 5

检查一下docker-compose.yml,有可能是端口指定了两次。

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"
Run Code Online (Sandbox Code Playgroud)