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

Posted

技术标签:

【中文标题】Docker 错误绑定:地址已在使用中【英文标题】:Docker Error bind: address already in use 【发布时间】:2016-10-24 15:03:29 【问题描述】:

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

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,但是没有用。

【问题讨论】:

运行sudo netstat -pna | grep 3000 以获取正在监听的进程。 您的输出显示其他进程已经在侦听端口 3000。你可以使用其他端口吗?尝试使用sudo 来查看进程名称。 是的,这个端口上有 ntop。谢谢!我不知道sudo 可以改变输出:) 对我来说它是 8888 端口,它是 docker 代理 我在这个答案中修复了同样的问题:***.com/a/58772307/3530707 【参考方案1】:

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

虽然在其他情况下(我自己遇到过很多次),但它大多是在其他实例上运行的同一个容器。在那种情况下,docker ps 非常有帮助,因为我经常让相同的容器在其他目录中运行,然后尝试在使用相同容器名称的其他地方再次运行。

docker ps 如何帮助我:

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

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

【讨论】:

其实我经常遇到这个问题。什么都没有,但 docker-compose down 有帮助 这肯定会有所帮助,前提是您在运行 docker-compose up 的同一目录中运行它。虽然我建议在我的回答中找到已经在运行的容器并采取所需的操作。我觉得删除它们是合适的,如果有人不想删除,那么可以使用 rm 使用 stop 来阻止它们。 我有另一台服务器在运行tensorflow/tensorflow 图像的同一端口上运行。如何设置我的图像以在另一个端口中运行。我试过这个:docker run -it -d -p 8888:8000 tensorflow/tensorflow我将端口 8888 从我的图像绑定到客户端的 8000,但不工作。 @EmanuelFontelles 在尝试调试时,不要使用-d 选项。现在,端口公开为HOST:CONTAINER。因此你应该运行docker run -it -p 8000:8888【参考方案2】:

这对我有帮助:

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 &lt;process id&gt; (macOS) 或 sudo kill &lt;process id&gt; (Linux)。

来源:comment by user Rub21。

【讨论】:

docker rm -fv $(docker ps -aq) 这行是我所需要的。谢谢 lsof 发挥了作用,杀死了进程并重新开始行动...... 有趣的是,每次我杀死它时,它都会分配给另一个我觉得非常有线的端口。 sudo lsof -i -P -n | grep &lt;port number&gt; -> 这个足以在 OSX ty 上调试 :)【参考方案3】:

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

【讨论】:

这也是我的问题,我忘了我安装了 Apache FR:要停止 Apache 2 Web 服务器,请输入:# /etc/init.d/apache2 stop sudo service apache2 stop &amp;&amp; sudo service nginx stop 为我工作。 在更新/重启后不知何故启用了 apache。它正在监听 80 端口并阻止一个重要的容器运行。 Apache2 在我的机器上安装了 php8。重启后出现问题,当系统启动时自动启动 apache2。由于我在本地计算机上不需要它,我只是通过sudo apt remove apache2 将其删除。【参考方案4】:

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

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

【讨论】:

是的,它总是有帮助,但down 是您通常最不想做的事情。失去当前状态不是小菜一碟。 这也会删除你拉取的本地 docker 镜像,所以请谨慎使用 您应该已经提到它将删除答案中的本地 docker 图像。【参考方案5】:

对于 Linux/Unix:

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

netstat -nlp | grep 8888

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

kill PID

【讨论】:

netstat 显示 PID/程序(例如 2714/splunkd)。sudo kill 2714 工作。谢谢。【参考方案6】:

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

考虑遵循以下清单:

1) 检查你当前的 docker compose 环境 运行docker-compose ps。如果端口正在被另一个容器使用,请使用docker-compose stop &lt;service-name-in-compose-file&gt; 停止它,或者通过将stop 替换为rm 来删除它。

2) 检查在当前工作区之外运行的容器 运行 docker ps 以查看在您的主机下运行的所有容器的列表。 如果您发现该端口正在被另一个容器使用,您可以使用docker stop &lt;container-id&gt; 停止它。 (*) 因为您不在源 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)。

因此,如果PID 上方的输出为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 &lt;PID&gt; 以直观显示进程及其相关进程。

在我们的例子中,我们可以看到该进程可能是一个守护进程(PPID 为 1) - 在这种情况下,请考虑运行: A) $ cat /proc/&lt;PID&gt;/status 以获得有关该进程的更深入的信息,例如进程产生的线程数、其功能等。 B) $ systemctl status &lt;PID&gt; 以查看导致创建特定进程的systemd 单元。如果服务不重要 - 你可以stop and disable the service。

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

5) 你已经达到了这一点并且...... 仅当它不会使您的系统面临风险时 - 考虑重新启动服务器。

【讨论】:

【参考方案7】:

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

所以在尝试其他任何东西之前先试试这个单行:

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

【讨论】:

这对我有用,但是当 docker 容器正在运行时,我无法正确重启 apache2 @r34 这是预期的行为。您可以在主机操作系统上或通过 Docker 运行 apache2,但不能同时运行两者。 另一个尝试sudo httpd -k stop,因为我的 php 切换脚本为我重新启动了 apache...【参考方案8】:

