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


101

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

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use

netstat -pna | grep 3000 显示如下:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

我已经尝试过了docker-compose down,但是没有帮助。


7
运行sudo netstat -pna | grep 3000以获取正在监听的过程。
BMitch

2
您的输出显示其他进程已经在侦听端口3000。您可以使用其他端口吗?尝试使用sudo以查看进程名称。
techtabu

是的,此端口上有ntop。谢谢!我不知道sudo可以改变输出:)
Ngoral

对我来说,端口8888是泊坞窗代理
Neil McGuigan

我在此答案中解决了相同的问题:stackoverflow.com/a/58772307/3530707
jmojico

Answers:


100

在您的情况下,使用该端口的是其他一些过程,并且如注释中所示,它sudo netstat -pna | grep 3000帮助您解决了问题。

在其他情况下(我本人也曾多次遇到),它大多是在其他情况下运行的同一容器。在那种情况下docker ps非常有帮助,因为我经常让相同的容器在其他目录中运行,然后尝试在其他使用相同容器名称的地方再次运行。

如何为docker ps我提供帮助:这 docker rm -f $(docker ps -aq)是一个简短的命令,可用于删除所有容器。

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


3
实际上,我经常遇到这个问题。没什么,但有docker-compose down帮助
Ngoral

如果您在运行目录的同一目录中运行它,那肯定会有所帮助docker-compose up。虽然我建议在我的答案中找到已经运行的容器并采取所需的措施。我觉得删除它们是适当的,如果有人不想删除它们,那么可以使用rmusestop来阻止它们。
Ayushya

1
我有另一台服务器将在tensorflow/tensorflow将要运行映像的同一端口上运行。如何设置映像以在其他端口中运行。我已经尝试过: docker run -it -d -p 8888:8000 tensorflow/tensorflow 我将端口8888从我的映像绑定到客户端上的8000,但是不起作用。
伊曼纽尔·芳特莱斯

1
@EmanuelFontelles尝试调试时,请勿使用-doption。现在,端口显示为HOST:CONTAINER。因此,您应该跑步docker run -it -p 8000:8888
Ayushya

66

这对我有帮助:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port

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

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


3
docker rm -fv $(docker ps -aq)这条线是我所需要的。谢谢
Ryan Walker

lsof的工作魅力,杀死进程,在行动回到....
鄂先生

13

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

UPD:注意-这也会删除您拉出的本地docker映像(来自comment


3
是的,它总是有帮助的,但这down是您通常要做的最后一件事。失去当前状态并非易事。
Ngoral

3
这也会删除您拉出的本地docker映像,因此请谨慎使用
Micah Simmons

您应该已经提到它将删除答案中的本地docker映像。
艾哈迈德·努尔·贾马尔·埃尔丁

8

对于Linux / Unix:

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

netstat -nlp | grep 8888

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

kill PID

netstat显示PID /程序(例如2714 / splunkd)。sudo kill 2714有效。谢谢。
罗伊


5

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

考虑遵循以下清单:

1)检查您当前的docker compose环境
Run docker-compose ps
如果端口被另一个容器使用,请用停止它,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

(*)您也可以使用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

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

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

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

5)您到了这一点,并且..
仅在不给系统带来风险的情况下,请考虑重新启动服务器。


4

就我而言

启动用户态代理时出错:监听tcp 0.0.0.0:9000:绑定:地址已在使用中

而我所需要做的就是关闭PHP Storm中的侦听侦听 图标


3

当我尝试启动新的伴奏时,出现以下错误-监听tcp 0.0.0.0:8080:bind:地址已在使用中。

解决方案: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)〜]#

杀死-9 12749

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


发现 !您的解决方案有所帮助。
Alferd Nobel

2

我今天下午升级了docker,遇到了同样的问题。我尝试重新启动docker,但是没有运气。

最后,我必须重新启动计算机,然后计算机才能正常工作。绝对是一个错误。


重新启动对我也有帮助。谢谢。
亚历山大

1

选中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"

0

我几次遇到相同的问题。重新启动docker似乎可以解决问题


我看到如何重新启动容器。如何重启Docker?
马克沃德



0

@DmitrySandalov的答案的一个变体:我的tomcat / java运行在8080上,需要继续下去。查看了docker-compose.yml文件,并将8080的条目更改为我选择的另一个。

nginx:
  build: nginx
  ports:
    #- '8080:80' <-- original entry
    - '8880:80'
    - '8443:443'

工作完美。(唯一的麻烦是,如果我更新了项目,更改将被删除,因为它来自外部存储库。)


0

如果您遇到同样的问题并且与Windows有关,请注意一下:

就我而言,我的过程是公正的grafana-server.exe。因为我首先下载了二进制版本并双击可执行文件,所以它现在作为用户的服务启动SYSTEM,我无法taskkill(未经许可)

我必须转到Windows的“服务管理器”并搜索服务“ Grafana”,然后将其停止。之后,端口3000将不再被占用。

希望能有所帮助。


0

使用端口8888的是Jupiter,我不得不更改Jupiter Notebook的配置文件才能在另一个端口上运行。

列出谁在使用该特定端口。须藤lsof -i -P -n | grep 9

您可以在〜/ .jupyter / jupyter_notebook_config.py中指定要让Jupyter运行的端口取消注释/编辑以下行:

c.NotebookApp.port = 9999

如果您没有jupyter_notebook_config.py,请尝试运行jupyter notebook --generate-config。有关Jupyter配置的更多详细信息,请参见此内容。


0

更改network_mode:从“桥”到“主机”为我做到了。

这与

version: '2.2'
services:
  bind:
    image: sameersbn/bind:latest
    dns: 127.0.0.1
    ports:
      - 172.17.42.1:53:53/udp
      - 172.17.42.1:10000:10000
    volumes:
        - "/srv/docker/bind:/data"
    environment:
      - 'ROOT_PASSWORD=secret'
    network_mode: "host"

0

在docker run -d --name oracle -p 1521:1521 -p 5500:5500 qa / oracle上运行之前,我刚刚将端口更改为docker run -d --name oracle -p 1522:1522 -p 5500: 5500质量/甲骨文

对我来说很好!


0

在我的机器上,此命令未显示正在netstat -tulpn使用的端口(8080)的PID ,因此我无法将其终止,终止容器并重新启动计算机无法正常工作。因此,service docker restart命令为我(ubuntu)重新启动了docker,并且该端口已不再使用,我很高兴能开始吃午饭。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.