在我的情况下是

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

我只需要在 php Storm 中关闭调试监听

【讨论】:

【参考方案9】:

我在尝试启动新容器时遇到以下错误 -

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

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

【讨论】:

看准了!您的解决方案有所帮助。【参考方案10】:

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

最后,我不得不重新启动我的电脑,它工作。绝对是一个错误。

【讨论】:

重启对我也有帮助。谢谢。【参考方案11】:

将 network_mode: "bridge" 更改为 "host" 为我做了。

这与

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"

【讨论】:

【参考方案12】:

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

【讨论】:

我知道如何重新启动容器。如何重启docker? sudo systemctl restart docker ,安装firewalld后出现同样的问题【参考方案13】:

检查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"

【讨论】:

这个对我有用,我碰巧重复了我的 docker-compose.yml 中的端口【参考方案14】:

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

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

完美运行。 (唯一的问题是,如果我更新项目,更改将被删除,因为它来自外部存储库。)

【讨论】:

确保注释或删除使用端口的那行代码,否则它将继续尝试使用该端口。【参考方案15】:

首先,确保which service you are running 在您的特定端口中。在您的情况下,您已经在使用端口号 3000。

netstat -aof | findstr :3000

现在 stop that process 在特定端口上运行

lsof -i tcp:3000

【讨论】:

【参考方案16】:

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

sudo /etc/init.d/apache2 stop

【讨论】:

【参考方案17】:

我通过重启 Docker 解决了这个问题。

【讨论】:

【参考方案18】:

更改 docker update 的端口比关闭其他使用端口 80 的服务更有意义。

【讨论】:

【参考方案19】:

如果redis服务器作为服务启动,当你使用kill -9 &lt;process_id&gt;sudo kill -9 `sudo lsof -t -i:&lt;port_number&gt;` 时它会自行重启。在这种情况下,您需要使用以下命令停止 redis 服务。

sudo service redis-server stop

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。【参考方案20】:

如果您遇到同样的问题并且使用的是 Windows,请注意:

就我而言,我的过程只是grafana-server.exe。因为我首先下载了二进制版本并双击可执行文件,现在它由用户SYSTEM 作为服务启动,我不能taskkill(无权限)

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

希望对您有所帮助。

【讨论】:

【参考方案21】:

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

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

您可以指定希望 Jupyter 运行的端口,取消注释/编辑 ~/.jupyter/jupyter_notebook_config.py 中的以下行:

c.NotebookApp.port = 9999

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

【讨论】:

【参考方案22】:

在它运行之前:docker run -d --name oracle -p 1521:1521 -p 5500:5500 qa/oracle 我只是将端口更改为 docker run -d --name oracle -p 1522:1522 -p 5500:5500 qa/oracle

对我来说效果很好!

【讨论】:

【参考方案23】:

在我的机器上,这个命令netstat -tulpn 没有为正在使用的端口(8080)显示 PID,所以我无法杀死它,杀死容器并重新启动计算机不起作用。所以service docker restart 命令为我(ubuntu)重新启动了 docker,端口不再使用,我很开心,去吃午饭了。

【讨论】:

【参考方案24】:

也许这太粗鲁了,但对我有用。重启 docker 服务本身

sudo service docker restart

希望它也对你有用!

【讨论】:

【参考方案25】:

我已经使用另一个端口运行容器,例如... 8082 :-)

【讨论】:

【参考方案26】:

我遇到了这个问题。我的简单解决方案是从系统中删除 mongodb

在 Ubuntu 中删除 mongodb 的命令:

sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev

sudo apt-get purge mongodb-10gen 

sudo apt-get autoremove

【讨论】:

【参考方案27】:

让我再添加一个案例,因为我遇到了同样的错误,并且到目前为止列出的解决方案都不起作用:

serv1:
  ...
  networks:
  privnet:
    ipv4_address: 10.10.100.2
  ...

serv2:
  ...
  # no IP assignment, no dependencies
  
networks:
  privnet:
    ipam:
      driver: default
      config:
        - subnet: 10.10.100.0/24

根据初始化顺序,serv2 可能会在 serv1 启动之前被分配 IP 10.10.100.2,所以我只是为所有容器手动分配 IP 以避免错误。也许还有其他更优雅的方式。

【讨论】:

【参考方案28】:

我有同样的问题,通过停止 docker container 解决了。

sudo docker container stop <container-name>

【讨论】:

以上是关于Docker 错误绑定:地址已在使用中的主要内容,如果未能解决你的问题,请参考以下文章

例外:Network.Socket.bind:docker 中的资源繁忙(地址已在使用中)

来自守护进程的 Docker 错误响应:“冲突……容器已在使用”

Apache 错误:地址已在使用中:make_sock:无法绑定到地址 [::]:443

收到此错误:java.net.BindException:地址已在使用中:无法绑定

错误:在将套接字与地址绑定时地址已在使用中,但端口号由“netstat”免费显示

如何修复错误原因:java.net.BindException:地址已在使用:在 Quarkus 中绑定?